FreeBSD Bugzilla – Attachment 34121 Details for
Bug 55546
[patch] cdcontrol(1) play tr m:s.f interface is partially broken
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
cdcontrol.patch
cdcontrol.patch (text/plain; charset=us-ascii), 5.30 KB, created by
Alexander Best
on 2011-03-20 20:39:06 UTC
(
hide
)
Description:
cdcontrol.patch
Filename:
MIME Type:
Creator:
Alexander Best
Created:
2011-03-20 20:39:06 UTC
Size:
5.30 KB
patch
obsolete
>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@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",
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 55546
:
34120
| 34121