2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2006 Sam Lantinga
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "SDL_config.h"
24 /* Microsoft WAVE file loading routines */
26 #include "SDL_audio.h"
30 static int ReadChunk(SDL_RWops
*src
, Chunk
*chunk
);
32 struct MS_ADPCM_decodestate
{
38 static struct MS_ADPCM_decoder
{
40 Uint16 wSamplesPerBlock
;
44 struct MS_ADPCM_decodestate state
[2];
47 static int InitMS_ADPCM(WaveFMT
*format
)
53 /* Set the rogue pointer to the MS_ADPCM specific data */
54 MS_ADPCM_state
.wavefmt
.encoding
= SDL_SwapLE16(format
->encoding
);
55 MS_ADPCM_state
.wavefmt
.channels
= SDL_SwapLE16(format
->channels
);
56 MS_ADPCM_state
.wavefmt
.frequency
= SDL_SwapLE32(format
->frequency
);
57 MS_ADPCM_state
.wavefmt
.byterate
= SDL_SwapLE32(format
->byterate
);
58 MS_ADPCM_state
.wavefmt
.blockalign
= SDL_SwapLE16(format
->blockalign
);
59 MS_ADPCM_state
.wavefmt
.bitspersample
=
60 SDL_SwapLE16(format
->bitspersample
);
61 rogue_feel
= (Uint8
*)format
+sizeof(*format
);
62 if ( sizeof(*format
) == 16 ) {
63 extra_info
= ((rogue_feel
[1]<<8)|rogue_feel
[0]);
64 rogue_feel
+= sizeof(Uint16
);
66 MS_ADPCM_state
.wSamplesPerBlock
= ((rogue_feel
[1]<<8)|rogue_feel
[0]);
67 rogue_feel
+= sizeof(Uint16
);
68 MS_ADPCM_state
.wNumCoef
= ((rogue_feel
[1]<<8)|rogue_feel
[0]);
69 rogue_feel
+= sizeof(Uint16
);
70 if ( MS_ADPCM_state
.wNumCoef
!= 7 ) {
71 SDL_SetError("Unknown set of MS_ADPCM coefficients");
74 for ( i
=0; i
<MS_ADPCM_state
.wNumCoef
; ++i
) {
75 MS_ADPCM_state
.aCoeff
[i
][0] = ((rogue_feel
[1]<<8)|rogue_feel
[0]);
76 rogue_feel
+= sizeof(Uint16
);
77 MS_ADPCM_state
.aCoeff
[i
][1] = ((rogue_feel
[1]<<8)|rogue_feel
[0]);
78 rogue_feel
+= sizeof(Uint16
);
83 static Sint32
MS_ADPCM_nibble(struct MS_ADPCM_decodestate
*state
,
84 Uint8 nybble
, Sint16
*coeff
)
86 const Sint32 max_audioval
= ((1<<(16-1))-1);
87 const Sint32 min_audioval
= -(1<<(16-1));
88 const Sint32 adaptive
[] = {
89 230, 230, 230, 230, 307, 409, 512, 614,
90 768, 614, 512, 409, 307, 230, 230, 230
92 Sint32 new_sample
, delta
;
94 new_sample
= ((state
->iSamp1
* coeff
[0]) +
95 (state
->iSamp2
* coeff
[1]))/256;
96 if ( nybble
& 0x08 ) {
97 new_sample
+= state
->iDelta
* (nybble
-0x10);
99 new_sample
+= state
->iDelta
* nybble
;
101 if ( new_sample
< min_audioval
) {
102 new_sample
= min_audioval
;
104 if ( new_sample
> max_audioval
) {
105 new_sample
= max_audioval
;
107 delta
= ((Sint32
)state
->iDelta
* adaptive
[nybble
])/256;
111 state
->iDelta
= (Uint16
)delta
;
112 state
->iSamp2
= state
->iSamp1
;
113 state
->iSamp1
= (Sint16
)new_sample
;
117 static int MS_ADPCM_decode(Uint8
**audio_buf
, Uint32
*audio_len
)
119 struct MS_ADPCM_decodestate
*state
[2];
120 Uint8
*freeable
, *encoded
, *decoded
;
121 Sint32 encoded_len
, samplesleft
;
122 Sint8 nybble
, stereo
;
126 /* Allocate the proper sized output buffer */
127 encoded_len
= *audio_len
;
128 encoded
= *audio_buf
;
129 freeable
= *audio_buf
;
130 *audio_len
= (encoded_len
/MS_ADPCM_state
.wavefmt
.blockalign
) *
131 MS_ADPCM_state
.wSamplesPerBlock
*
132 MS_ADPCM_state
.wavefmt
.channels
*sizeof(Sint16
);
133 *audio_buf
= (Uint8
*)SDL_malloc(*audio_len
);
134 if ( *audio_buf
== NULL
) {
135 SDL_Error(SDL_ENOMEM
);
138 decoded
= *audio_buf
;
140 /* Get ready... Go! */
141 stereo
= (MS_ADPCM_state
.wavefmt
.channels
== 2);
142 state
[0] = &MS_ADPCM_state
.state
[0];
143 state
[1] = &MS_ADPCM_state
.state
[stereo
];
144 while ( encoded_len
>= MS_ADPCM_state
.wavefmt
.blockalign
) {
145 /* Grab the initial information for this block */
146 state
[0]->hPredictor
= *encoded
++;
148 state
[1]->hPredictor
= *encoded
++;
150 state
[0]->iDelta
= ((encoded
[1]<<8)|encoded
[0]);
151 encoded
+= sizeof(Sint16
);
153 state
[1]->iDelta
= ((encoded
[1]<<8)|encoded
[0]);
154 encoded
+= sizeof(Sint16
);
156 state
[0]->iSamp1
= ((encoded
[1]<<8)|encoded
[0]);
157 encoded
+= sizeof(Sint16
);
159 state
[1]->iSamp1
= ((encoded
[1]<<8)|encoded
[0]);
160 encoded
+= sizeof(Sint16
);
162 state
[0]->iSamp2
= ((encoded
[1]<<8)|encoded
[0]);
163 encoded
+= sizeof(Sint16
);
165 state
[1]->iSamp2
= ((encoded
[1]<<8)|encoded
[0]);
166 encoded
+= sizeof(Sint16
);
168 coeff
[0] = MS_ADPCM_state
.aCoeff
[state
[0]->hPredictor
];
169 coeff
[1] = MS_ADPCM_state
.aCoeff
[state
[1]->hPredictor
];
171 /* Store the two initial samples we start with */
172 decoded
[0] = state
[0]->iSamp2
&0xFF;
173 decoded
[1] = state
[0]->iSamp2
>>8;
176 decoded
[0] = state
[1]->iSamp2
&0xFF;
177 decoded
[1] = state
[1]->iSamp2
>>8;
180 decoded
[0] = state
[0]->iSamp1
&0xFF;
181 decoded
[1] = state
[0]->iSamp1
>>8;
184 decoded
[0] = state
[1]->iSamp1
&0xFF;
185 decoded
[1] = state
[1]->iSamp1
>>8;
189 /* Decode and store the other samples in this block */
190 samplesleft
= (MS_ADPCM_state
.wSamplesPerBlock
-2)*
191 MS_ADPCM_state
.wavefmt
.channels
;
192 while ( samplesleft
> 0 ) {
193 nybble
= (*encoded
)>>4;
194 new_sample
= MS_ADPCM_nibble(state
[0],nybble
,coeff
[0]);
195 decoded
[0] = new_sample
&0xFF;
197 decoded
[1] = new_sample
&0xFF;
200 nybble
= (*encoded
)&0x0F;
201 new_sample
= MS_ADPCM_nibble(state
[1],nybble
,coeff
[1]);
202 decoded
[0] = new_sample
&0xFF;
204 decoded
[1] = new_sample
&0xFF;
210 encoded_len
-= MS_ADPCM_state
.wavefmt
.blockalign
;
216 struct IMA_ADPCM_decodestate
{
220 static struct IMA_ADPCM_decoder
{
222 Uint16 wSamplesPerBlock
;
224 struct IMA_ADPCM_decodestate state
[2];
227 static int InitIMA_ADPCM(WaveFMT
*format
)
232 /* Set the rogue pointer to the IMA_ADPCM specific data */
233 IMA_ADPCM_state
.wavefmt
.encoding
= SDL_SwapLE16(format
->encoding
);
234 IMA_ADPCM_state
.wavefmt
.channels
= SDL_SwapLE16(format
->channels
);
235 IMA_ADPCM_state
.wavefmt
.frequency
= SDL_SwapLE32(format
->frequency
);
236 IMA_ADPCM_state
.wavefmt
.byterate
= SDL_SwapLE32(format
->byterate
);
237 IMA_ADPCM_state
.wavefmt
.blockalign
= SDL_SwapLE16(format
->blockalign
);
238 IMA_ADPCM_state
.wavefmt
.bitspersample
=
239 SDL_SwapLE16(format
->bitspersample
);
240 rogue_feel
= (Uint8
*)format
+sizeof(*format
);
241 if ( sizeof(*format
) == 16 ) {
242 extra_info
= ((rogue_feel
[1]<<8)|rogue_feel
[0]);
243 rogue_feel
+= sizeof(Uint16
);
245 IMA_ADPCM_state
.wSamplesPerBlock
= ((rogue_feel
[1]<<8)|rogue_feel
[0]);
249 static Sint32
IMA_ADPCM_nibble(struct IMA_ADPCM_decodestate
*state
,Uint8 nybble
)
251 const Sint32 max_audioval
= ((1<<(16-1))-1);
252 const Sint32 min_audioval
= -(1<<(16-1));
253 const int index_table
[16] = {
259 const Sint32 step_table
[89] = {
260 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31,
261 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130,
262 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408,
263 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,
264 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
265 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630,
266 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350,
267 22385, 24623, 27086, 29794, 32767
271 /* Compute difference and new sample value */
272 step
= step_table
[state
->index
];
274 if ( nybble
& 0x04 ) delta
+= step
;
275 if ( nybble
& 0x02 ) delta
+= (step
>> 1);
276 if ( nybble
& 0x01 ) delta
+= (step
>> 2);
277 if ( nybble
& 0x08 ) delta
= -delta
;
278 state
->sample
+= delta
;
280 /* Update index value */
281 state
->index
+= index_table
[nybble
];
282 if ( state
->index
> 88 ) {
285 if ( state
->index
< 0 ) {
289 /* Clamp output sample */
290 if ( state
->sample
> max_audioval
) {
291 state
->sample
= max_audioval
;
293 if ( state
->sample
< min_audioval
) {
294 state
->sample
= min_audioval
;
296 return(state
->sample
);
299 /* Fill the decode buffer with a channel block of data (8 samples) */
300 static void Fill_IMA_ADPCM_block(Uint8
*decoded
, Uint8
*encoded
,
301 int channel
, int numchannels
, struct IMA_ADPCM_decodestate
*state
)
307 decoded
+= (channel
* 2);
308 for ( i
=0; i
<4; ++i
) {
309 nybble
= (*encoded
)&0x0F;
310 new_sample
= IMA_ADPCM_nibble(state
, nybble
);
311 decoded
[0] = new_sample
&0xFF;
313 decoded
[1] = new_sample
&0xFF;
314 decoded
+= 2 * numchannels
;
316 nybble
= (*encoded
)>>4;
317 new_sample
= IMA_ADPCM_nibble(state
, nybble
);
318 decoded
[0] = new_sample
&0xFF;
320 decoded
[1] = new_sample
&0xFF;
321 decoded
+= 2 * numchannels
;
327 static int IMA_ADPCM_decode(Uint8
**audio_buf
, Uint32
*audio_len
)
329 struct IMA_ADPCM_decodestate
*state
;
330 Uint8
*freeable
, *encoded
, *decoded
;
331 Sint32 encoded_len
, samplesleft
;
332 unsigned int c
, channels
;
334 /* Check to make sure we have enough variables in the state array */
335 channels
= IMA_ADPCM_state
.wavefmt
.channels
;
336 if ( channels
> SDL_arraysize(IMA_ADPCM_state
.state
) ) {
337 SDL_SetError("IMA ADPCM decoder can only handle %d channels",
338 SDL_arraysize(IMA_ADPCM_state
.state
));
341 state
= IMA_ADPCM_state
.state
;
343 /* Allocate the proper sized output buffer */
344 encoded_len
= *audio_len
;
345 encoded
= *audio_buf
;
346 freeable
= *audio_buf
;
347 *audio_len
= (encoded_len
/IMA_ADPCM_state
.wavefmt
.blockalign
) *
348 IMA_ADPCM_state
.wSamplesPerBlock
*
349 IMA_ADPCM_state
.wavefmt
.channels
*sizeof(Sint16
);
350 *audio_buf
= (Uint8
*)SDL_malloc(*audio_len
);
351 if ( *audio_buf
== NULL
) {
352 SDL_Error(SDL_ENOMEM
);
355 decoded
= *audio_buf
;
357 /* Get ready... Go! */
358 while ( encoded_len
>= IMA_ADPCM_state
.wavefmt
.blockalign
) {
359 /* Grab the initial information for this block */
360 for ( c
=0; c
<channels
; ++c
) {
361 /* Fill the state information for this block */
362 state
[c
].sample
= ((encoded
[1]<<8)|encoded
[0]);
364 if ( state
[c
].sample
& 0x8000 ) {
365 state
[c
].sample
-= 0x10000;
367 state
[c
].index
= *encoded
++;
368 /* Reserved byte in buffer header, should be 0 */
369 if ( *encoded
++ != 0 ) {
370 /* Uh oh, corrupt data? Buggy code? */;
373 /* Store the initial sample we start with */
374 decoded
[0] = (Uint8
)(state
[c
].sample
&0xFF);
375 decoded
[1] = (Uint8
)(state
[c
].sample
>>8);
379 /* Decode and store the other samples in this block */
380 samplesleft
= (IMA_ADPCM_state
.wSamplesPerBlock
-1)*channels
;
381 while ( samplesleft
> 0 ) {
382 for ( c
=0; c
<channels
; ++c
) {
383 Fill_IMA_ADPCM_block(decoded
, encoded
,
384 c
, channels
, &state
[c
]);
388 decoded
+= (channels
* 8 * 2);
390 encoded_len
-= IMA_ADPCM_state
.wavefmt
.blockalign
;
396 SDL_AudioSpec
* SDL_LoadWAV_RW (SDL_RWops
*src
, int freesrc
,
397 SDL_AudioSpec
*spec
, Uint8
**audio_buf
, Uint32
*audio_len
)
402 int MS_ADPCM_encoded
, IMA_ADPCM_encoded
;
405 /* WAV magic header */
409 Uint32 headerDiff
= 0;
412 WaveFMT
*format
= NULL
;
414 /* Make sure we are passed a valid data source */
421 /* Check the magic header */
422 RIFFchunk
= SDL_ReadLE32(src
);
423 wavelen
= SDL_ReadLE32(src
);
424 if ( wavelen
== WAVE
) { /* The RIFFchunk has already been read */
429 WAVEmagic
= SDL_ReadLE32(src
);
431 if ( (RIFFchunk
!= RIFF
) || (WAVEmagic
!= WAVE
) ) {
432 SDL_SetError("Unrecognized file type (not WAVE)");
436 headerDiff
+= sizeof(Uint32
); /* for WAVE */
438 /* Read the audio data format chunk */
441 if ( chunk
.data
!= NULL
) {
442 SDL_free(chunk
.data
);
444 lenread
= ReadChunk(src
, &chunk
);
449 /* 2 Uint32's for chunk header+len, plus the lenread */
450 headerDiff
+= lenread
+ 2 * sizeof(Uint32
);
451 } while ( (chunk
.magic
== FACT
) || (chunk
.magic
== LIST
) );
453 /* Decode the audio data format */
454 format
= (WaveFMT
*)chunk
.data
;
455 if ( chunk
.magic
!= FMT
) {
456 SDL_SetError("Complex WAVE files not supported");
460 MS_ADPCM_encoded
= IMA_ADPCM_encoded
= 0;
461 switch (SDL_SwapLE16(format
->encoding
)) {
463 /* We can understand this */
466 /* Try to understand this */
467 if ( InitMS_ADPCM(format
) < 0 ) {
471 MS_ADPCM_encoded
= 1;
474 /* Try to understand this */
475 if ( InitIMA_ADPCM(format
) < 0 ) {
479 IMA_ADPCM_encoded
= 1;
482 SDL_SetError("MPEG Layer 3 data not supported",
483 SDL_SwapLE16(format
->encoding
));
487 SDL_SetError("Unknown WAVE data format: 0x%.4x",
488 SDL_SwapLE16(format
->encoding
));
492 SDL_memset(spec
, 0, (sizeof *spec
));
493 spec
->freq
= SDL_SwapLE32(format
->frequency
);
494 switch (SDL_SwapLE16(format
->bitspersample
)) {
496 if ( MS_ADPCM_encoded
|| IMA_ADPCM_encoded
) {
497 spec
->format
= AUDIO_S16
;
503 spec
->format
= AUDIO_U8
;
506 spec
->format
= AUDIO_S16
;
513 SDL_SetError("Unknown %d-bit PCM data format",
514 SDL_SwapLE16(format
->bitspersample
));
517 spec
->channels
= (Uint8
)SDL_SwapLE16(format
->channels
);
518 spec
->samples
= 4096; /* Good default buffer size */
520 /* Read the audio data chunk */
523 if ( *audio_buf
!= NULL
) {
524 SDL_free(*audio_buf
);
526 lenread
= ReadChunk(src
, &chunk
);
531 *audio_len
= lenread
;
532 *audio_buf
= chunk
.data
;
533 if(chunk
.magic
!= DATA
) headerDiff
+= lenread
+ 2 * sizeof(Uint32
);
534 } while ( chunk
.magic
!= DATA
);
535 headerDiff
+= 2 * sizeof(Uint32
); /* for the data chunk and len */
537 if ( MS_ADPCM_encoded
) {
538 if ( MS_ADPCM_decode(audio_buf
, audio_len
) < 0 ) {
543 if ( IMA_ADPCM_encoded
) {
544 if ( IMA_ADPCM_decode(audio_buf
, audio_len
) < 0 ) {
550 /* Don't return a buffer that isn't a multiple of samplesize */
551 samplesize
= ((spec
->format
& 0xFF)/8)*spec
->channels
;
552 *audio_len
&= ~(samplesize
-1);
555 if ( format
!= NULL
) {
562 /* seek to the end of the file (given by the RIFF chunk) */
563 SDL_RWseek(src
, wavelen
- chunk
.length
- headerDiff
, RW_SEEK_CUR
);
572 /* Since the WAV memory is allocated in the shared library, it must also
573 be freed here. (Necessary under Win32, VC++)
575 void SDL_FreeWAV(Uint8
*audio_buf
)
577 if ( audio_buf
!= NULL
) {
582 static int ReadChunk(SDL_RWops
*src
, Chunk
*chunk
)
584 chunk
->magic
= SDL_ReadLE32(src
);
585 chunk
->length
= SDL_ReadLE32(src
);
586 chunk
->data
= (Uint8
*)SDL_malloc(chunk
->length
);
587 if ( chunk
->data
== NULL
) {
588 SDL_Error(SDL_ENOMEM
);
591 if ( SDL_RWread(src
, chunk
->data
, chunk
->length
, 1) != 1 ) {
592 SDL_Error(SDL_EFREAD
);
593 SDL_free(chunk
->data
);
596 return(chunk
->length
);