SDL_wave.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_wave.c,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. #ifndef DISABLE_FILE
  23. /* Microsoft WAVE file loading routines */
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include "SDL_error.h"
  27. #include "SDL_audio.h"
  28. #include "SDL_wave.h"
  29. #include "SDL_endian.h"
  30. #ifndef NELEMS
  31. #define NELEMS(array) ((sizeof array)/(sizeof array[0]))
  32. #endif
  33. static int ReadChunk(SDL_RWops *src, Chunk *chunk);
  34. struct MS_ADPCM_decodestate {
  35. Uint8 hPredictor;
  36. Uint16 iDelta;
  37. Sint16 iSamp1;
  38. Sint16 iSamp2;
  39. };
  40. static struct MS_ADPCM_decoder {
  41. WaveFMT wavefmt;
  42. Uint16 wSamplesPerBlock;
  43. Uint16 wNumCoef;
  44. Sint16 aCoeff[7][2];
  45. /* * * */
  46. struct MS_ADPCM_decodestate state[2];
  47. } MS_ADPCM_state;
  48. static int InitMS_ADPCM(WaveFMT *format)
  49. {
  50. Uint8 *rogue_feel;
  51. Uint16 extra_info;
  52. int i;
  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);
  65. }
  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");
  72. return(-1);
  73. }
  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);
  79. }
  80. return(0);
  81. }
  82. static Sint32 MS_ADPCM_nibble(struct MS_ADPCM_decodestate *state,
  83. Uint8 nybble, Sint16 *coeff)
  84. {
  85. const Sint32 max_audioval = ((1<<(16-1))-1);
  86. const Sint32 min_audioval = -(1<<(16-1));
  87. const Sint32 adaptive[] = {
  88. 230, 230, 230, 230, 307, 409, 512, 614,
  89. 768, 614, 512, 409, 307, 230, 230, 230
  90. };
  91. Sint32 new_sample, delta;
  92. new_sample = ((state->iSamp1 * coeff[0]) +
  93.       (state->iSamp2 * coeff[1]))/256;
  94. if ( nybble & 0x08 ) {
  95. new_sample += state->iDelta * (nybble-0x10);
  96. } else {
  97. new_sample += state->iDelta * nybble;
  98. }
  99. if ( new_sample < min_audioval ) {
  100. new_sample = min_audioval;
  101. } else
  102. if ( new_sample > max_audioval ) {
  103. new_sample = max_audioval;
  104. }
  105. delta = ((Sint32)state->iDelta * adaptive[nybble])/256;
  106. if ( delta < 16 ) {
  107. delta = 16;
  108. }
  109. state->iDelta = delta;
  110. state->iSamp2 = state->iSamp1;
  111. state->iSamp1 = new_sample;
  112. return(new_sample);
  113. }
  114. static int MS_ADPCM_decode(Uint8 **audio_buf, Uint32 *audio_len)
  115. {
  116. struct MS_ADPCM_decodestate *state[2];
  117. Uint8 *freeable, *encoded, *decoded;
  118. Sint32 encoded_len, samplesleft;
  119. Sint8 nybble, stereo;
  120. Sint16 *coeff[2];
  121. Sint32 new_sample;
  122. /* Allocate the proper sized output buffer */
  123. encoded_len = *audio_len;
  124. encoded = *audio_buf;
  125. freeable = *audio_buf;
  126. *audio_len = (encoded_len/MS_ADPCM_state.wavefmt.blockalign) * 
  127. MS_ADPCM_state.wSamplesPerBlock*
  128. MS_ADPCM_state.wavefmt.channels*sizeof(Sint16);
  129. *audio_buf = (Uint8 *)malloc(*audio_len);
  130. if ( *audio_buf == NULL ) {
  131. SDL_Error(SDL_ENOMEM);
  132. return(-1);
  133. }
  134. decoded = *audio_buf;
  135. /* Get ready... Go! */
  136. stereo = (MS_ADPCM_state.wavefmt.channels == 2);
  137. state[0] = &MS_ADPCM_state.state[0];
  138. state[1] = &MS_ADPCM_state.state[stereo];
  139. while ( encoded_len >= MS_ADPCM_state.wavefmt.blockalign ) {
  140. /* Grab the initial information for this block */
  141. state[0]->hPredictor = *encoded++;
  142. if ( stereo ) {
  143. state[1]->hPredictor = *encoded++;
  144. }
  145. state[0]->iDelta = ((encoded[1]<<8)|encoded[0]);
  146. encoded += sizeof(Sint16);
  147. if ( stereo ) {
  148. state[1]->iDelta = ((encoded[1]<<8)|encoded[0]);
  149. encoded += sizeof(Sint16);
  150. }
  151. state[0]->iSamp1 = ((encoded[1]<<8)|encoded[0]);
  152. encoded += sizeof(Sint16);
  153. if ( stereo ) {
  154. state[1]->iSamp1 = ((encoded[1]<<8)|encoded[0]);
  155. encoded += sizeof(Sint16);
  156. }
  157. state[0]->iSamp2 = ((encoded[1]<<8)|encoded[0]);
  158. encoded += sizeof(Sint16);
  159. if ( stereo ) {
  160. state[1]->iSamp2 = ((encoded[1]<<8)|encoded[0]);
  161. encoded += sizeof(Sint16);
  162. }
  163. coeff[0] = MS_ADPCM_state.aCoeff[state[0]->hPredictor];
  164. coeff[1] = MS_ADPCM_state.aCoeff[state[1]->hPredictor];
  165. /* Store the two initial samples we start with */
  166. decoded[0] = state[0]->iSamp2&0xFF;
  167. decoded[1] = state[0]->iSamp2>>8;
  168. decoded += 2;
  169. if ( stereo ) {
  170. decoded[0] = state[1]->iSamp2&0xFF;
  171. decoded[1] = state[1]->iSamp2>>8;
  172. decoded += 2;
  173. }
  174. decoded[0] = state[0]->iSamp1&0xFF;
  175. decoded[1] = state[0]->iSamp1>>8;
  176. decoded += 2;
  177. if ( stereo ) {
  178. decoded[0] = state[1]->iSamp1&0xFF;
  179. decoded[1] = state[1]->iSamp1>>8;
  180. decoded += 2;
  181. }
  182. /* Decode and store the other samples in this block */
  183. samplesleft = (MS_ADPCM_state.wSamplesPerBlock-2)*
  184. MS_ADPCM_state.wavefmt.channels;
  185. while ( samplesleft > 0 ) {
  186. nybble = (*encoded)>>4;
  187. new_sample = MS_ADPCM_nibble(state[0],nybble,coeff[0]);
  188. decoded[0] = new_sample&0xFF;
  189. new_sample >>= 8;
  190. decoded[1] = new_sample&0xFF;
  191. decoded += 2;
  192. nybble = (*encoded)&0x0F;
  193. new_sample = MS_ADPCM_nibble(state[1],nybble,coeff[1]);
  194. decoded[0] = new_sample&0xFF;
  195. new_sample >>= 8;
  196. decoded[1] = new_sample&0xFF;
  197. decoded += 2;
  198. ++encoded;
  199. samplesleft -= 2;
  200. }
  201. encoded_len -= MS_ADPCM_state.wavefmt.blockalign;
  202. }
  203. free(freeable);
  204. return(0);
  205. }
  206. struct IMA_ADPCM_decodestate {
  207. Sint32 sample;
  208. Sint8 index;
  209. };
  210. static struct IMA_ADPCM_decoder {
  211. WaveFMT wavefmt;
  212. Uint16 wSamplesPerBlock;
  213. /* * * */
  214. struct IMA_ADPCM_decodestate state[2];
  215. } IMA_ADPCM_state;
  216. static int InitIMA_ADPCM(WaveFMT *format)
  217. {
  218. Uint8 *rogue_feel;
  219. Uint16 extra_info;
  220. /* Set the rogue pointer to the IMA_ADPCM specific data */
  221. IMA_ADPCM_state.wavefmt.encoding = SDL_SwapLE16(format->encoding);
  222. IMA_ADPCM_state.wavefmt.channels = SDL_SwapLE16(format->channels);
  223. IMA_ADPCM_state.wavefmt.frequency = SDL_SwapLE32(format->frequency);
  224. IMA_ADPCM_state.wavefmt.byterate = SDL_SwapLE32(format->byterate);
  225. IMA_ADPCM_state.wavefmt.blockalign = SDL_SwapLE16(format->blockalign);
  226. IMA_ADPCM_state.wavefmt.bitspersample =
  227.  SDL_SwapLE16(format->bitspersample);
  228. rogue_feel = (Uint8 *)format+sizeof(*format);
  229. if ( sizeof(*format) == 16 ) {
  230. extra_info = ((rogue_feel[1]<<8)|rogue_feel[0]);
  231. rogue_feel += sizeof(Uint16);
  232. }
  233. IMA_ADPCM_state.wSamplesPerBlock = ((rogue_feel[1]<<8)|rogue_feel[0]);
  234. return(0);
  235. }
  236. static Sint32 IMA_ADPCM_nibble(struct IMA_ADPCM_decodestate *state,Uint8 nybble)
  237. {
  238. const Sint32 max_audioval = ((1<<(16-1))-1);
  239. const Sint32 min_audioval = -(1<<(16-1));
  240. const int index_table[16] = {
  241. -1, -1, -1, -1,
  242.  2,  4,  6,  8,
  243. -1, -1, -1, -1,
  244.  2,  4,  6,  8
  245. };
  246. const Sint32 step_table[89] = {
  247. 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31,
  248. 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130,
  249. 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408,
  250. 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,
  251. 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
  252. 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630,
  253. 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350,
  254. 22385, 24623, 27086, 29794, 32767
  255. };
  256. Sint32 delta, step;
  257. /* Compute difference and new sample value */
  258. step = step_table[state->index];
  259. delta = step >> 3;
  260. if ( nybble & 0x04 ) delta += step;
  261. if ( nybble & 0x02 ) delta += (step >> 1);
  262. if ( nybble & 0x01 ) delta += (step >> 2);
  263. if ( nybble & 0x08 ) delta = -delta;
  264. state->sample += delta;
  265. /* Update index value */
  266. state->index += index_table[nybble];
  267. if ( state->index > 88 ) {
  268. state->index = 88;
  269. } else
  270. if ( state->index < 0 ) {
  271. state->index = 0;
  272. }
  273. /* Clamp output sample */
  274. if ( state->sample > max_audioval ) {
  275. state->sample = max_audioval;
  276. } else
  277. if ( state->sample < min_audioval ) {
  278. state->sample = min_audioval;
  279. }
  280. return(state->sample);
  281. }
  282. /* Fill the decode buffer with a channel block of data (8 samples) */
  283. static void Fill_IMA_ADPCM_block(Uint8 *decoded, Uint8 *encoded,
  284. int channel, int numchannels, struct IMA_ADPCM_decodestate *state)
  285. {
  286. int i;
  287. Sint8 nybble;
  288. Sint32 new_sample;
  289. decoded += (channel * 2);
  290. for ( i=0; i<4; ++i ) {
  291. nybble = (*encoded)&0x0F;
  292. new_sample = IMA_ADPCM_nibble(state, nybble);
  293. decoded[0] = new_sample&0xFF;
  294. new_sample >>= 8;
  295. decoded[1] = new_sample&0xFF;
  296. decoded += 2 * numchannels;
  297. nybble = (*encoded)>>4;
  298. new_sample = IMA_ADPCM_nibble(state, nybble);
  299. decoded[0] = new_sample&0xFF;
  300. new_sample >>= 8;
  301. decoded[1] = new_sample&0xFF;
  302. decoded += 2 * numchannels;
  303. ++encoded;
  304. }
  305. }
  306. static int IMA_ADPCM_decode(Uint8 **audio_buf, Uint32 *audio_len)
  307. {
  308. struct IMA_ADPCM_decodestate *state;
  309. Uint8 *freeable, *encoded, *decoded;
  310. Sint32 encoded_len, samplesleft;
  311. int c, channels;
  312. /* Check to make sure we have enough variables in the state array */
  313. channels = IMA_ADPCM_state.wavefmt.channels;
  314. if ( channels > NELEMS(IMA_ADPCM_state.state) ) {
  315. SDL_SetError("IMA ADPCM decoder can only handle %d channels",
  316. NELEMS(IMA_ADPCM_state.state));
  317. return(-1);
  318. }
  319. state = IMA_ADPCM_state.state;
  320. /* Allocate the proper sized output buffer */
  321. encoded_len = *audio_len;
  322. encoded = *audio_buf;
  323. freeable = *audio_buf;
  324. *audio_len = (encoded_len/IMA_ADPCM_state.wavefmt.blockalign) * 
  325. IMA_ADPCM_state.wSamplesPerBlock*
  326. IMA_ADPCM_state.wavefmt.channels*sizeof(Sint16);
  327. *audio_buf = (Uint8 *)malloc(*audio_len);
  328. if ( *audio_buf == NULL ) {
  329. SDL_Error(SDL_ENOMEM);
  330. return(-1);
  331. }
  332. decoded = *audio_buf;
  333. /* Get ready... Go! */
  334. while ( encoded_len >= IMA_ADPCM_state.wavefmt.blockalign ) {
  335. /* Grab the initial information for this block */
  336. for ( c=0; c<channels; ++c ) {
  337. /* Fill the state information for this block */
  338. state[c].sample = ((encoded[1]<<8)|encoded[0]);
  339. encoded += 2;
  340. if ( state[c].sample & 0x8000 ) {
  341. state[c].sample -= 0x10000;
  342. }
  343. state[c].index = *encoded++;
  344. /* Reserved byte in buffer header, should be 0 */
  345. if ( *encoded++ != 0 ) {
  346. /* Uh oh, corrupt data?  Buggy code? */;
  347. }
  348. /* Store the initial sample we start with */
  349. decoded[0] = state[c].sample&0xFF;
  350. decoded[1] = state[c].sample>>8;
  351. decoded += 2;
  352. }
  353. /* Decode and store the other samples in this block */
  354. samplesleft = (IMA_ADPCM_state.wSamplesPerBlock-1)*channels;
  355. while ( samplesleft > 0 ) {
  356. for ( c=0; c<channels; ++c ) {
  357. Fill_IMA_ADPCM_block(decoded, encoded,
  358. c, channels, &state[c]);
  359. encoded += 4;
  360. samplesleft -= 8;
  361. }
  362. decoded += (channels * 8 * 2);
  363. }
  364. encoded_len -= IMA_ADPCM_state.wavefmt.blockalign;
  365. }
  366. free(freeable);
  367. return(0);
  368. }
  369. SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc,
  370. SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)
  371. {
  372. int was_error;
  373. Chunk chunk;
  374. int lenread;
  375. int MS_ADPCM_encoded, IMA_ADPCM_encoded;
  376. int samplesize;
  377. /* WAV magic header */
  378. Uint32 RIFFchunk;
  379. Uint32 wavelen;
  380. Uint32 WAVEmagic;
  381. /* FMT chunk */
  382. WaveFMT *format = NULL;
  383. /* Make sure we are passed a valid data source */
  384. was_error = 0;
  385. if ( src == NULL ) {
  386. was_error = 1;
  387. goto done;
  388. }
  389. /* Check the magic header */
  390. RIFFchunk = SDL_ReadLE32(src);
  391. wavelen = SDL_ReadLE32(src);
  392. if ( wavelen == WAVE ) { /* The RIFFchunk has already been read */
  393. WAVEmagic = wavelen;
  394. wavelen   = RIFFchunk;
  395. RIFFchunk = RIFF;
  396. } else {
  397. WAVEmagic = SDL_ReadLE32(src);
  398. }
  399. if ( (RIFFchunk != RIFF) || (WAVEmagic != WAVE) ) {
  400. SDL_SetError("Unrecognized file type (not WAVE)");
  401. was_error = 1;
  402. goto done;
  403. }
  404. /* Read the audio data format chunk */
  405. chunk.data = NULL;
  406. do {
  407. if ( chunk.data != NULL ) {
  408. free(chunk.data);
  409. }
  410. lenread = ReadChunk(src, &chunk);
  411. if ( lenread < 0 ) {
  412. was_error = 1;
  413. goto done;
  414. }
  415. } while ( (chunk.magic == FACT) || (chunk.magic == LIST) );
  416. /* Decode the audio data format */
  417. format = (WaveFMT *)chunk.data;
  418. if ( chunk.magic != FMT ) {
  419. SDL_SetError("Complex WAVE files not supported");
  420. was_error = 1;
  421. goto done;
  422. }
  423. MS_ADPCM_encoded = IMA_ADPCM_encoded = 0;
  424. switch (SDL_SwapLE16(format->encoding)) {
  425. case PCM_CODE:
  426. /* We can understand this */
  427. break;
  428. case MS_ADPCM_CODE:
  429. /* Try to understand this */
  430. if ( InitMS_ADPCM(format) < 0 ) {
  431. was_error = 1;
  432. goto done;
  433. }
  434. MS_ADPCM_encoded = 1;
  435. break;
  436. case IMA_ADPCM_CODE:
  437. /* Try to understand this */
  438. if ( InitIMA_ADPCM(format) < 0 ) {
  439. was_error = 1;
  440. goto done;
  441. }
  442. IMA_ADPCM_encoded = 1;
  443. break;
  444. default:
  445. SDL_SetError("Unknown WAVE data format: 0x%.4x",
  446. SDL_SwapLE16(format->encoding));
  447. was_error = 1;
  448. goto done;
  449. }
  450. memset(spec, 0, (sizeof *spec));
  451. spec->freq = SDL_SwapLE32(format->frequency);
  452. switch (SDL_SwapLE16(format->bitspersample)) {
  453. case 4:
  454. if ( MS_ADPCM_encoded || IMA_ADPCM_encoded ) {
  455. spec->format = AUDIO_S16;
  456. } else {
  457. was_error = 1;
  458. }
  459. break;
  460. case 8:
  461. spec->format = AUDIO_U8;
  462. break;
  463. case 16:
  464. spec->format = AUDIO_S16;
  465. break;
  466. default:
  467. was_error = 1;
  468. break;
  469. }
  470. if ( was_error ) {
  471. SDL_SetError("Unknown %d-bit PCM data format",
  472. SDL_SwapLE16(format->bitspersample));
  473. goto done;
  474. }
  475. spec->channels = (Uint8)SDL_SwapLE16(format->channels);
  476. spec->samples = 4096; /* Good default buffer size */
  477. /* Read the audio data chunk */
  478. *audio_buf = NULL;
  479. do {
  480. if ( *audio_buf != NULL ) {
  481. free(*audio_buf);
  482. }
  483. lenread = ReadChunk(src, &chunk);
  484. if ( lenread < 0 ) {
  485. was_error = 1;
  486. goto done;
  487. }
  488. *audio_len = lenread;
  489. *audio_buf = chunk.data;
  490. } while ( chunk.magic != DATA );
  491. if ( MS_ADPCM_encoded ) {
  492. if ( MS_ADPCM_decode(audio_buf, audio_len) < 0 ) {
  493. was_error = 1;
  494. goto done;
  495. }
  496. }
  497. if ( IMA_ADPCM_encoded ) {
  498. if ( IMA_ADPCM_decode(audio_buf, audio_len) < 0 ) {
  499. was_error = 1;
  500. goto done;
  501. }
  502. }
  503. /* Don't return a buffer that isn't a multiple of samplesize */
  504. samplesize = ((spec->format & 0xFF)/8)*spec->channels;
  505. *audio_len &= ~(samplesize-1);
  506. done:
  507. if ( format != NULL ) {
  508. free(format);
  509. }
  510. if ( freesrc && src ) {
  511. SDL_RWclose(src);
  512. }
  513. if ( was_error ) {
  514. spec = NULL;
  515. }
  516. return(spec);
  517. }
  518. /* Since the WAV memory is allocated in the shared library, it must also
  519.    be freed here.  (Necessary under Win32, VC++)
  520.  */
  521. void SDL_FreeWAV(Uint8 *audio_buf)
  522. {
  523. if ( audio_buf != NULL ) {
  524. free(audio_buf);
  525. }
  526. }
  527. static int ReadChunk(SDL_RWops *src, Chunk *chunk)
  528. {
  529. chunk->magic = SDL_ReadLE32(src);
  530. chunk->length = SDL_ReadLE32(src);
  531. chunk->data = (Uint8 *)malloc(chunk->length);
  532. if ( chunk->data == NULL ) {
  533. SDL_Error(SDL_ENOMEM);
  534. return(-1);
  535. }
  536. if ( SDL_RWread(src, chunk->data, chunk->length, 1) != 1 ) {
  537. SDL_Error(SDL_EFREAD);
  538. free(chunk->data);
  539. return(-1);
  540. }
  541. return(chunk->length);
  542. }
  543. #endif /* ENABLE_FILE */