bin/55546: cdcontrol(1) play tr m:s.f interface is partially
broken
Alexander Best
arundel at freebsd.org
Sun Mar 20 20:40:03 UTC 2011
The following reply was made to PR bin/55546; it has been noted by GNATS.
From: Alexander Best <arundel at freebsd.org>
To: bug-followup at freebsd.org
Cc:
Subject: Re: bin/55546: cdcontrol(1) play tr m:s.f interface is partially broken
Date: Sun, 20 Mar 2011 20:39:06 +0000
--82I3+IH0IqGh5yIs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
this issue is still present in 9.0 (r219727).
i've attached the patch again, because the initial patch didn't apply cleanly,
due to several changes made to cdcontrol since 2003 (year the initial patch was
submitted).
it would be nice somebody can take a look at this patch after all these years.
cheers.
alex
--
a13x
--82I3+IH0IqGh5yIs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="cdcontrol.patch"
diff --git a/usr.sbin/cdcontrol/cdcontrol.c b/usr.sbin/cdcontrol/cdcontrol.c
index 526f599..e001c74 100644
--- a/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 <tatsuki_makino at hotmail.com>
+ * Fixed an ability to specify addresses relative to the
+ * beginning of a track.
+ * Version 2.0.3
+ *
*/
#include <sys/cdefs.h>
@@ -52,7 +57,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <vis.h>
-#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",
--82I3+IH0IqGh5yIs--
More information about the freebsd-bugs
mailing list