diff --git a/Core/HW/Atrac3Standalone.cpp b/Core/HW/Atrac3Standalone.cpp index 5d7b923069..4aa506a183 100644 --- a/Core/HW/Atrac3Standalone.cpp +++ b/Core/HW/Atrac3Standalone.cpp @@ -46,6 +46,15 @@ public: return codecOpen_; } + void FlushBuffers() { + if (at3Ctx_) { + atrac3_flush_buffers(at3Ctx_); + } + if (at3pCtx_) { + atrac3p_flush_buffers(at3pCtx_); + } + } + bool Decode(const uint8_t *inbuf, int inbytes, uint8_t *outbuf, int *outbytes) override { if (!codecOpen_) { _dbg_assert_(false); diff --git a/Core/HW/SimpleAudioDec.h b/Core/HW/SimpleAudioDec.h index 8ee4e45aa1..b227b3889a 100644 --- a/Core/HW/SimpleAudioDec.h +++ b/Core/HW/SimpleAudioDec.h @@ -48,6 +48,8 @@ public: virtual void SetChannels(int channels) = 0; + virtual void FlushBuffers() {} + // Just metadata. void SetCtxPtr(uint32_t ptr) { ctxPtr = ptr; } uint32_t GetCtxPtr() const { return ctxPtr; } diff --git a/ext/at3_standalone/at3_decoders.h b/ext/at3_standalone/at3_decoders.h index bbac4d75f7..0762c1a72d 100644 --- a/ext/at3_standalone/at3_decoders.h +++ b/ext/at3_standalone/at3_decoders.h @@ -8,11 +8,14 @@ struct ATRAC3Context; struct ATRAC3PContext; // If the block_align passed in is 0, tries to audio detect. +// flush_buffers should be called when seeking before the next decode_frame. ATRAC3Context *atrac3_alloc(int channels, int *block_align, const uint8_t *extra_data, int extra_data_size); void atrac3_free(ATRAC3Context *ctx); +void atrac3_flush_buffers(ATRAC3Context *ctx); int atrac3_decode_frame(ATRAC3Context *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size); ATRAC3PContext *atrac3p_alloc(int channels, int *block_align); void atrac3p_free(ATRAC3PContext *ctx); +void atrac3p_flush_buffers(ATRAC3PContext *ctx); int atrac3p_decode_frame(ATRAC3PContext *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size); diff --git a/ext/at3_standalone/atrac3.cpp b/ext/at3_standalone/atrac3.cpp index 1906ce0cc8..387378b1ee 100644 --- a/ext/at3_standalone/atrac3.cpp +++ b/ext/at3_standalone/atrac3.cpp @@ -765,6 +765,11 @@ int atrac3_decode_frame(ATRAC3Context *ctx, float *out_data[2], int *nb_samples, return block_align; } +void atrac3_flush_buffers(ATRAC3Context *c) { + // There's no known correct way to do this, so let's just reset some stuff. + memset(c->temp_buf, 0, sizeof(c->temp_buf)); +} + static void atrac3_init_static_data(void) { int i; diff --git a/ext/at3_standalone/atrac3plusdec.cpp b/ext/at3_standalone/atrac3plusdec.cpp index f1a58d726a..f46a1c2301 100644 --- a/ext/at3_standalone/atrac3plusdec.cpp +++ b/ext/at3_standalone/atrac3plusdec.cpp @@ -357,3 +357,7 @@ int atrac3p_decode_frame(ATRAC3PContext *ctx, float *out_data[2], int *nb_sample return FFMIN(ctx->block_align, avpkt_size); } + +void atrac3p_flush_buffers(ATRAC3PContext *ctx) { + // TODO: Not sure what should be zeroed here. +}