[BACK]Return to cdio.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / cdio

Diff for /src/usr.bin/cdio/cdio.c between version 1.46 and 1.47

version 1.46, 2006/01/11 01:29:07 version 1.47, 2006/01/20 00:58:32
Line 117 
Line 117 
 { CMD_INFO,     "info",         1, "" },  { CMD_INFO,     "info",         1, "" },
 { CMD_NEXT,     "next",         1, "" },  { CMD_NEXT,     "next",         1, "" },
 { CMD_PAUSE,    "pause",        2, "" },  { CMD_PAUSE,    "pause",        2, "" },
 { CMD_PLAY,     "play",         1, "min1:sec1[.fram1] [min2:sec2[.fram2]]" },  
 { CMD_PLAY,     "play",         1, "track1[.index1] [track2[.index2]]" },  { CMD_PLAY,     "play",         1, "track1[.index1] [track2[.index2]]" },
 { CMD_PLAY,     "play",         1, "tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]]" },  { CMD_PLAY,     "play",         1, "[tr1] m1:s1[.f1] [tr2] [m2:s2[.f2]]" },
 { CMD_PLAY,     "play",         1, "[#block [len]]" },  { CMD_PLAY,     "play",         1, "[#block [len]]" },
 { CMD_PREV,     "previous",     2, "" },  { CMD_PREV,     "previous",     2, "" },
 { CMD_QUIT,     "quit",         1, "" },  { CMD_QUIT,     "quit",         1, "" },
Line 471 
Line 470 
                 if (!strncasecmp(arg, "mute", strlen(arg)))                  if (!strncasecmp(arg, "mute", strlen(arg)))
                         return ioctl(fd, CDIOCSETMUTE);                          return ioctl(fd, CDIOCSETMUTE);
   
                 if (2 != sscanf(arg, "%d %d", &l, &r)) {                  if (2 != sscanf(arg, "%d%d", &l, &r)) {
                         printf("%s: Invalid command arguments\n", __progname);                          printf("%s: Invalid command arguments\n", __progname);
                         return (0);                          return (0);
                 }                  }
