cd_misc.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:3k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)cd_misc.c 1.6 98/10/09 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)cd_misc.c 1.6 98/10/09 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  * Misc CD support routines
  8.  *
  9.  * Copyright (c) 1997 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26. #include <mconfig.h>
  27. #include <standard.h>
  28. #include <sys/types.h> /* for caddr_t */
  29. #include <utypes.h>
  30. #include "cdrecord.h"
  31. EXPORT int from_bcd __PR((int b));
  32. EXPORT int to_bcd __PR((int i));
  33. EXPORT long msf_to_lba __PR((int m, int s, int f));
  34. EXPORT BOOL lba_to_msf __PR((long lba, msf_t *mp));
  35. EXPORT void print_min_atip __PR((long li, long lo));
  36. EXPORT int
  37. from_bcd(b)
  38. int b;
  39. {
  40. return ((b & 0x0F) + 10 * (((b)>> 4) & 0x0F));
  41. }
  42. EXPORT int
  43. to_bcd(i)
  44. int i;
  45. {
  46. return (i % 10 | ((i / 10) % 10) << 4);
  47. }
  48. EXPORT long
  49. msf_to_lba(m, s, f)
  50. int m;
  51. int s;
  52. int f;
  53. {
  54. long ret = m * 60 + s;
  55. ret *= 75;
  56. ret += f;
  57. if (m < 90)
  58. ret -= 150;
  59. else
  60. ret -= 450150;
  61. return (ret);
  62. }
  63. EXPORT BOOL
  64. lba_to_msf(lba, mp)
  65. long lba;
  66. msf_t *mp;
  67. {
  68. int m;
  69. int s;
  70. int f;
  71. if (lba >= -150 && lba < 405000) { /* lba <= 404849 */
  72. m = (lba + 150) / 60 / 75;
  73. s = (lba + 150 - m*60*75)  / 75;
  74. f = (lba + 150 - m*60*75 - s*75);
  75. } else if (lba >= -45150 && lba <= -151) {
  76. m = (lba + 450150) / 60 / 75;
  77. s = (lba + 450150 - m*60*75)  / 75;
  78. f = (lba + 450150 - m*60*75 - s*75);
  79. } else {
  80. mp->msf_min   = -1;
  81. mp->msf_sec   = -1;
  82. mp->msf_frame = -1;
  83. return (FALSE);
  84. }
  85. mp->msf_min   = m;
  86. mp->msf_sec   = s;
  87. mp->msf_frame = f;
  88. if (lba > 404849) /* 404850 -> 404999: lead out */
  89. return (FALSE);
  90. return (TRUE);
  91. }
  92. EXPORT void
  93. print_min_atip(li, lo)
  94. long li;
  95. long lo;
  96. {
  97. msf_t msf;
  98. if (li < 0) {
  99. lba_to_msf(li, &msf);
  100. printf("  ATIP start of lead in:  %ld (%02d:%02d/%02d)n",
  101. li, msf.msf_min, msf.msf_sec, msf.msf_frame);
  102. }
  103. if (lo > 0) {
  104. lba_to_msf(lo, &msf);
  105. printf("  ATIP start of lead out: %ld (%02d:%02d/%02d)n",
  106. lo, msf.msf_min, msf.msf_sec, msf.msf_frame);
  107. }
  108. }