Lines 29-34
Link Here
|
29 |
* the uchar storing the volume (256 -> 0, -20 -> 236, ...). |
29 |
* the uchar storing the volume (256 -> 0, -20 -> 236, ...). |
30 |
* Version 2.0.2 |
30 |
* Version 2.0.2 |
31 |
* |
31 |
* |
|
|
32 |
* 03-Feb-2011 Tatsuki Makino <tatsuki_makino@hotmail.com> |
33 |
* Fixed an ability to specify addresses relative to the |
34 |
* beginning of a track. |
35 |
* Version 2.0.3 |
36 |
* |
32 |
*/ |
37 |
*/ |
33 |
|
38 |
|
34 |
#include <sys/cdefs.h> |
39 |
#include <sys/cdefs.h> |
Lines 52-58
__FBSDID("$FreeBSD$");
Link Here
|
52 |
#include <unistd.h> |
57 |
#include <unistd.h> |
53 |
#include <vis.h> |
58 |
#include <vis.h> |
54 |
|
59 |
|
55 |
#define VERSION "2.0.2" |
60 |
#define VERSION "2.0.3" |
56 |
|
61 |
|
57 |
#define ASTS_INVALID 0x00 /* Audio status byte not valid */ |
62 |
#define ASTS_INVALID 0x00 /* Audio status byte not valid */ |
58 |
#define ASTS_PLAYING 0x11 /* Audio play operation in progress */ |
63 |
#define ASTS_PLAYING 0x11 /* Audio play operation in progress */ |
Lines 523-528
int play (char *arg)
Link Here
|
523 |
unsigned tr1, tr2; |
528 |
unsigned tr1, tr2; |
524 |
unsigned m1, m2, s1, s2, f1, f2; |
529 |
unsigned m1, m2, s1, s2, f1, f2; |
525 |
unsigned char tm, ts, tf; |
530 |
unsigned char tm, ts, tf; |
|
|
531 |
unsigned int lba1, lba2, tlba; |
526 |
|
532 |
|
527 |
tr2 = m2 = s2 = f2 = f1 = 0; |
533 |
tr2 = m2 = s2 = f2 = f1 = 0; |
528 |
if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d", |
534 |
if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d", |
Lines 589-706
int play (char *arg)
Link Here
|
589 |
goto Try_Absolute_Timed_Addresses; |
595 |
goto Try_Absolute_Timed_Addresses; |
590 |
|
596 |
|
591 |
Play_Relative_Addresses: |
597 |
Play_Relative_Addresses: |
592 |
if (! tr1) |
598 |
if (!tr1) { |
593 |
tr1 = 1; |
599 |
tr1 = 1; |
594 |
else if (tr1 > n) |
600 |
} else if (tr1 > n) { |
595 |
tr1 = n; |
601 |
tr1 = n; |
|
|
602 |
} |
603 |
--tr1; |
596 |
|
604 |
|
597 |
tr1--; |
605 |
/* |
598 |
|
606 |
* XXX: need check tr1 == toc_buffer[tr1].track ? |
|
|
607 |
*/ |
599 |
if (msf) { |
608 |
if (msf) { |
600 |
tm = toc_buffer[tr1].addr.msf.minute; |
609 |
tm = toc_buffer[tr1].addr.msf.minute; |
601 |
ts = toc_buffer[tr1].addr.msf.second; |
610 |
ts = toc_buffer[tr1].addr.msf.second; |
602 |
tf = toc_buffer[tr1].addr.msf.frame; |
611 |
tf = toc_buffer[tr1].addr.msf.frame; |
603 |
} else |
612 |
tlba = msf2lba(tm, ts, tf); |
604 |
lba2msf(ntohl(toc_buffer[tr1].addr.lba), |
613 |
} else { |
605 |
&tm, &ts, &tf); |
614 |
tlba = ntohl(toc_buffer[tr1].addr.lba); |
606 |
if ((m1 > tm) |
|
|
607 |
|| ((m1 == tm) |
608 |
&& ((s1 > ts) |
609 |
|| ((s1 == ts) |
610 |
&& (f1 > tf))))) { |
611 |
printf ("Track %d is not that long.\n", tr1); |
612 |
return (0); |
613 |
} |
615 |
} |
614 |
|
616 |
|
615 |
f1 += tf; |
617 |
lba1 = msf2lba((u_char)m1, (u_char)s1, (u_char)f1) + 150 + tlba; |
616 |
if (f1 >= 75) { |
|
|
617 |
s1 += f1 / 75; |
618 |
f1 %= 75; |
619 |
} |
620 |
|
618 |
|
621 |
s1 += ts; |
619 |
if (lba1 < tlba) { |
622 |
if (s1 >= 60) { |
620 |
printf("Track %d is not that long.\n", tr1 + 1); |
623 |
m1 += s1 / 60; |
621 |
return 0; |
624 |
s1 %= 60; |
|
|
625 |
} |
622 |
} |
626 |
|
623 |
|
627 |
m1 += tm; |
624 |
if (msf) { |
628 |
|
625 |
tm = toc_buffer[tr1 + 1].addr.msf.minute; |
629 |
if (! tr2) { |
626 |
ts = toc_buffer[tr1 + 1].addr.msf.second; |
630 |
if (m2 || s2 || f2) { |
627 |
tf = toc_buffer[tr1 + 1].addr.msf.frame; |
631 |
tr2 = tr1; |
628 |
tlba = msf2lba(tm, ts, tf); |
632 |
f2 += f1; |
629 |
} else { |
633 |
if (f2 >= 75) { |
630 |
tlba = ntohl(toc_buffer[tr1 + 1].addr.lba); |
634 |
s2 += f2 / 75; |
631 |
} |
635 |
f2 %= 75; |
|
|
636 |
} |
637 |
|
638 |
s2 += s1; |
639 |
if (s2 > 60) { |
640 |
m2 += s2 / 60; |
641 |
s2 %= 60; |
642 |
} |
643 |
|
632 |
|
644 |
m2 += m1; |
633 |
if (lba1 > tlba) { |
|
|
634 |
if ((tr1 + 1) == n) { |
635 |
printf("The playing time of the disc is not that long.\n"); |
645 |
} else { |
636 |
} else { |
646 |
tr2 = n; |
637 |
printf("Track %d is not that long.\n", tr1 + 1); |
647 |
if (msf) { |
|
|
648 |
m2 = toc_buffer[n].addr.msf.minute; |
649 |
s2 = toc_buffer[n].addr.msf.second; |
650 |
f2 = toc_buffer[n].addr.msf.frame; |
651 |
} else { |
652 |
lba2msf(ntohl(toc_buffer[n].addr.lba), |
653 |
&tm, &ts, &tf); |
654 |
m2 = tm; |
655 |
s2 = ts; |
656 |
f2 = tf; |
657 |
} |
658 |
} |
638 |
} |
|
|
639 |
return 0; |
640 |
} |
641 |
|
642 |
if (!tr2) { |
643 |
tr2 = tr1 + 1; |
659 |
} else if (tr2 > n) { |
644 |
} else if (tr2 > n) { |
660 |
tr2 = n; |
645 |
tr2 = n; |
661 |
m2 = s2 = f2 = 0; |
646 |
} |
|
|
647 |
--tr2; |
648 |
|
649 |
if (msf) { |
650 |
tm = toc_buffer[tr2].addr.msf.minute; |
651 |
ts = toc_buffer[tr2].addr.msf.second; |
652 |
tf = toc_buffer[tr2].addr.msf.frame; |
653 |
tlba = msf2lba(tm, ts, tf); |
662 |
} else { |
654 |
} else { |
663 |
if (m2 || s2 || f2) |
655 |
tlba = ntohl(toc_buffer[tr2].addr.lba); |
664 |
tr2--; |
656 |
} |
665 |
if (msf) { |
|
|
666 |
tm = toc_buffer[tr2].addr.msf.minute; |
667 |
ts = toc_buffer[tr2].addr.msf.second; |
668 |
tf = toc_buffer[tr2].addr.msf.frame; |
669 |
} else |
670 |
lba2msf(ntohl(toc_buffer[tr2].addr.lba), |
671 |
&tm, &ts, &tf); |
672 |
f2 += tf; |
673 |
if (f2 >= 75) { |
674 |
s2 += f2 / 75; |
675 |
f2 %= 75; |
676 |
} |
677 |
|
657 |
|
678 |
s2 += ts; |
658 |
if (m2 || s2 || f2) { |
679 |
if (s2 > 60) { |
659 |
lba2 = msf2lba((u_char)m2, (u_char)s2, (u_char)f2) + 150 + tlba; |
680 |
m2 += s2 / 60; |
660 |
} else if (msf) { |
681 |
s2 %= 60; |
661 |
tm = toc_buffer[tr2 + 1].addr.msf.minute; |
682 |
} |
662 |
ts = toc_buffer[tr2 + 1].addr.msf.second; |
|
|
663 |
tf = toc_buffer[tr2 + 1].addr.msf.frame; |
664 |
lba2 = msf2lba(tm, ts, tf); |
665 |
} else { |
666 |
lba2 = ntohl(toc_buffer[tr2 + 1].addr.lba); |
667 |
} |
683 |
|
668 |
|
684 |
m2 += tm; |
669 |
if (lba2 < tlba) { |
|
|
670 |
printf("Track %d is not that long.\n", tr2 + 1); |
671 |
return 0; |
685 |
} |
672 |
} |
686 |
|
673 |
|
687 |
if (msf) { |
674 |
if (msf) { |
688 |
tm = toc_buffer[n].addr.msf.minute; |
675 |
tm = toc_buffer[tr2 + 1].addr.msf.minute; |
689 |
ts = toc_buffer[n].addr.msf.second; |
676 |
ts = toc_buffer[tr2 + 1].addr.msf.second; |
690 |
tf = toc_buffer[n].addr.msf.frame; |
677 |
tf = toc_buffer[tr2 + 1].addr.msf.frame; |
691 |
} else |
678 |
tlba = msf2lba(tm, ts, tf); |
692 |
lba2msf(ntohl(toc_buffer[n].addr.lba), |
679 |
} else { |
693 |
&tm, &ts, &tf); |
680 |
tlba = ntohl(toc_buffer[tr2 + 1].addr.lba); |
694 |
if ((tr2 < n) |
|
|
695 |
&& ((m2 > tm) |
696 |
|| ((m2 == tm) |
697 |
&& ((s2 > ts) |
698 |
|| ((s2 == ts) |
699 |
&& (f2 > tf)))))) { |
700 |
printf ("The playing time of the disc is not that long.\n"); |
701 |
return (0); |
702 |
} |
681 |
} |
703 |
return (play_msf (m1, s1, f1, m2, s2, f2)); |
682 |
|
|
|
683 |
if (lba2 > tlba) { |
684 |
if ((tr2 + 1) == n) { |
685 |
printf("The playing time of the disc is not that long.\n"); |
686 |
} else { |
687 |
printf("Track %d is not that long.\n", tr2 + 1); |
688 |
} |
689 |
return 0; |
690 |
} |
691 |
|
692 |
if (lba1 > lba2) { |
693 |
/* swap */ |
694 |
lba1 ^= lba2; |
695 |
lba2 ^= lba1; |
696 |
lba1 ^= lba2; |
697 |
} |
698 |
|
699 |
return play_blocks(lba1, lba2 - lba1); |
704 |
|
700 |
|
705 |
Try_Absolute_Timed_Addresses: |
701 |
Try_Absolute_Timed_Addresses: |
706 |
if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d", |
702 |
if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d", |