Blame view

tools/sph2pipe_v2.5/test/test_all.pl 3.87 KB
8dcb6dfcb   Yannick Estève   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  #!/usr/bin/env perl
  
  # Test plan to verify sph2pipe (v2.4)
  
  # We start with 7 distinct input files:
  
  # 123_2pcle_shn.sph -- 2 channel, little-endian PCM, shorten-compressed
  # 123_2pcbe_shn.sph -- 2 channel, big-endian PCM, shorten-compressed
  # 123_1pcle_shn.sph -- 1 channel, little-endian PCM, shorten-compressed
  # 123_1pcbe_shn.sph -- 1 channel, big-endian PCM, shorten-compressed
  # 123_2ulaw_shn.sph -- 2 channel, ulaw, shorten-compressed
  # 123_1ulaw_shn.sph -- 1 channel, ulaw, shorten-compressed
  # 123_2alaw.sph     -- 2 channel, alaw (shorten does not apply to alaw)
  
  # We'll test these groups of conditions in all possible combinations:
  
  # 8 input format types: pcm-BE-shn, pcm-LE-shn, ulaw-shn,
  #                       pcm-BE, pcm-LE, ulaw, alaw, alaw with external header
  # 2 input channel types: single-channel, two-channel
  
  # 3 output range selections: full-file, -t bsec:esec, -s bsmp:esmp
  # 3 output channel selections: both-channels, channel-A, channel-B
  
  # That's 144 combinations to test, for each of the following
  # conditions of output format and sample type:
  
  # 3 raw: alaw, ulaw, pcm-NATIVE (i.e. byte-order of current cpu)
  # 3 sph: alaw, ulaw, pcm-NATIVE
  # 3 wav: alaw, ulaw, pcm-LE
  # 2 au:  ulaw, pcm-BE
  # 1 aif: pcm-BE
  
  # That's 12 output types * 144 combinations per type = 1728 tests to run
  # plus 7 more, to cover the following extra cases:
  
  # - an extra-long sphere header (2 runs)
  # - final colon in the -t and -s opions (2 runs)
  # - initial colon in the -t and -s options (2 runs)
  # - redirection to a file vs. named output file (1 run)
  
  # The chosen test file has a sample_rate of 20_000, so we'll simplify
  # the -t and -s range tests by using equivalent ranges: '-t 0.9:1.2'
  # and '-s 18000:24000' should produce the same output.
  
  use Digest::MD5;
  
  my @t_opts = ( '', '-t 0.9:1.2', '-s 18000:24000' );
  my @c_opts = ( '', '-c 1', '-c 2' );
  my @f_opts = ( '-f sph -p', '-f sph -u', '-f sph -a',
  	       '-f raw -p', '-f raw -u', '-f raw -a',
  	       '-f wav -p', '-f wav -u', '-f wav -a',
  	       '-f au -p',  '-f au -u',  '-f aif' );
  
  my @shn_inputs = ( qw/
  		  123_1pcle_shn.sph 123_2pcle_shn.sph
  		  123_1pcbe_shn.sph 123_2pcbe_shn.sph
  		  123_1ulaw_shn.sph 123_2ulaw_shn.sph
  		  / );
  my @unc_inputs = ( qw/
  		  123_1pcle.sph 123_2pcle.sph
  		  123_1pcbe.sph 123_2pcbe.sph
  		  123_1ulaw.sph 123_2ulaw.sph
  		  123_1alaw.sph 123_2alaw.sph
  		  / );
  my @raw_inputs = ( qw/
  		  123_1alaw.raw  123_2alaw.raw
  		  / );
  
  open( my $SH, "| /bin/sh" ) or die "can't start sub-shell /bin/sh: $!";
  open( my $CKSUMS, ">outfile-md5.list" ) or die "can't write md5 file: $!";
  
  my $s2p = "./sph2pipe";
  my %output_map;
  
  for my $i ( 0..$#shn_inputs ) {
      print_SH( "$s2p -f sph $shn_inputs[$i] $unc_inputs[$i]
  " );
  }
  print_SH( "$s2p -f sph -c 1 123_2alaw.sph 123_1alaw.sph
  " );
  print_SH( "$s2p -f raw 123_1alaw.sph 123_1alaw.raw
  " );
  print_SH( "$s2p -f raw 123_2alaw.sph 123_2alaw.raw
  " );
  
  my $out = "0000";
  
  for my $f ( @f_opts ) {
      my $ext = ( split( / /, $f ))[1];
      for my $c ( @c_opts ) {
  	for my $t ( @t_opts ) {
  	    for my $in ( @shn_inputs, @unc_inputs ) {
  		$out++;
  		print_SH( "$s2p $f $c $t $in $out.$ext
  " );
  	    }
  	    for my $in ( @raw_inputs ) {
  		my ( $nc ) = ( $in =~ /_([12])/ ); 
  		$out++;
  		print_SH( "$s2p $f $c $t -h std$nc.hdr $in $out.$ext
  " );
  		$out++;
  		print_SH( "$s2p $f $c $t -h big$nc.hdr $in $out.$ext
  " );
  	    }
  	}
      }
  }
  close $SH;
  
  my $md5 = Digest::MD5->new;
  for my $f ( sort keys %output_map ) {
      $md5->reset;
      if ( -s $f > 0 ) {
          open( my $CHK, $f );
      	printf $CKSUMS ( "%s %-8s <- %s
  ", $md5->addfile( $CHK )->b64digest,
  	       	         $f, $output_map{$f} );
      	close $CHK;
      } else {
  	warn "$output_map{$f} -> $f: zero-length output
  " unless -s $f;
      }
  }
  
  sub print_SH
  {
      my @cmd = split( ' ', $_[0] );
      my $msg = join " ", @cmd[1..$#cmd];
      my $outname = pop @cmd;
      $output_map{$outname} = pop @cmd;
  
      print $SH "echo $msg
  ";
      print $SH $_[0];
  }