summaryrefslogtreecommitdiff
path: root/apps/codecs/aiff.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/aiff.c')
-rw-r--r--apps/codecs/aiff.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/apps/codecs/aiff.c b/apps/codecs/aiff.c
index d1bb14aa64..628f9948ea 100644
--- a/apps/codecs/aiff.c
+++ b/apps/codecs/aiff.c
@@ -51,7 +51,8 @@ enum codec_status codec_main(void)
51 uint16_t sample_size = 0; 51 uint16_t sample_size = 0;
52 uint32_t sample_rate = 0; 52 uint32_t sample_rate = 0;
53 uint32_t i; 53 uint32_t i;
54 size_t n, bufsize; 54 size_t n;
55 int bufcount;
55 int endofstream; 56 int endofstream;
56 unsigned char *buf; 57 unsigned char *buf;
57 uint8_t *aifbuf; 58 uint8_t *aifbuf;
@@ -229,25 +230,27 @@ next_track:
229 samples[i/4] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13) 230 samples[i/4] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13)
230 |(aifbuf[i + 2]<<5)|(aifbuf[i + 3]>>3); 231 |(aifbuf[i + 2]<<5)|(aifbuf[i + 3]>>3);
231 } 232 }
232 bufsize = n; 233 bufcount = n >> 2;
233 } else if (sample_size > 16) { 234 } else if (sample_size > 16) {
234 for (i = 0; i < n; i += 3) { 235 for (i = 0; i < n; i += 3) {
235 samples[i/3] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13) 236 samples[i/3] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13)
236 |(aifbuf[i + 2]<<5); 237 |(aifbuf[i + 2]<<5);
237 } 238 }
238 bufsize = n*4/3; 239 bufcount = n/3;
239 } else if (sample_size > 8) { 240 } else if (sample_size > 8) {
240 for (i = 0; i < n; i += 2) 241 for (i = 0; i < n; i += 2)
241 samples[i/2] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13); 242 samples[i/2] = (SE(aifbuf[i])<<21)|(aifbuf[i + 1]<<13);
242 bufsize = n*2; 243 bufcount = n >> 1;
243 } else { 244 } else {
244 for (i = 0; i < n; i++) 245 for (i = 0; i < n; i++)
245 samples[i] = SE(aifbuf[i]) << 21; 246 samples[i] = SE(aifbuf[i]) << 21;
246 bufsize = n*4; 247 bufcount = n;
247 } 248 }
248 249
249 while (!ci->pcmbuf_insert((char *)samples, bufsize)) 250 if (num_channels == 2)
250 ci->yield(); 251 bufcount >>= 1;
252
253 ci->pcmbuf_insert(samples, NULL, bufcount);
251 254
252 ci->advance_buffer(n); 255 ci->advance_buffer(n);
253 bytesdone += n; 256 bytesdone += n;