Line 507 
Line 506 
 play(char *arg)  play(char *arg)
 {  {
         struct ioc_toc_header h;          struct ioc_toc_header h;
         int rc, n, start, end = 0, istart = 1, iend = 1;          unsigned char tm, ts, tf;
           unsigned int tr1, tr2, m1, m2, s1, s2, f1, f2, i1, i2;
           unsigned int blk, len, n;
           char c;
           int rc;
   
         rc = ioctl(fd, CDIOREADTOCHEADER, &h);          rc = ioctl(fd, CDIOREADTOCHEADER, &h);
   
         if (rc < 0)          if (rc < 0)
                 return (rc);                  return (rc);
   
           if (h.starting_track > h.ending_track) {
                   printf("TOC starting_track > TOC ending_track\n");
                   return (0);
           }
   
         n = h.ending_track - h.starting_track + 1;          n = h.ending_track - h.starting_track + 1;
         rc = read_toc_entrys((n + 1) * sizeof (struct cd_toc_entry));          rc = read_toc_entrys((n + 1) * sizeof (struct cd_toc_entry));
   
         if (rc < 0)          if (rc < 0)
                 return (rc);                  return (rc);
   
           /*
            * Truncate trailing white space. Then by adding %c to the end of the
            * sscanf() formats we catch any errant trailing characters.
            */
           rc = strlen(arg) - 1;
           while (rc >= 0 && isspace(arg[rc])) {
                   arg[rc] = '\0';
                   rc--;
           }
   
         if (! arg || ! *arg) {          if (! arg || ! *arg) {
                 /* Play the whole disc */                  /* Play the whole disc */
                 return (play_track(h.starting_track, 1,                  return (play_track(h.starting_track, 1, h.ending_track, 1));
                     h.ending_track, 1));  
         }          }
   
         if (strchr(arg, '#')) {          if (strchr(arg, '#')) {
                 /* Play block #blk [ len ] */                  /* Play block #blk [ len ] */
                 int blk, len = 0;                  if (2 != sscanf(arg, "#%u%u%c", &blk, &len, &c) &&
                       1 != sscanf(arg, "#%u%c", &blk, &c)) {
                           printf("%s: Invalid command arguments\n", __progname);
                           return (0);
                   }
   
                 if (2 != sscanf(arg, "#%d%d", &blk, &len) &&  
                     1 != sscanf(arg, "#%d", &blk))  
                         goto Clean_up;  
   
                 if (len == 0) {                  if (len == 0) {
                         if (msf)                          if (msf)
                                 len = msf2lba(toc_buffer[n].addr.msf.minute,                                  len = msf2lba(toc_buffer[n].addr.msf.minute,
Line 545 
Line 562 
                 return play_blocks(blk, len);                  return play_blocks(blk, len);
         }          }
   
         if (strchr(arg, ':')) {          if (strchr(arg, ':') == NULL) {
                 /*                  /*
                  * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ]                   * Play track tr1[.i1] [tr2[.i2]]
                  *  
                  * Will now also undestand timed addresses relative  
                  * to the beginning of a track in the form...  
                  *  
                  *      tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]]  
                  */                   */
                 int tr1, tr2;                  if (4 == sscanf(arg, "%u.%u%u.%u%c", &tr1, &i1, &tr2, &i2, &c))
                 unsigned int m1, m2, s1, s2, f1, f2;                          goto play_track;
                 unsigned char tm, ts, tf;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  i2 = 1;
                 if (8 == sscanf(arg, "%d %u:%u.%u %d %u:%u.%u",                  if (3 == sscanf(arg, "%u.%u%u%c", &tr1, &i1, &tr2, &c))
                     &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2))                          goto play_track;
                         goto Play_Relative_Addresses;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  i1 = 1;
                 if (7 == sscanf(arg, "%d %u:%u %d %u:%u.%u",                  if (3 == sscanf(arg, "%u%u.%u%c", &tr1, &tr2, &i2, &c))
                     &tr1, &m1, &s1, &tr2, &m2, &s2, &f2))                          goto play_track;
                         goto Play_Relative_Addresses;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = 0;
                 if (7 == sscanf(arg, "%d %u:%u.%u %d %u:%u",                  i2 = 1;
                     &tr1, &m1, &s1, &f1, &tr2, &m2, &s2))                  if (2 == sscanf(arg, "%u.%u%c", &tr1, &i1, &c))
                         goto Play_Relative_Addresses;                          goto play_track;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  i1 = i2 = 1;
                 if (7 == sscanf(arg, "%d %u:%u.%u %u:%u.%u",                  if (2 == sscanf(arg, "%u%u%c", &tr1, &tr2, &c))
                     &tr1, &m1, &s1, &f1, &m2, &s2, &f2))                          goto play_track;
                         goto Play_Relative_Addresses;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  i1 = i2 = 1;
                 if (6 == sscanf(arg, "%d %u:%u.%u %u:%u",                  tr2 = 0;
                     &tr1, &m1, &s1, &f1, &m2, &s2))                  if (1 == sscanf(arg, "%u%c", &tr1, &c))
                         goto Play_Relative_Addresses;                          goto play_track;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  printf("%s: Invalid command arguments\n", __progname);
                 if (6 == sscanf(arg, "%d %u:%u %u:%u.%u",                  return (0);
                     &tr1, &m1, &s1, &m2, &s2, &f2))  
                         goto Play_Relative_Addresses;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;  play_track:
                 if (6 == sscanf(arg, "%d %u:%u.%u %d %u",                  if (tr1 > n || tr2 > n) {
                     &tr1, &m1, &s1, &f1, &tr2, &m2))                          printf("Track number must be between 0 and %u\n", n);
                         goto Play_Relative_Addresses;                          return (0);
                   } else if (tr2 == 0)
                           tr2 = h.ending_track;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  if (tr1 > tr2) {
                 if (5 == sscanf(arg, "%d %u:%u %u:%u", &tr1, &m1, &s1, &m2, &s2))                          printf("starting_track > ending_track\n");
                         goto Play_Relative_Addresses;                          return (0);
                   }
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  return (play_track(tr1, i1, tr2, i2));
                 if (5 == sscanf(arg, "%d %u:%u %d %u",          }
                     &tr1, &m1, &s1, &tr2, &m2))  
                         goto Play_Relative_Addresses;  
   
                 tr2 = m2 = s2 = f2 = f1 = 0;          /*
                 if (5 == sscanf(arg, "%d %u:%u.%u %d",           * Play MSF [tr1] m1:s1[.f1] [tr2] [m2:s2[.f2]]
                     &tr1, &m1, &s1, &f1, &tr2))           *
                         goto Play_Relative_Addresses;           * Start Time           End Time
            * ----------           --------
            * tr1 m1:s1.f1         tr2 m2:s2.f2
            * tr1 m1:s1            tr2 m2:s2.f2
            * tr1 m1:s1.f1         tr2 m2:s2
            * tr1 m1:s1            tr2 m2:s2
            *     m1:s1.f1         tr2 m2:s2.f2
            *     m1:s1            tr2 m2:s2.f2
            *     m1:s1.f1         tr2 m2:s2
            *     m1:s1            tr2 m2:s2
            * tr1 m1:s1.f1             m2:s2.f2
            * tr1 m1:s1                m2:s2.f2
            * tr1 m1:s1.f1             m2:s2
            * tr1 m1:s1                m2:s2
            *     m1:s1.f1             m2:s2.f2
            *     m1:s1                m2:s2.f2
            *     m1:s1.f1             m2:s2
            *     m1:s1                m2:s2
            * tr1 m1:s1.f1         tr2
            * tr1 m1:s1            tr2
            *     m1:s1.f1         tr2
            *     m1:s1            tr2
            * tr1 m1:s1.f1         <end of disc>
            * tr1 m1:s1            <end of disc>
            *     m1:s1.f1         <end of disc>
            *     m1:s1            <end of disc>
            */
   
                 tr2 = m2 = s2 = f2 = f1 = 0;          /* tr1 m1:s1.f1         tr2 m2:s2.f2 */
                 if (4 == sscanf(arg, "%d %u:%u %u", &tr1, &m1, &s1, &tr2))          if (8 == sscanf(arg, "%u%u:%u.%u%u%u:%u.%u%c",
                         goto Play_Relative_Addresses;              &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2, &c))
                   goto play_msf;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;          /* tr1 m1:s1            tr2 m2:s2.f2 */
                 if (4 == sscanf(arg, "%d %u:%u.%u", &tr1, &m1, &s1, &f1))          f1 = 0;
                         goto Play_Relative_Addresses;          if (7 == sscanf(arg, "%u%u:%u%u%u:%u.%u%c",
               &tr1, &m1, &s1, &tr2, &m2, &s2, &f2, &c))
                   goto play_msf;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;          /* tr1 m1:s1.f1         tr2 m2:s2 */
                 if (3 == sscanf(arg, "%d %u:%u", &tr1, &m1, &s1))          f2 =0;
                         goto Play_Relative_Addresses;          if (7 == sscanf(arg, "%u%u:%u.%u%u%u:%u%c",
               &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &c))
                   goto play_msf;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;          /*     m1:s1.f1         tr2 m2:s2.f2 */
                 goto Try_Absolute_Timed_Addresses;          tr1 = 0;
           if (7 == sscanf(arg, "%u:%u.%u%u%u:%u.%u%c",
               &m1, &s1, &f1, &tr2, &m2, &s2, &f2, &c))
                   goto play_msf;
   
 Play_Relative_Addresses:          /* tr1 m1:s1.f1             m2:s2.f2 */
                 if (tr1 < 1 || tr1 > n) {          tr2 = 0;
                         printf("Track %d not found\n", tr1);          if (7 == sscanf(arg, "%u%u:%u.%u%u:%u.%u%c",
                         return (0);              &tr1, &m1, &s1, &f1, &m2, &s2, &f2, &c))
                 } else if (tr2 < 0 || tr2 > n) {                  goto play_msf;
                         printf("Track %d not found\n", tr2);  
                         return (0);  
                 }  
   
                 /* Change (m1,s1,f1) from tr1 to disc relative. */          /*     m1:s1            tr2 m2:s2.f2 */
           tr1 = f1 = 0;
           if (6 == sscanf(arg, "%u:%u%u%u:%u.%u%c",
               &m1, &s1, &tr2, &m2, &s2, &f2, &c))
                   goto play_msf;
   
           /*     m1:s1.f1         tr2 m2:s2 */
           tr1 = f2 = 0;
           if (6 == sscanf(arg, "%u:%u.%u%u%u:%u%c",
               &m1, &s1, &f1, &tr2, &m2, &s2, &c))
                   goto play_msf;
   
           /*     m1:s1.f1             m2:s2.f2 */
           tr1 = tr2 = 0;
           if (6 == sscanf(arg, "%u:%u.%u%u:%u.%u%c",
               &m1, &s1, &f1, &m2, &s2, &f2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1.f1             m2:s2 */
           tr2 = f2 = 0;
           if (6 == sscanf(arg, "%u%u:%u.%u%u:%u%c",
               &tr1, &m1, &s1, &f1, &m2, &s2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1                m2:s2.f2 */
           tr2 = f1 = 0;
           if (6 == sscanf(arg, "%u%u:%u%u:%u.%u%c",
               &tr1, &m1, &s1, &m2, &s2, &f2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1            tr2 m2:s2 */
           f1 = f2 = 0;
           if (6 == sscanf(arg, "%u%u:%u%u%u:%u%c",
               &tr1, &m1, &s1, &tr2, &m2, &s2, &c))
                   goto play_msf;
   
           /*     m1:s1            tr2 m2:s2 */
           tr1 = f1 = f2 = 0;
           if (5 == sscanf(arg, "%u:%u%u%u:%u%c", &m1, &s1, &tr2, &m2, &s2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1                m2:s2 */
           f1 = tr2 = f2 = 0;
           if (5 == sscanf(arg, "%u%u:%u%u:%u%c", &tr1, &m1, &s1, &m2, &s2, &c))
                   goto play_msf;
   
           /*     m1:s1                m2:s2.f2 */
           tr1 = f1 = tr2 = 0;
           if (5 == sscanf(arg, "%u:%u%u:%u.%u%c", &m1, &s1, &m2, &s2, &f2, &c))
                   goto play_msf;
   
           /*     m1:s1.f1             m2:s2 */
           tr1 = tr2 = f2 = 0;
           if (5 == sscanf(arg, "%u:%u.%u%u:%u%c", &m1, &s1, &f1, &m2, &s2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1.f1         tr2 */
           m2 = s2 = f2 = 0;
           if (5 == sscanf(arg, "%u%u:%u.%u%u%c", &tr1, &m1, &s1, &f1, &tr2, &c))
                   goto play_msf;
   
           /*     m1:s1                m2:s2 */
           tr1 = f1 = tr2 = f2 = 0;
           if (4 == sscanf(arg, "%u:%u%u:%u%c", &m1, &s1, &m2, &s2, &c))
                   goto play_msf;
   
           /* tr1 m1:s1.f1         <end of disc> */
           tr2 = m2 = s2 = f2 = 0;
           if (4 == sscanf(arg, "%u%u:%u.%u%c", &tr1, &m1, &s1, &f1, &c))
                   goto play_msf;
   
           /* tr1 m1:s1            tr2 */
           f1 = m2 = s2 = f2 = 0;
           if (4 == sscanf(arg, "%u%u:%u%u%c", &tr1, &m1, &s1, &tr2, &c))
                   goto play_msf;
   
           /*     m1:s1.f1         tr2 */
           tr1 = m2 = s2 = f2 = 0;
           if (4 == sscanf(arg, "%u%u:%u%u%c", &m1, &s1, &f1, &tr2, &c))
                   goto play_msf;
   
           /*     m1:s1.f1         <end of disc> */
           tr1 = tr2 = m2 = s2 = f2 = 0;
           if (3 == sscanf(arg, "%u:%u.%u%c", &m1, &s1, &f1, &c))
                   goto play_msf;
   
           /* tr1 m1:s1            <end of disc> */
           f1 = tr2 = m2 = s2 = f2 = 0;
           if (3 == sscanf(arg, "%u%u:%u%c", &tr1, &m1, &s1, &c))
                   goto play_msf;
   
           /*     m1:s1            tr2 */
           tr1 = f1 = m2 = s2 = f2 = 0;
           if (3 == sscanf(arg, "%u:%u%u%c", &m1, &s1, &tr2, &c))
                   goto play_msf;
   
           /*     m1:s1            <end of disc> */
           tr1 = f1 = tr2 = m2 = s2 = f2 = 0;
           if (2 == sscanf(arg, "%u:%u%c", &m1, &s1, &c))
                   goto play_msf;
   
           printf("%s: Invalid command arguments\n", __progname);
           return (0);
   
   play_msf:
           if (tr1 > n || tr2 > n) {
                   printf("Track number must be between 0 and %u\n", n);
                   return (0);
           } else if (m1 > 99 || m2 > 99) {
                   printf("Minutes must be between 0 and 99\n");
                   return (0);
           } else if (s1 > 59 || s2 > 59) {
                   printf("Seconds must be between 0 and 59\n");
                   return (0);
           } if (f1 > 74 || f2 > 74) {
                   printf("Frames number must be between 0 and 74\n");
                   return (0);
           }
   
           if (tr1 > 0) {
                   /*
                    * Start time is relative to tr1, Add start time of tr1
                    * to (m1,s1,f1) to yield absolute start time.
                    */
                 toc2msf(tr1, &tm, &ts, &tf);                  toc2msf(tr1, &tm, &ts, &tf);
                 addmsf(&m1, &s1, &f1, tm, ts, tf);                  addmsf(&m1, &s1, &f1, tm, ts, tf);
   
                 /* Compare (m1,s1,f1) to start time of next track. */                  /* Compare (m1,s1,f1) to start time of next track. */
                 toc2msf(tr1+1, &tm, &ts, &tf);                  toc2msf(tr1+1, &tm, &ts, &tf);
                 if (cmpmsf(m1, s1, f1, tm, ts, tf) == 1) {                  if (cmpmsf(m1, s1, f1, tm, ts, tf) == 1) {
                         printf("Track %d is not that long.\n", tr1);                          printf("Track %u is not that long.\n", tr1);
                         return (0);                          return (0);
                 }                  }
           }
   
                 if (!(tr2 || m2 || s2 || f2)) {          toc2msf(n+1, &tm, &ts, &tf);
                         /* No end time specified. Play to end of disc. */          if (cmpmsf(m1, s1, f1, tm, ts, tf) == 1) {
                         toc2msf(n+1, &tm, &ts, &tf);                  printf("Start time is after end of disc.\n");
                         m2 = tm;                  return (0);
                         s2 = ts;          }
                         f2 = tf;  
                 } else if (tr2 != 0) {  
                         /*  
                          * End time specified relative to tr2. Change  
                          * (m2,s2,f2) from tr2 to disc relative.  
                          */  
                         toc2msf(tr2, &tm, &ts, &tf);  
                         addmsf(&m2, &s2, &f2, tm, ts, tf);  
                         /* Compare (m2,s2,f2) to start time of next track. */  
                         toc2msf(tr2+1, &tm, &ts, &tf);  
                         if (cmpmsf(m2, s2, f2, tm, ts, tf) == 1) {  
                                 printf("Track %d is not that long.\n", tr2);  
                                 return (0);  
                         }  
                 } else {  
                         /*  
                          * Duration rather than end time specified. Change  
                          * (m2,s2,f2) from (m1,s1,f1) to disc relative.  
                          */  
                         addmsf(&m2, &s2, &f2, m1, s1, f1);  
                         /* Compare (m2,s2,f2) to end of disc. */  
                         toc2msf(tr2+1, &tm, &ts, &tf);  
                         if (cmpmsf(m2, s2, f2, tm, ts, tf) == 1) {  
                                 printf("Disc is not that long.\n");  
                                 return (0);  
                         }  
                 }  
   
                 return (play_msf(m1, s1, f1, m2, s2, f2));          if (tr2 > 0) {
                   /*
                    * End time is relative to tr2, Add start time of tr2
                    * to (m2,s2,f2) to yield absolute end time.
                    */
                   toc2msf(tr2, &tm, &ts, &tf);
                   addmsf(&m2, &s2, &f2, tm, ts, tf);
   
 Try_Absolute_Timed_Addresses:                  /* Compare (m2,s2,f2) to start time of next track. */
                 if (6 != sscanf(arg, "%u:%u.%u%u:%u.%u",                  toc2msf(tr2+1, &tm, &ts, &tf);
                     &m1, &s1, &f1, &m2, &s2, &f2) &&                  if (cmpmsf(m2, s2, f2, tm, ts, tf) == 1) {
                     5 != sscanf(arg, "%u:%u.%u%u:%u", &m1, &s1, &f1, &m2, &s2) &&                          printf("Track %u is not that long.\n", tr2);
                     5 != sscanf(arg, "%u:%u%u:%u.%u", &m1, &s1, &m2, &s2, &f2) &&                          return (0);
                     3 != sscanf(arg, "%u:%u.%u", &m1, &s1, &f1) &&  
                     4 != sscanf(arg, "%u:%u%u:%u", &m1, &s1, &m2, &s2) &&  
                     2 != sscanf(arg, "%u:%u", &m1, &s1))  
                         goto Clean_up;  
   
                 if (m2 == 0) {  
                         toc2msf(n+1, &tm, &ts, &tf);  
                         m2 = tm;  
                         s2 = ts;  
                         f2 = tf;  
                 }                  }
   
                 return play_msf(m1, s1, f1, m2, s2, f2);  
         }          }
   
         /*          toc2msf(n+1, &tm, &ts, &tf);
          * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ]  
          */  
         if (4 != sscanf(arg, "%d.%d%d.%d", &start, &istart, &end, &iend) &&  
             3 != sscanf(arg, "%d.%d%d", &start, &istart, &end) &&  
             3 != sscanf(arg, "%d%d.%d", &start, &end, &iend) &&  
             2 != sscanf(arg, "%d.%d", &start, &istart) &&  
             2 != sscanf(arg, "%d%d", &start, &end) &&  
             1 != sscanf(arg, "%d", &start))  
                 goto Clean_up;  
   
         if (end == 0)          if (!(tr2 || m2 || s2 || f2)) {
                 end = h.ending_track;                  /* Play to end of disc. */
         return (play_track(start, istart, end, iend));                  m2 = tm;
                   s2 = ts;
                   f2 = tf;
           } else if (cmpmsf(m2, s2, f2, tm, ts, tf) == 1) {
                   printf("End time is after end of disc.\n");
                   return (0);
           }
   
 Clean_up:          if (cmpmsf(m1, s1, f1, m2, s2, f2) == 1) {
         printf("%s: Invalid command arguments\n", __progname);                  printf("Start time is after end time.\n");
         return (0);                  return (0);
           }
   
           return play_msf(m1, s1, f1, m2, s2, f2);
 }  }
   
 /* ARGSUSED */  /* ARGSUSED */

Legend:
Removed from v.1.46  
changed lines
  Added in v.1.47