Deleted Added
full compact
cdcontrol.c (13985) cdcontrol.c (13989)
1/*
2 * Compact Disc Control Utility by Serge V. Vakulenko <vak@cronyx.ru>.
3 * Based on the non-X based CD player by Jean-Marc Zucconi and
4 * Andrey A. Chernov.
5 *
6 * Fixed and further modified on 5-Sep-1995 by Jukka Ukkonen <jau@funet.fi>.
7 *
8 * 11-Sep-1995: Jukka A. Ukkonen <jau@funet.fi>
9 * A couple of further fixes to my own earlier "fixes".
10 *
11 * 18-Sep-1995: Jukka A. Ukkonen <jau@funet.fi>
12 * Added an ability to specify addresses relative to the
13 * beginning of a track. This is in fact a variation of
14 * doing the simple play_msf() call.
15 *
16 * 11-Oct-1995: Serge V.Vakulenko <vak@cronyx.ru>
17 * New eject algorithm.
18 * Some code style reformatting.
19 *
1/*
2 * Compact Disc Control Utility by Serge V. Vakulenko <vak@cronyx.ru>.
3 * Based on the non-X based CD player by Jean-Marc Zucconi and
4 * Andrey A. Chernov.
5 *
6 * Fixed and further modified on 5-Sep-1995 by Jukka Ukkonen <jau@funet.fi>.
7 *
8 * 11-Sep-1995: Jukka A. Ukkonen <jau@funet.fi>
9 * A couple of further fixes to my own earlier "fixes".
10 *
11 * 18-Sep-1995: Jukka A. Ukkonen <jau@funet.fi>
12 * Added an ability to specify addresses relative to the
13 * beginning of a track. This is in fact a variation of
14 * doing the simple play_msf() call.
15 *
16 * 11-Oct-1995: Serge V.Vakulenko <vak@cronyx.ru>
17 * New eject algorithm.
18 * Some code style reformatting.
19 *
20 * $Id: cdcontrol.c,v 1.10 1996/02/03 15:21:30 ache Exp $
20 * $Id: cdcontrol.c,v 1.11 1996/02/09 00:22:17 ache Exp $
21 */
22
23#include <ctype.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <unistd.h>
28#include <errno.h>

--- 364 unchanged lines hidden (view full) ---

393 return (rc);
394
395 n = h.ending_track - h.starting_track + 1;
396 rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry));
397
398 if (rc < 0)
399 return (rc);
400
21 */
22
23#include <ctype.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <unistd.h>
28#include <errno.h>

--- 364 unchanged lines hidden (view full) ---

