diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-09-19 12:04:48 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-09-19 14:16:29 +0200 |
commit | 7776caa805e78d78b6928fd06af6798de9ab840e (patch) | |
tree | 6b44ee37c2e65c8f6b6831c3f988c29bdd372906 /plugins | |
parent | 1d7420a0e017b242f3471549db245c84cab822e8 (diff) |
fixed start-stutter in ape decoder
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/ffap/ffap.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/plugins/ffap/ffap.c b/plugins/ffap/ffap.c index 8e7d0748..edd65ff6 100644 --- a/plugins/ffap/ffap.c +++ b/plugins/ffap/ffap.c @@ -256,6 +256,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; @@ -1662,9 +1665,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; @@ -1672,35 +1672,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; |