From 7bfdd334bf382c82f94fb0f4490a22bf93a5a0e6 Mon Sep 17 00:00:00 2001 From: Alexey Yakovenko Date: Sat, 19 Sep 2009 12:04:48 +0200 Subject: fixed start-stutter in ape decoder --- plugins/ffap/ffap.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'plugins/ffap') diff --git a/plugins/ffap/ffap.c b/plugins/ffap/ffap.c index f995f9b2..99141fd2 100644 --- a/plugins/ffap/ffap.c +++ b/plugins/ffap/ffap.c @@ -261,6 +261,9 @@ typedef struct APEContext { int samplestoskip; int currentsample; // current sample from beginning of file + uint8_t buffer[BLOCKS_PER_LOOP * 2 * 2 * 2]; + int remaining; + int error; } APEContext; @@ -1672,9 +1675,6 @@ ffap_insert (DB_playItem_t *after, const char *fname) { return after; } -static uint8_t g_buffer[BLOCKS_PER_LOOP * 2 * 2 * 2]; -static int remaining = 0; - static int ffap_read_int16 (char *buffer, int size) { int inits = size; @@ -1682,35 +1682,35 @@ ffap_read_int16 (char *buffer, int size) { return 0; } while (size > 0) { - if (remaining > 0) { - int sz = min (size, remaining); - memcpy (buffer, g_buffer, sz); + if (ape_ctx.remaining > 0) { + int sz = min (size, ape_ctx.remaining); + memcpy (buffer, ape_ctx.buffer, sz); buffer += sz; size -= sz; - if (remaining > sz) { - memmove (g_buffer, g_buffer + sz, remaining-sz); + if (ape_ctx.remaining > sz) { + memmove (ape_ctx.buffer, ape_ctx.buffer + sz, ape_ctx.remaining-sz); } - remaining -= sz; + ape_ctx.remaining -= sz; continue; } int s = BLOCKS_PER_LOOP * 2 * 2 * 2; - assert (remaining <= s/2); - s -= remaining; - uint8_t *buf = g_buffer + remaining; + assert (ape_ctx.remaining <= s/2); + s -= ape_ctx.remaining; + uint8_t *buf = ape_ctx.buffer + ape_ctx.remaining; int n = ape_decode_frame (&ape_ctx, buf, &s); if (n == -1) { break; } - remaining += s; + ape_ctx.remaining += s; - int sz = min (size, remaining); - memcpy (buffer, g_buffer, sz); + int sz = min (size, ape_ctx.remaining); + memcpy (buffer, ape_ctx.buffer, sz); buffer += sz; size -= sz; - if (remaining > sz) { - memmove (g_buffer, g_buffer + sz, remaining-sz); + if (ape_ctx.remaining > sz) { + memmove (ape_ctx.buffer, ape_ctx.buffer + sz, ape_ctx.remaining-sz); } - remaining -= sz; + ape_ctx.remaining -= sz; } plugin.info.readpos = ape_ctx.currentsample / (float)plugin.info.samplerate - timestart; return inits - size; -- cgit v1.2.3