393 return (rc);
394
395 n = h.ending_track - h.starting_track + 1;
396 rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry));
397
398 if (rc < 0)
399 return (rc);
400
401 if (! arg || ! *arg)
401 if (! arg || ! *arg) {
402 /* Play the whole disc */
402 /* Play the whole disc */
403 return play_blocks (0, msf2lba (toc_buffer[n].addr.msf.minute,
404 toc_buffer[n].addr.msf.second,
405 toc_buffer[n].addr.msf.frame));
403 if (msf)
404 return play_blocks (0, msf2lba (toc_buffer[n].addr.msf.minute,
405 toc_buffer[n].addr.msf.second,
406 toc_buffer[n].addr.msf.frame));
407 else
408 return play_blocks (0, ntohl(toc_buffer[n].addr.lba));
409 }
406
407 if (strchr (arg, '#')) {
408 /* Play block #blk [ len ] */
409 int blk, len = 0;
410
411 if (2 != sscanf (arg, "#%d%d", &blk, &len) &&
412 1 != sscanf (arg, "#%d", &blk))
413 goto Clean_up;
414
410
411 if (strchr (arg, '#')) {
412 /* Play block #blk [ len ] */
413 int blk, len = 0;
414
415 if (2 != sscanf (arg, "#%d%d", &blk, &len) &&
416 1 != sscanf (arg, "#%d", &blk))
417 goto Clean_up;
418
415 if (len == 0)
416 len = msf2lba (toc_buffer[n].addr.msf.minute,
417 toc_buffer[n].addr.msf.second,
418 toc_buffer[n].addr.msf.frame) - blk;
419 if (len == 0) {
420 if (msf)
421 len = msf2lba (toc_buffer[n].addr.msf.minute,
422 toc_buffer[n].addr.msf.second,
423 toc_buffer[n].addr.msf.frame) - blk;
424 else
425 len = ntohl(toc_buffer[n].addr.lba) - blk;
426 }
419 return play_blocks (blk, len);
420 }
421
422 if (strchr (arg, ':')) {
423 /*
424 * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ]
425 *
426 * Will now also undestand timed addresses relative
427 * to the beginning of a track in the form...
428 *
429 * tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]]
430 */
431 unsigned tr1, tr2;
432 unsigned m1, m2, s1, s2, f1, f2;
427 return play_blocks (blk, len);
428 }
429
430 if (strchr (arg, ':')) {
431 /*
432 * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ]
433 *
434 * Will now also undestand timed addresses relative
435 * to the beginning of a track in the form...
436 *
437 * tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]]
438 */
439 unsigned tr1, tr2;
440 unsigned m1, m2, s1, s2, f1, f2;
441 unsigned char tm, ts, tf;
433
434 tr2 = m2 = s2 = f2 = f1 = 0;
435 if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d",
436 &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2))
437 goto Play_Relative_Addresses;
438
439 tr2 = m2 = s2 = f2 = f1 = 0;
440 if (7 == sscanf (arg, "%d %d:%d %d %d:%d.%d",

--- 55 unchanged lines hidden (view full) ---

496 goto Try_Absolute_Timed_Addresses;
497
498Play_Relative_Addresses:
499 if (! tr1)
500 tr1 = 1;
501 else if (tr1 > n)
502 tr1 = n;
503
442
443 tr2 = m2 = s2 = f2 = f1 = 0;
444 if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d",
445 &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2))
446 goto Play_Relative_Addresses;
447
448 tr2 = m2 = s2 = f2 = f1 = 0;
449 if (7 == sscanf (arg, "%d %d:%d %d %d:%d.%d",

--- 55 unchanged lines hidden (view full) ---

505 goto Try_Absolute_Timed_Addresses;
506
507Play_Relative_Addresses:
508 if (! tr1)
509 tr1 = 1;
510 else if (tr1 > n)
511 tr1 = n;
512
504 if ((m1 > toc_buffer[tr1].addr.msf.minute)
505 || ((m1 == toc_buffer[tr1].addr.msf.minute)
506 && ((s1 > toc_buffer[tr1].addr.msf.second)
507 || ((s1 == toc_buffer[tr1].addr.msf.second)
508 && (f1 > toc_buffer[tr1].addr.msf.frame))))) {
513 if (msf) {
514 tm = toc_buffer[tr1].addr.msf.minute;
515 ts = toc_buffer[tr1].addr.msf.second;
516 tf = toc_buffer[tr1].addr.msf.frame;
517 } else
518 lba2msf(ntohl(toc_buffer[tr1].addr.lba),
519 &tm, &ts, &tf);
520 if ((m1 > tm)
521 || ((m1 == tm)
522 && ((s1 > ts)
523 || ((s1 == ts)
524 && (f1 > tf))))) {
509 printf ("Track %d is not that long.\n", tr1);
510 return (0);
511 }
512
513 tr1--;
514
525 printf ("Track %d is not that long.\n", tr1);
526 return (0);
527 }
528
529 tr1--;
530
515 f1 += toc_buffer[tr1].addr.msf.frame;
531 f1 += tf;
516 if (f1 >= 75) {
517 s1 += f1 / 75;
518 f1 %= 75;
519 }
520
532 if (f1 >= 75) {
533 s1 += f1 / 75;
534 f1 %= 75;
535 }
536
521 s1 += toc_buffer[tr1].addr.msf.second;
537 s1 += ts;
522 if (s1 >= 60) {
523 m1 += s1 / 60;
524 s1 %= 60;
525 }
526
538 if (s1 >= 60) {
539 m1 += s1 / 60;
540 s1 %= 60;
541 }
542
527 m1 += toc_buffer[tr1].addr.msf.minute;
543 m1 += tm;
528
529 if (! tr2) {
530 if (m2 || s2 || f2) {
531 tr2 = tr1;
532 f2 += f1;
533 if (f2 >= 75) {
534 s2 += f2 / 75;
535 f2 %= 75;
536 }
537
538 s2 += s1;
539 if (s2 > 60) {
540 m2 += s2 / 60;
541 s2 %= 60;
542 }
543
544 m2 += m1;
545 } else {
546 tr2 = n;
544
545 if (! tr2) {
546 if (m2 || s2 || f2) {
547 tr2 = tr1;
548 f2 += f1;
549 if (f2 >= 75) {
550 s2 += f2 / 75;
551 f2 %= 75;
552 }
553
554 s2 += s1;
555 if (s2 > 60) {
556 m2 += s2 / 60;
557 s2 %= 60;
558 }
559
560 m2 += m1;
561 } else {
562 tr2 = n;
547 m2 = toc_buffer[n].addr.msf.minute;
548 s2 = toc_buffer[n].addr.msf.second;
549 f2 = toc_buffer[n].addr.msf.frame;
563 if (msf) {
564 m2 = toc_buffer[n].addr.msf.minute;
565 s2 = toc_buffer[n].addr.msf.second;
566 f2 = toc_buffer[n].addr.msf.frame;
567 } else {
568 lba2msf(ntohl(toc_buffer[n].addr.lba),
569 &tm, &ts, &tf);
570 m2 = tm;
571 s2 = ts;
572 f2 = tf;
573 }
550 }
551 } else if (tr2 > n) {
552 tr2 = n;
553 m2 = s2 = f2 = 0;
554 } else {
555 if (m2 || s2 || f2)
556 tr2--;
574 }
575 } else if (tr2 > n) {
576 tr2 = n;
577 m2 = s2 = f2 = 0;
578 } else {
579 if (m2 || s2 || f2)
580 tr2--;
557 f2 += toc_buffer[tr2].addr.msf.frame;
581 if (msf) {
582 tm = toc_buffer[tr2].addr.msf.minute;
583 ts = toc_buffer[tr2].addr.msf.second;
584 tf = toc_buffer[tr2].addr.msf.frame;
585 } else
586 lba2msf(ntohl(toc_buffer[tr2].addr.lba),
587 &tm, &ts, &tf);
588 f2 += tf;
558 if (f2 >= 75) {
559 s2 += f2 / 75;
560 f2 %= 75;
561 }
562
589 if (f2 >= 75) {
590 s2 += f2 / 75;
591 f2 %= 75;
592 }
593
563 s2 += toc_buffer[tr2].addr.msf.second;
594 s2 += ts;
564 if (s2 > 60) {
565 m2 += s2 / 60;
566 s2 %= 60;
567 }
568
595 if (s2 > 60) {
596 m2 += s2 / 60;
597 s2 %= 60;
598 }
599
569 m2 += toc_buffer[tr2].addr.msf.minute;
600 m2 += tm;
570 }
571
601 }
602
603 if (msf) {
604 tm = toc_buffer[n].addr.msf.minute;
605 ts = toc_buffer[n].addr.msf.second;
606 tf = toc_buffer[n].addr.msf.frame;
607 } else
608 lba2msf(ntohl(toc_buffer[n].addr.lba),
609 &tm, &ts, &tf);
572 if ((tr2 < n)
610 if ((tr2 < n)
573 && ((m2 > toc_buffer[n].addr.msf.minute)
574 || ((m2 == toc_buffer[n].addr.msf.minute)
575 && ((s2 > toc_buffer[n].addr.msf.second)
576 || ((s2 == toc_buffer[n].addr.msf.second)
577 && (f2 > toc_buffer[n].addr.msf.frame)))))) {
611 && ((m2 > tm)
612 || ((m2 == tm)
613 && ((s2 > ts)
614 || ((s2 == ts)
615 && (f2 > tf)))))) {
578 printf ("The playing time of the disc is not that long.\n");
579 return (0);
580 }
581 return (play_msf (m1, s1, f1, m2, s2, f2));
582
583Try_Absolute_Timed_Addresses:
584 if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d",
585 &m1, &s1, &f1, &m2, &s2, &f2) &&
586 5 != sscanf (arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) &&
587 5 != sscanf (arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) &&
588 3 != sscanf (arg, "%d:%d.%d", &m1, &s1, &f1) &&
589 4 != sscanf (arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) &&
590 2 != sscanf (arg, "%d:%d", &m1, &s1))
591 goto Clean_up;
592
593 if (m2 == 0) {
616 printf ("The playing time of the disc is not that long.\n");
617 return (0);
618 }
619 return (play_msf (m1, s1, f1, m2, s2, f2));
620
621Try_Absolute_Timed_Addresses:
622 if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d",
623 &m1, &s1, &f1, &m2, &s2, &f2) &&
624 5 != sscanf (arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) &&
625 5 != sscanf (arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) &&
626 3 != sscanf (arg, "%d:%d.%d", &m1, &s1, &f1) &&
627 4 != sscanf (arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) &&
628 2 != sscanf (arg, "%d:%d", &m1, &s1))
629 goto Clean_up;
630
631 if (m2 == 0) {
594 m2 = toc_buffer[n].addr.msf.minute;
595 s2 = toc_buffer[n].addr.msf.second;
596 f2 = toc_buffer[n].addr.msf.frame;
632 if (msf) {
633 m2 = toc_buffer[n].addr.msf.minute;
634 s2 = toc_buffer[n].addr.msf.second;
635 f2 = toc_buffer[n].addr.msf.frame;
636 } else {
637 lba2msf(ntohl(toc_buffer[n].addr.lba),
638 &tm, &ts, &tf);
639 m2 = tm;
640 s2 = ts;
641 f2 = tf;
642 }
597 }
598 return play_msf (m1, s1, f1, m2, s2, f2);
599 }
600
601 /*
602 * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ]
603 */
604 if (4 != sscanf (arg, "%d.%d%d.%d", &start, &istart, &end, &iend) &&

--- 366 unchanged lines hidden ---
643 }
644 return play_msf (m1, s1, f1, m2, s2, f2);
645 }
646
647 /*
648 * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ]
649 */
650 if (4 != sscanf (arg, "%d.%d%d.%d", &start, &istart, &end, &iend) &&

--- 366 unchanged lines hidden ---