--- b/usr.sbin/cdcontrol/cdcontrol.c +++ b/usr.sbin/cdcontrol/cdcontrol.c @@ -29,6 +29,11 @@ * the uchar storing the volume (256 -> 0, -20 -> 236, ...). * Version 2.0.2 * + * 03-Feb-2011 Tatsuki Makino + * Fixed an ability to specify addresses relative to the + * beginning of a track. + * Version 2.0.3 + * */ #include @@ -52,7 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include -#define VERSION "2.0.2" +#define VERSION "2.0.3" #define ASTS_INVALID 0x00 /* Audio status byte not valid */ #define ASTS_PLAYING 0x11 /* Audio play operation in progress */ @@ -523,6 +528,7 @@ int play (char *arg) unsigned tr1, tr2; unsigned m1, m2, s1, s2, f1, f2; unsigned char tm, ts, tf; + unsigned int lba1, lba2, tlba; tr2 = m2 = s2 = f2 = f1 = 0; if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d", @@ -589,118 +595,108 @@ int play (char *arg) goto Try_Absolute_Timed_Addresses; Play_Relative_Addresses: - if (! tr1) + if (!tr1) { tr1 = 1; - else if (tr1 > n) + } else if (tr1 > n) { tr1 = n; + } + --tr1; - tr1--; - + /* + * XXX: need check tr1 == toc_buffer[tr1].track ? + */ if (msf) { tm = toc_buffer[tr1].addr.msf.minute; ts = toc_buffer[tr1].addr.msf.second; tf = toc_buffer[tr1].addr.msf.frame; - } else - lba2msf(ntohl(toc_buffer[tr1].addr.lba), - &tm, &ts, &tf); - if ((m1 > tm) - || ((m1 == tm) - && ((s1 > ts) - || ((s1 == ts) - && (f1 > tf))))) { - printf ("Track %d is not that long.\n", tr1); - return (0); + tlba = msf2lba(tm, ts, tf); + } else { + tlba = ntohl(toc_buffer[tr1].addr.lba); } - f1 += tf; - if (f1 >= 75) { - s1 += f1 / 75; - f1 %= 75; - } + lba1 = msf2lba((u_char)m1, (u_char)s1, (u_char)f1) + 150 + tlba; - s1 += ts; - if (s1 >= 60) { - m1 += s1 / 60; - s1 %= 60; + if (lba1 < tlba) { + printf("Track %d is not that long.\n", tr1 + 1); + return 0; } - m1 += tm; - - if (! tr2) { - if (m2 || s2 || f2) { - tr2 = tr1; - f2 += f1; - if (f2 >= 75) { - s2 += f2 / 75; - f2 %= 75; - } - - s2 += s1; - if (s2 > 60) { - m2 += s2 / 60; - s2 %= 60; - } + if (msf) { + tm = toc_buffer[tr1 + 1].addr.msf.minute; + ts = toc_buffer[tr1 + 1].addr.msf.second; + tf = toc_buffer[tr1 + 1].addr.msf.frame; + tlba = msf2lba(tm, ts, tf); + } else { + tlba = ntohl(toc_buffer[tr1 + 1].addr.lba); + } - m2 += m1; + if (lba1 > tlba) { + if ((tr1 + 1) == n) { + printf("The playing time of the disc is not that long.\n"); } else { - tr2 = n; - if (msf) { - m2 = toc_buffer[n].addr.msf.minute; - s2 = toc_buffer[n].addr.msf.second; - f2 = toc_buffer[n].addr.msf.frame; - } else { - lba2msf(ntohl(toc_buffer[n].addr.lba), - &tm, &ts, &tf); - m2 = tm; - s2 = ts; - f2 = tf; - } + printf("Track %d is not that long.\n", tr1 + 1); } + return 0; + } + + if (!tr2) { + tr2 = tr1 + 1; } else if (tr2 > n) { tr2 = n; - m2 = s2 = f2 = 0; + } + --tr2; + + if (msf) { + tm = toc_buffer[tr2].addr.msf.minute; + ts = toc_buffer[tr2].addr.msf.second; + tf = toc_buffer[tr2].addr.msf.frame; + tlba = msf2lba(tm, ts, tf); } else { - if (m2 || s2 || f2) - tr2--; - if (msf) { - tm = toc_buffer[tr2].addr.msf.minute; - ts = toc_buffer[tr2].addr.msf.second; - tf = toc_buffer[tr2].addr.msf.frame; - } else - lba2msf(ntohl(toc_buffer[tr2].addr.lba), - &tm, &ts, &tf); - f2 += tf; - if (f2 >= 75) { - s2 += f2 / 75; - f2 %= 75; - } + tlba = ntohl(toc_buffer[tr2].addr.lba); + } - s2 += ts; - if (s2 > 60) { - m2 += s2 / 60; - s2 %= 60; - } + if (m2 || s2 || f2) { + lba2 = msf2lba((u_char)m2, (u_char)s2, (u_char)f2) + 150 + tlba; + } else if (msf) { + tm = toc_buffer[tr2 + 1].addr.msf.minute; + ts = toc_buffer[tr2 + 1].addr.msf.second; + tf = toc_buffer[tr2 + 1].addr.msf.frame; + lba2 = msf2lba(tm, ts, tf); + } else { + lba2 = ntohl(toc_buffer[tr2 + 1].addr.lba); + } - m2 += tm; + if (lba2 < tlba) { + printf("Track %d is not that long.\n", tr2 + 1); + return 0; } if (msf) { - tm = toc_buffer[n].addr.msf.minute; - ts = toc_buffer[n].addr.msf.second; - tf = toc_buffer[n].addr.msf.frame; - } else - lba2msf(ntohl(toc_buffer[n].addr.lba), - &tm, &ts, &tf); - if ((tr2 < n) - && ((m2 > tm) - || ((m2 == tm) - && ((s2 > ts) - || ((s2 == ts) - && (f2 > tf)))))) { - printf ("The playing time of the disc is not that long.\n"); - return (0); + tm = toc_buffer[tr2 + 1].addr.msf.minute; + ts = toc_buffer[tr2 + 1].addr.msf.second; + tf = toc_buffer[tr2 + 1].addr.msf.frame; + tlba = msf2lba(tm, ts, tf); + } else { + tlba = ntohl(toc_buffer[tr2 + 1].addr.lba); } - return (play_msf (m1, s1, f1, m2, s2, f2)); + + if (lba2 > tlba) { + if ((tr2 + 1) == n) { + printf("The playing time of the disc is not that long.\n"); + } else { + printf("Track %d is not that long.\n", tr2 + 1); + } + return 0; + } + + if (lba1 > lba2) { + /* swap */ + lba1 ^= lba2; + lba2 ^= lba1; + lba1 ^= lba2; + } + + return play_blocks(lba1, lba2 - lba1); Try_Absolute_Timed_Addresses: if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d",