6 void slSample::autoMatch ( slDSP *dsp )
8 if ( dsp == NULL ) return ;
10 changeRate ( dsp->getRate () ) ;
11 changeBps ( dsp->getBps () ) ;
12 changeStereo ( dsp->getStereo () ) ;
15 void slSample::adjustVolume ( float vol )
17 for ( int i = 0 ; i < length ; i++ )
19 int s = (int)(((float) buffer[i] - (float) 0x80) * vol) + 0x80 ;
21 buffer [ i ] = ( s > 255 ) ? 255 :
27 void slSample::changeRate ( int r )
29 if ( r == rate ) return ;
31 int length1 = length / (getBps ()/8) ;
32 int length2 = (int) ( (float) length1 * ( (float) r / (float) rate ) ) ;
33 Uchar *buffer2 = new Uchar [ length2 ] ;
35 float step = (float) length1 / (float) length2 ;
37 for ( int i = 0 ; i < length2 / (getBps()/8); i++ )
39 float pos = (float) i * step ;
41 int p1 = (int) floor ( pos ) ;
42 int p2 = (int) ceil ( pos ) ;
46 if ( ( p1 & 1 ) != ( i & 1 ) ) { pos++ ; p1++ ; p2++ ; }
50 float ratio = pos - (float) p1 ;
52 float b1 = (getBps()==8) ?
53 (float) buffer [(p1<0)?0:(p1>=length1)?length1-1:p1] :
54 (float) ((Ushort*)buffer)[(p1<0)?0:(p1>=length1)?length1-1:p1] ;
55 float b2 = (getBps()==8) ?
56 (float) buffer [(p2<0)?0:(p2>=length1)?length1-1:p2] :
57 (float) ((Ushort*)buffer)[(p2<0)?0:(p2>=length1)?length1-1:p2] ;
59 float res = b1 * (1.0-ratio) + b2 * ratio ;
62 buffer2 [ i ] = (Uchar) ( (res < 0) ? 0 : (res > 255) ? 255 : res ) ;
64 ((Ushort *) buffer2 ) [ i ] =
65 (Ushort) ( (res < 0) ? 0 : (res > 65535) ? 65535 : res ) ;
75 void slSample::changeToUnsigned ()
79 int length2 = length / 2 ;
80 Ushort *buffer2 = (Ushort *) buffer ;
82 for ( int i = 0 ; i < length2 ; i++ )
83 buffer2 [ i ] = buffer2 [ i ] + 32768 ;
87 for ( int i = 0 ; i < length ; i++ )
88 buffer [ i ] = (buffer [ i ]>0x80) ? (buffer[i]-0x80) :
95 void slSample::changeBps ( int b )
97 if ( b == getBps () ) return ;
99 if ( b == 8 && getBps() == 16 )
102 Uchar *buffer2 = new Uchar [ length ] ;
104 for ( int i = 0 ; i < length ; i++ )
105 buffer2 [ i ] = ((Ushort *)buffer) [ i ] >> 8 ;
112 if ( b == 16 && getBps() == 8 )
114 Ushort *buffer2 = new Ushort [ length ] ;
116 for ( int i = 0 ; i < length ; i++ )
117 buffer2 [ i ] = buffer [ i ] << 8 ;
120 buffer = (Uchar *) buffer2 ;
126 void slSample::changeStereo ( int s )
128 if ( s == getStereo () )
131 if ( s && ! getStereo () )
133 if ( getBps () == 8 )
135 Uchar *buffer2 = new Uchar [ length * 2 ] ;
137 for ( int i = 0 ; i < length ; i++ )
138 buffer2 [ i*2 ] = buffer2 [ i*2+1 ] = buffer [ i ] ;
143 setStereo ( SL_TRUE ) ;
147 Ushort *buffer2 = new Ushort [ length ] ;
149 for ( int i = 0 ; i < length / 2 ; i++ )
150 buffer2 [ i*2 ] = buffer2 [ i*2+1 ] = ((Ushort *) buffer) [ i ] ;
153 buffer = (Uchar *)buffer2 ;
155 setStereo ( SL_TRUE ) ;
160 if ( getBps () == 8 )
162 Uchar *buffer2 = new Uchar [ length / 2 ] ;
164 for ( int i = 0 ; i < length ; i++ )
165 buffer2 [ i ] = ((int)buffer [ i*2 ] + (int)buffer [ i*2 + 1 ] ) / 2 ;
170 setStereo ( SL_FALSE ) ;
174 Ushort *buffer2 = new Ushort [ length / 4 ] ;
176 for ( int i = 0 ; i < length / 4 ; i++ )
177 buffer2 [ i ] = ((int)((Ushort *)buffer) [ i*2 ] +
178 (int)((Ushort *)buffer) [ i*2 + 1 ] ) / 2 ;
181 buffer = (Uchar *)buffer2 ;
183 setStereo ( SL_FALSE ) ;
189 static void swap_Ushort ( Ushort *i )
191 *i = ((*i << 8) & 0xFF00) +
192 ((*i >> 8) & 0x00FF) ;
195 static void swap_int ( int *i )
197 *i = ((*i << 24) & 0xFF000000) +
198 ((*i << 8) & 0x00FF0000) +
199 ((*i >> 8) & 0x0000FF00) +
200 ((*i >> 24) & 0x000000FF) ;
203 int slSample::loadFile ( char *fname )
205 if ( strcasecmp ( & fname [ strlen ( fname ) - 4 ], ".wav" ) == 0 )
206 return loadWavFile ( fname ) ;
208 if ( strcasecmp ( & fname [ strlen ( fname ) - 3 ], ".au" ) == 0 )
209 return loadAUFile ( fname ) ;
211 if ( strcasecmp ( & fname [ strlen ( fname ) - 3 ], ".ub" ) == 0 )
212 return loadRawFile ( fname ) ;
214 fprintf ( stderr, "slSample:loadFile: Unknown file type for '%s'.\n",
220 int slSample::loadWavFile ( char *fname )
222 int found_header = SL_FALSE ;
223 int needs_swabbing = SL_FALSE ;
229 FILE *fd = fopen ( fname, "rb" ) ;
234 "slSample: loadWavFile: Cannot open '%s' for reading.\n",
241 if ( fread ( magic, 4, 1, fd ) == -1 ||
242 magic[0] != 'R' || magic[1] != 'I' ||
243 magic[2] != 'F' || magic[3] != 'F' )
245 fprintf ( stderr, "slWavSample: File '%s' has wrong magic number\n", fname ) ;
246 fprintf ( stderr, " - it probably isn't in '.wav' format.\n" ) ;
253 if ( fread ( & leng1, sizeof(int), 1, fd ) == -1 )
255 fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ;
260 fread ( magic, 4, 1, fd ) ;
262 if ( magic[0] != 'W' || magic[1] != 'A' ||
263 magic[2] != 'V' || magic[3] != 'E' )
265 fprintf ( stderr, "slSample: File '%s' has no WAVE tag.\n", fname ) ;
270 while ( ! feof ( fd ) )
272 fread ( magic, 4, 1, fd ) ;
274 if ( magic[0] == 'f' && magic[1] == 'm' &&
275 magic[2] == 't' && magic[3] == ' ' )
277 found_header = SL_TRUE ;
279 if ( fread ( & leng1, sizeof(int), 1, fd ) == -1 )
281 fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ;
288 needs_swabbing = SL_TRUE ;
289 swap_int ( & leng1 ) ;
292 Ushort header [ 8 ] ;
294 if ( leng1 != sizeof ( header ) )
296 "slSample: File '%s' has unexpectedly long (%d byte) header\n",
299 fread ( & header, sizeof(header), 1, fd ) ;
301 for ( int junk = sizeof(header) ; junk < leng1 ; junk++ )
304 if ( needs_swabbing )
306 swap_Ushort ( & header[0] ) ;
307 swap_Ushort ( & header[1] ) ;
308 swap_int ( (int *) & header[2] ) ;
309 swap_int ( (int *) & header[4] ) ;
310 swap_Ushort ( & header[6] ) ;
311 swap_Ushort ( & header[7] ) ;
314 if ( header [ 0 ] != 0x0001 )
316 fprintf ( stderr, "slSample: File '%s' is not WAVE_FORMAT_PCM!\n", fname ) ;
321 setStereo ( header[1] > 1 ) ;
322 setRate ( *((int *) (& header[2])) ) ;
323 setBps ( header[7] ) ;
326 if ( magic[0] == 'd' && magic[1] == 'a' &&
327 magic[2] == 't' && magic[3] == 'a' )
329 if ( ! found_header )
331 fprintf ( stderr, "slSample: File '%s' has no data section\n", fname ) ;
336 if ( fread ( & length, sizeof(int), 1, fd ) == -1 )
338 fprintf ( stderr, "slSample: File '%s' has premature EOF in data\n", fname ) ;
343 if ( needs_swabbing )
344 swap_int ( & length ) ;
346 buffer = new Uchar [ length ] ;
348 fread ( buffer, 1, length, fd ) ;
350 if ( getBps () == 16 )
352 Ushort *b = (Ushort*) buffer ;
354 for ( int i = 0 ; i < length/2 ; i++ )
355 b [ i ] = (Ushort) ( (int)((short) b [ i ]) + 32768 ) ;
367 int slSample::loadAUFile ( char *fname )
373 FILE *fd = fopen ( fname, "rb" ) ;
378 "slSample: loadAUFile: Cannot open '%s' for reading.\n",
385 if ( fread ( magic, 4, 1, fd ) == -1 ||
386 magic[0] != '.' || magic[1] != 's' ||
387 magic[2] != 'n' || magic[3] != 'd' )
389 fprintf ( stderr, "slSample: File '%s' has wrong magic number\n", fname ) ;
390 fprintf ( stderr, " - it probably isn't in '.au' format.\n" ) ;
401 if ( fread ( & hdr_length, sizeof(int), 1, fd ) == -1 ||
402 fread ( & dat_length, sizeof(int), 1, fd ) == -1 ||
403 fread ( & nbytes , sizeof(int), 1, fd ) == -1 ||
404 fread ( & irate , sizeof(int), 1, fd ) == -1 ||
405 fread ( & nchans , sizeof(int), 1, fd ) == -1 )
407 fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ;
412 if ( hdr_length > 65536 )
414 swap_int ( & hdr_length ) ;
415 swap_int ( & dat_length ) ;
416 swap_int ( & nbytes ) ;
417 swap_int ( & irate ) ;
418 swap_int ( & nchans ) ;
422 stereo = (nchans>1) ;
425 if ( nbytes > 2 || nbytes <= 0 || hdr_length > 512 || hdr_length < 24 ||
426 irate > 65526 || irate <= 1000 || nchans < 1 || nchans > 2 )
428 fprintf ( stderr, "slSample: File '%s' has a very strange header\n", fname ) ;
430 fprintf ( stderr, " Header Length = %d\n", hdr_length ) ;
431 fprintf ( stderr, " Data Length = %d\n", dat_length ) ;
432 fprintf ( stderr, " Bytes/sample = %d\n", nbytes ) ;
433 fprintf ( stderr, " Sampling Rate = %dHz\n",irate ) ;
434 fprintf ( stderr, " Num Channels = %d\n", nchans ) ;
435 fprintf ( stderr, "\n" ) ;
440 if ( hdr_length > 24 )
443 comment = new char [ hdr_length - 24 + 1 ] ;
445 fread ( comment, 1, hdr_length - 24, fd ) ;
448 if ( dat_length > 0 )
450 buffer = new Uchar [ dat_length ] ;
451 length = fread ( buffer, 1, dat_length, fd ) ;
453 if ( length != dat_length )
454 fprintf ( stderr, "slAUSample: File '%s' has premature EOF in data.\n", fname ) ;
462 int slSample::loadRawFile ( char *fname )
468 FILE *fd = fopen ( fname, "rb" ) ;
473 "slSample: loadRawFile: Cannot open '%s' for reading.\n",
478 struct stat stat_buf ;
480 if ( fstat ( fileno ( fd ), & stat_buf ) != 0 )
483 "slSample: loadRawFile: Cannot get status for '%s'.\n",
489 length = stat_buf . st_size ;
493 buffer = new Uchar [ length ] ;
494 length = fread ( buffer, 1, length, fd ) ;
499 rate = 8000 ; /* Guess */