summaryrefslogtreecommitdiff
path: root/apps/codecs/aiff.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-02-07 00:51:50 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-02-07 00:51:50 +0000
commitaba6ca0881d1481b4047b2d7834d70ca2eb5c64b (patch)
tree6635b98840dcf4936b3c1ca641c00c32ea1b3e7f /apps/codecs/aiff.c
parentdd50c863e60488662dee8f28f7292389ade42bac (diff)
downloadrockbox-aba6ca0881d1481b4047b2d7834d70ca2eb5c64b.tar.gz
rockbox-aba6ca0881d1481b4047b2d7834d70ca2eb5c64b.zip
Fix resampling clicking as much as possible at the moment. 1) Upsampling clicked because of size inaccuracies returned by DSP. Fix by simplifying audio system to use per-channel sample count from codec to pcm buffer. 2) Downsampling affected by 1) and was often starting passed the end of the data when not enough was available to generate an output sample. Fix by clamping input range to last sample in buffer and using the last sample value in the buffer. A perfect fix will require a double buffering scheme on the resampler to sufficient data during small data transients on both ends at all times of the down ratio on input and the up ratio on output.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12218 a1c6a512-1295-4272-9138-f99709370657
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;