diff options
Diffstat (limited to 'apps/codecs/wav.c')
-rw-r--r-- | apps/codecs/wav.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/apps/codecs/wav.c b/apps/codecs/wav.c index 26cbf7f6a1..ec268a3a2b 100644 --- a/apps/codecs/wav.c +++ b/apps/codecs/wav.c | |||
@@ -212,7 +212,8 @@ enum codec_status codec_main(void) | |||
212 | int bytespersample = 0; | 212 | int bytespersample = 0; |
213 | uint16_t bitspersample; | 213 | uint16_t bitspersample; |
214 | uint32_t i; | 214 | uint32_t i; |
215 | size_t n, bufsize; | 215 | size_t n; |
216 | int bufcount; | ||
216 | int endofstream; | 217 | int endofstream; |
217 | unsigned char *buf; | 218 | unsigned char *buf; |
218 | uint8_t *wavbuf; | 219 | uint8_t *wavbuf; |
@@ -466,34 +467,39 @@ next_track: | |||
466 | (wavbuf[i + 1]<<5)|(wavbuf[i + 2]<<13)| | 467 | (wavbuf[i + 1]<<5)|(wavbuf[i + 2]<<13)| |
467 | (SE(wavbuf[i + 3])<<21); | 468 | (SE(wavbuf[i + 3])<<21); |
468 | } | 469 | } |
469 | bufsize = n; | 470 | bufcount = n >> 2; |
470 | } else if (bitspersample > 16) { | 471 | } else if (bitspersample > 16) { |
471 | for (i = 0; i < n; i += 3) { | 472 | for (i = 0; i < n; i += 3) { |
472 | samples[i/3] = (wavbuf[i]<<5)| | 473 | samples[i/3] = (wavbuf[i]<<5)| |
473 | (wavbuf[i + 1]<<13)|(SE(wavbuf[i + 2])<<21); | 474 | (wavbuf[i + 1]<<13)|(SE(wavbuf[i + 2])<<21); |
474 | } | 475 | } |
475 | bufsize = n*4/3; | 476 | bufcount = n/3; |
476 | } else if (bitspersample > 8) { | 477 | } else if (bitspersample > 8) { |
477 | for (i = 0; i < n; i += 2) { | 478 | for (i = 0; i < n; i += 2) { |
478 | samples[i/2] = (wavbuf[i]<<13)|(SE(wavbuf[i + 1])<<21); | 479 | samples[i/2] = (wavbuf[i]<<13)|(SE(wavbuf[i + 1])<<21); |
479 | } | 480 | } |
480 | bufsize = n*2; | 481 | bufcount = n >> 1; |
481 | } else { | 482 | } else { |
482 | for (i = 0; i < n; i++) { | 483 | for (i = 0; i < n; i++) { |
483 | samples[i] = (wavbuf[i] - 0x80)<<21; | 484 | samples[i] = (wavbuf[i] - 0x80)<<21; |
484 | } | 485 | } |
485 | bufsize = n*4; | 486 | bufcount = n; |
486 | } | 487 | } |
488 | |||
489 | if (channels == 2) | ||
490 | bufcount >>= 1; | ||
487 | } else if (formattag == WAVE_FORMAT_ALAW | 491 | } else if (formattag == WAVE_FORMAT_ALAW |
488 | || formattag == IBM_FORMAT_ALAW) { | 492 | || formattag == IBM_FORMAT_ALAW) { |
489 | for (i = 0; i < n; i++) | 493 | for (i = 0; i < n; i++) |
490 | samples[i] = alaw2linear16[wavbuf[i]] << 13; | 494 | samples[i] = alaw2linear16[wavbuf[i]] << 13; |
491 | bufsize = n*4; | 495 | |
496 | bufcount = (channels == 2) ? (n >> 1) : n; | ||
492 | } else if (formattag == WAVE_FORMAT_MULAW | 497 | } else if (formattag == WAVE_FORMAT_MULAW |
493 | || formattag == IBM_FORMAT_MULAW) { | 498 | || formattag == IBM_FORMAT_MULAW) { |
494 | for (i = 0; i < n; i++) | 499 | for (i = 0; i < n; i++) |
495 | samples[i] = ulaw2linear16[wavbuf[i]] << 13; | 500 | samples[i] = ulaw2linear16[wavbuf[i]] << 13; |
496 | bufsize = n*4; | 501 | |
502 | bufcount = (channels == 2) ? (n >> 1) : n; | ||
497 | } | 503 | } |
498 | else if (formattag == WAVE_FORMAT_DVI_ADPCM) { | 504 | else if (formattag == WAVE_FORMAT_DVI_ADPCM) { |
499 | unsigned int nblocks = chunksize/blockalign; | 505 | unsigned int nblocks = chunksize/blockalign; |
@@ -508,15 +514,14 @@ next_track: | |||
508 | goto done; | 514 | goto done; |
509 | } | 515 | } |
510 | } | 516 | } |
511 | bufsize = nblocks*samplesperblock*channels*4; | 517 | bufcount = nblocks*samplesperblock; |
512 | } else { | 518 | } else { |
513 | DEBUGF("CODEC_ERROR: unsupported format %x\n", formattag); | 519 | DEBUGF("CODEC_ERROR: unsupported format %x\n", formattag); |
514 | i = CODEC_ERROR; | 520 | i = CODEC_ERROR; |
515 | goto done; | 521 | goto done; |
516 | } | 522 | } |
517 | 523 | ||
518 | while (!ci->pcmbuf_insert((char *)samples, bufsize)) | 524 | ci->pcmbuf_insert(samples, NULL, bufcount); |
519 | ci->yield(); | ||
520 | 525 | ||
521 | ci->advance_buffer(n); | 526 | ci->advance_buffer(n); |
522 | bytesdone += n; | 527 | bytesdone += n; |