The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;
use DoubleBlind;

# perl -Mblib=J:\test-programs\perl\modules\DoubleBlind J:\test-programs\perl\modules\DoubleBlind\ex.pl starttrack=1 tracks=6 first_meth=0 >& xx

# It is important to redirect output, since it hints on what is happening
# Moreover, it makes sense to do
#  touch o/*
# afterward to avoid (possibly revealing) gaps in creation time

sub lame ($$$) {
  my($from, $to, $opts) = (shift, shift, shift);
  system qw(lame -h), @$opts, $from, 'tmp.mp3' and die "call lame: $!";
  system qw(lame --decode), 'tmp.mp3', $to and die "call lame: $!";
  unlink 'tmp.mp3' or die "unlink: $!";
}

sub ogg ($$$) {
  my($from, $to, $opts) = (shift, shift, shift);
  system qw(oggenc -o), 'tmp.ogg', @$opts, $from and die "call lame: $!";
  system qw(oggdec -o), $to, 'tmp.ogg' and die "call lame: $!";
  unlink 'tmp.ogg' or die "unlink: $!";
}

sub by_cp ($$$) {
  my($from, $to, $opts) = (shift, shift, shift);
  #use File::Copy 'copy';
  #copy $from, $to or die;	# Won't update time, so differs from the rest...
  system qw(cp), $from, $to and die "call cp: $!"; # Update time, as others do
}

my @meth = (
  [\&by_cp, [qw[]]],
  [\&ogg,  [qw[--quality 10]]],
  [\&ogg,  [qw[--quality 9]]],
  [\&lame, [qw[--preset insane]]],
  [\&lame, [qw[--preset extreme]]],
  [\&lame, [qw[--preset standard]]],
);

sub recode ($$$) {
  my ($file, $method, $label) = (shift, shift, shift, shift);
  $method = $meth[$method];
  (my $ofile = $file) =~ s,^(.*[/\\]|),${1}o/, or die;
  $method->[0]->($file, $ofile, $method->[1]);
}


die <<EOD
Usage: $0 starttrack=T tracks=N first_meth=M
  T >= 1, N, M >= 0 are numbers.  N tracks are processed, with methods M..M+N-1
EOD
   unless @ARGV == 3
	 and my($tr) = ($ARGV[0] =~ /^starttrack=(\d+)$/)
	 and my($nt) = ($ARGV[1] =~ /^tracks=(\d+)$/)
	 and my($fm) = ($ARGV[2] =~ /^first_meth=(\d+)$/);

open F, '>> tracks-labels' or die;
sub cb($$$) { my ($n, $id, $label) = (shift, shift, shift);
	      $n += $tr - 1;
	      print F "track=$n\t==>\t$label\n";
              recode sprintf('audio_%02d.wav', $n), $id, $label}
print DoubleBlind::process_shuffled \&cb, 6, 0;
close F or die;

# The double-blind labels are appended to the file `tracks-labels'.

# Reading and writing:

# readcd -fulltoc dev=0,1,0 -f=audio_cd >&nul && cdda2wav dev=0,1,0 cddb=0 -bulk

# Keep in mind that re-encoding creates audio files with length
# NOT proportional to the audio sector size.  In particular, one needs to
# add -pad option to cdrecord, and redirect warnings - otherwise warnings
# will make it clear which audio files are just copied, and which are
# re-encoded.  (Manually copy .inf files if needed for the following:)

# cdrecord driveropts=burnfree -fs=64m dev=0,1,0 -pad -dao -useinfo -text -audio *.wav >& cdrec-out

# Look for errors and the list of written tracks (and no other HINTS!) by
#   grep Track cdrec-out
#   grep -A5 -i error cdrec-out