comparison src/audio/SDL_wave.c @ 1994:6abc7e6f9817

Added int32 adn float32 support to SDL_LoadWAV_RW().
author Ryan C. Gordon <icculus@icculus.org>
date Thu, 31 Aug 2006 21:00:10 +0000
parents c121d94672cb
children 575d5c9d4db8
comparison
equal deleted inserted replaced
1993:7a3889fc9e5d 1994:6abc7e6f9817
411 SDL_AudioSpec * spec, Uint8 ** audio_buf, Uint32 * audio_len) 411 SDL_AudioSpec * spec, Uint8 ** audio_buf, Uint32 * audio_len)
412 { 412 {
413 int was_error; 413 int was_error;
414 Chunk chunk; 414 Chunk chunk;
415 int lenread; 415 int lenread;
416 int MS_ADPCM_encoded, IMA_ADPCM_encoded; 416 int IEEE_float_encoded, MS_ADPCM_encoded, IMA_ADPCM_encoded;
417 int samplesize; 417 int samplesize;
418 418
419 /* WAV magic header */ 419 /* WAV magic header */
420 Uint32 RIFFchunk; 420 Uint32 RIFFchunk;
421 Uint32 wavelen = 0; 421 Uint32 wavelen = 0;
470 if (chunk.magic != FMT) { 470 if (chunk.magic != FMT) {
471 SDL_SetError("Complex WAVE files not supported"); 471 SDL_SetError("Complex WAVE files not supported");
472 was_error = 1; 472 was_error = 1;
473 goto done; 473 goto done;
474 } 474 }
475 MS_ADPCM_encoded = IMA_ADPCM_encoded = 0; 475 IEEE_float_encoded = MS_ADPCM_encoded = IMA_ADPCM_encoded = 0;
476 switch (SDL_SwapLE16(format->encoding)) { 476 switch (SDL_SwapLE16(format->encoding)) {
477 case PCM_CODE: 477 case PCM_CODE:
478 /* We can understand this */
479 break;
480 case IEEE_FLOAT_CODE:
481 IEEE_float_encoded = 1;
478 /* We can understand this */ 482 /* We can understand this */
479 break; 483 break;
480 case MS_ADPCM_CODE: 484 case MS_ADPCM_CODE:
481 /* Try to understand this */ 485 /* Try to understand this */
482 if (InitMS_ADPCM(format) < 0) { 486 if (InitMS_ADPCM(format) < 0) {
504 was_error = 1; 508 was_error = 1;
505 goto done; 509 goto done;
506 } 510 }
507 SDL_memset(spec, 0, (sizeof *spec)); 511 SDL_memset(spec, 0, (sizeof *spec));
508 spec->freq = SDL_SwapLE32(format->frequency); 512 spec->freq = SDL_SwapLE32(format->frequency);
509 switch (SDL_SwapLE16(format->bitspersample)) { 513
510 case 4: 514 if (IEEE_float_encoded) {
511 if (MS_ADPCM_encoded || IMA_ADPCM_encoded) { 515 if ((SDL_SwapLE16(format->bitspersample)) != 32) {
516 was_error = 1;
517 } else {
518 spec->format = AUDIO_F32;
519 }
520 } else {
521 switch (SDL_SwapLE16(format->bitspersample)) {
522 case 4:
523 if (MS_ADPCM_encoded || IMA_ADPCM_encoded) {
524 spec->format = AUDIO_S16;
525 } else {
526 was_error = 1;
527 }
528 break;
529 case 8:
530 spec->format = AUDIO_U8;
531 break;
532 case 16:
512 spec->format = AUDIO_S16; 533 spec->format = AUDIO_S16;
513 } else { 534 break;
514 was_error = 1; 535 case 32:
515 } 536 spec->format = AUDIO_S32;
516 break; 537 break;
517 case 8: 538 default:
518 spec->format = AUDIO_U8; 539 was_error = 1;
519 break; 540 break;
520 case 16: 541 }
521 spec->format = AUDIO_S16; 542 }
522 break; 543
523 default:
524 was_error = 1;
525 break;
526 }
527 if (was_error) { 544 if (was_error) {
528 SDL_SetError("Unknown %d-bit PCM data format", 545 SDL_SetError("Unknown %d-bit PCM data format",
529 SDL_SwapLE16(format->bitspersample)); 546 SDL_SwapLE16(format->bitspersample));
530 goto done; 547 goto done;
531 } 548 }