summaryrefslogtreecommitdiff
path: root/apps/codecs/wav.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/wav.c')
-rw-r--r--apps/codecs/wav.c25
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;