| 1 |
#!/usr/bin/perl |
| 2 |
|
| 3 |
# feeds all AUDIO tracks into sox. might work only |
| 4 |
# on little-endian machines, so BEWARE! |
| 5 |
|
| 6 |
$PLAY = "trap '' INT; play -traw -r44100 -c2 -sw - >/dev/null"; |
| 7 |
|
| 8 |
use Convert::CD::Track; |
| 9 |
use Convert::CD::Cue; |
| 10 |
|
| 11 |
$SIG{INT} = sub { $int++ }; |
| 12 |
|
| 13 |
print "interrupt to skip song\n"; |
| 14 |
|
| 15 |
for (@ARGV) { |
| 16 |
print "reading $_\n"; |
| 17 |
|
| 18 |
my $toc = new Convert::CD::Cue path => $_; |
| 19 |
my $cd = $toc->read; |
| 20 |
|
| 21 |
open PLAY, "|-", $PLAY |
| 22 |
or die "@PLAY: $!"; |
| 23 |
|
| 24 |
$| = 1; |
| 25 |
|
| 26 |
for my $track ($cd->track) { |
| 27 |
next unless $track->{mode} == MODE_AUDIO; |
| 28 |
print "playing ", $track->as_string, "\n"; |
| 29 |
|
| 30 |
my $size = $track->size; |
| 31 |
my $chunk = $track->{datasize}; |
| 32 |
|
| 33 |
for (my $ofs = 0; $ofs < $size && !$int; $ofs += $chunk) { |
| 34 |
my $data = $track->read ($ofs, $chunk); |
| 35 |
syswrite PLAY, $data; |
| 36 |
printf " %5.2f %s / %s\r", 100 * $ofs / $size, |
| 37 |
$track->to_msf ($ofs), $track->to_msf ($size); |
| 38 |
} |
| 39 |
|
| 40 |
$int = 0; |
| 41 |
} |
| 42 |
} |
| 43 |
|
| 44 |
|