diff --git a/components/squeezelite/opus.c b/components/squeezelite/opus.c index 63567a1e..4bffdf55 100644 --- a/components/squeezelite/opus.c +++ b/components/squeezelite/opus.c @@ -44,6 +44,7 @@ struct opus { struct OggOpusFile *of; + bool end; #if FRAME_BUF u8_t *write_buf; #endif @@ -118,7 +119,7 @@ static decode_state opus_decompress(void) { LOCK_S; - if (stream.state <= DISCONNECT && !_buf_used(streambuf)) { + if (stream.state <= DISCONNECT && u->end) { UNLOCK_S; return DECODE_COMPLETE; } @@ -170,6 +171,8 @@ static decode_state opus_decompress(void) { frames = process.max_in_frames; write_buf = process.inbuf; ); + + u->end = frames == 0; // write the decoded frames into outputbuf then unpack them (they are 16 bits) n = OP(u, read, u->of, (opus_int16*) write_buf, frames * channels, NULL); @@ -260,7 +263,8 @@ static void opus_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) { } else { OP(u, free, u->of); u->of = NULL; - } + } + u->end = false; } static void opus_close(void) { diff --git a/components/squeezelite/vorbis.c b/components/squeezelite/vorbis.c index 5c896b0b..155a5ddb 100644 --- a/components/squeezelite/vorbis.c +++ b/components/squeezelite/vorbis.c @@ -54,7 +54,7 @@ struct vorbis { OggVorbis_File *vf; - bool opened; + bool opened, end; #if FRAME_BUF u8_t *write_buf; #endif @@ -140,7 +140,7 @@ static decode_state vorbis_decode(void) { LOCK_S; - if (stream.state <= DISCONNECT && !_buf_used(streambuf)) { + if (stream.state <= DISCONNECT && v->end) { UNLOCK_S; return DECODE_COMPLETE; } @@ -204,6 +204,7 @@ static decode_state vorbis_decode(void) { ); bytes = frames * 2 * channels; // samples returned are 16 bits + v->end = frames == 0; // write the decoded frames into outputbuf even though they are 16 bits per sample, then unpack them #ifdef TREMOR_ONLY @@ -324,6 +325,7 @@ static void vorbis_close(void) { v->write_buf = NULL; #endif v->vf = NULL; + v->end = false; } static bool load_vorbis() {