comparison src/audio/sdlgenaudiocvt.pl @ 2011:b2b7154ce016

Fixed broken audio conversions between float and unsigned datatypes.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 01 Sep 2006 18:07:41 +0000
parents 8055185ae4ed
children 99210400e8b9
comparison
equal deleted inserted replaced
2010:39897da56f63 2011:b2b7154ce016
52 52
53 /* *INDENT-OFF* */ 53 /* *INDENT-OFF* */
54 54
55 EOF 55 EOF
56 56
57 my @vals = ( 127, 255, 32767, 65535, 2147483647 ); 57 my @vals = ( 127, 32767, 2147483647 );
58 foreach (@vals) { 58 foreach (@vals) {
59 my $val = $_; 59 my $val = $_;
60 my $fval = 1.0 / $val; 60 my $fval = 1.0 / $val;
61 print("#define DIVBY${val} ${fval}f\n"); 61 print("#define DIVBY${val} ${fval}f\n");
62 } 62 }
111 return "${code}"; 111 return "${code}";
112 } 112 }
113 113
114 114
115 sub maxIntVal { 115 sub maxIntVal {
116 my ($signed, $size) = @_; 116 my $size = shift;
117 if ($signed) { 117 if ($size == 8) {
118 if ($size == 8) { 118 return 0x7F;
119 return 0x7F; 119 } elsif ($size == 16) {
120 } elsif ($size == 16) { 120 return 0x7FFF;
121 return 0x7FFF; 121 } elsif ($size == 32) {
122 } elsif ($size == 32) { 122 return 0x7FFFFFFF;
123 return 0x7FFFFFFF;
124 }
125 } else {
126 if ($size == 8) {
127 return 0xFF;
128 } elsif ($size == 16) {
129 return 0xFFFF;
130 } elsif ($size == 32) {
131 return 0xFFFFFFFF;
132 }
133 } 123 }
134 124
135 die("bug in script.\n"); 125 die("bug in script.\n");
136 } 126 }
137 127
138 sub getFloatToIntMult { 128 sub getFloatToIntMult {
139 my ($signed, $size) = @_; 129 my $size = shift;
140 my $val = maxIntVal($signed, $size) . '.0'; 130 my $val = maxIntVal($size) . '.0';
141 $val .= 'f' if ($size < 32); 131 $val .= 'f' if ($size < 32);
142 return $val; 132 return $val;
143 } 133 }
144 134
145 sub getIntToFloatDivBy { 135 sub getIntToFloatDivBy {
146 my ($signed, $size) = @_; 136 my $size = shift;
147 return 'DIVBY' . maxIntVal($signed, $size); 137 return 'DIVBY' . maxIntVal($size);
148 } 138 }
149 139
150 sub getSignFlipVal { 140 sub getSignFlipVal {
151 my $size = shift; 141 my $size = shift;
152 if ($size == 8) { 142 if ($size == 8) {
213 # Have to convert to/from float/int. 203 # Have to convert to/from float/int.
214 # !!! FIXME: cast through double for int32<->float? 204 # !!! FIXME: cast through double for int32<->float?
215 my $code = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, '*src'); 205 my $code = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, '*src');
216 if ($ffloat != $tfloat) { 206 if ($ffloat != $tfloat) {
217 if ($ffloat) { 207 if ($ffloat) {
218 my $mult = getFloatToIntMult($tsigned, $tsize); 208 my $mult = getFloatToIntMult($tsize);
209 if (!$tsigned) { # bump from -1.0f/1.0f to 0.0f/2.0f
210 $code = "($code + 1.0f)";
211 }
219 $code = "(($tctype) ($code * $mult))"; 212 $code = "(($tctype) ($code * $mult))";
220 } else { 213 } else {
221 # $divby will be the reciprocal, to avoid pipeline stalls 214 # $divby will be the reciprocal, to avoid pipeline stalls
222 # from floating point division...so multiply it. 215 # from floating point division...so multiply it.
223 my $divby = getIntToFloatDivBy($fsigned, $fsize); 216 my $divby = getIntToFloatDivBy($fsize);
224 $code = "(((float) $code) * $divby)"; 217 $code = "(((float) $code) * $divby)";
218 if (!$fsigned) { # bump from 0.0f/2.0f to -1.0f/1.0f.
219 $code = "($code - 1.0f)";
220 }
225 } 221 }
226 } else { 222 } else {
227 # All integer conversions here. 223 # All integer conversions here.
228 if ($fsigned != $tsigned) { 224 if ($fsigned != $tsigned) {
229 my $signflipval = getSignFlipVal($fsize); 225 my $signflipval = getSignFlipVal($fsize);