From 7d2d4a6f7706709c6bd09d2d8b7a797d1c2c52ea Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 13 May 2020 20:11:45 -0700 Subject: [PATCH] AAC files might be blocked in a loop at the end --- components/squeezelite/embedded.h | 1 + components/squeezelite/helix-aac.c | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/squeezelite/embedded.h b/components/squeezelite/embedded.h index 85c08003..a07efbd0 100644 --- a/components/squeezelite/embedded.h +++ b/components/squeezelite/embedded.h @@ -58,6 +58,7 @@ void embedded_init(void); void register_external(void); void deregister_external(void); void decode_restore(int external); +// used when other client wants to use slimproto socket to send messages extern mutex_type slimp_mutex; #define LOCK_P mutex_lock(slimp_mutex) #define UNLOCK_P mutex_unlock(slimp_mutex) diff --git a/components/squeezelite/helix-aac.c b/components/squeezelite/helix-aac.c index c52b88ef..2162f16e 100644 --- a/components/squeezelite/helix-aac.c +++ b/components/squeezelite/helix-aac.c @@ -330,7 +330,7 @@ static decode_state helixaac_decode(void) { u8_t *sptr; bool endstream; frames_t frames; - + LOCK_S; bytes_total = _buf_used(streambuf); bytes_wrap = min(bytes_total, _buf_cont_read(streambuf)); @@ -418,15 +418,14 @@ static decode_state helixaac_decode(void) { } } - if (bytes_wrap < WRAPBUF_LEN && bytes_total > WRAPBUF_LEN) { + if (bytes_wrap < WRAPBUF_LEN && (bytes_total > WRAPBUF_LEN || stream.state <= DISCONNECT)) { // make a local copy of frames which may have wrapped round the end of streambuf memcpy(a->wrap_buf, streambuf->readp, bytes_wrap); - memcpy(a->wrap_buf + bytes_wrap, streambuf->buf, WRAPBUF_LEN - bytes_wrap); + memcpy(a->wrap_buf + bytes_wrap, streambuf->buf, min(WRAPBUF_LEN, bytes_total) - bytes_wrap); sptr = a->wrap_buf; - bytes = bytes_wrap = WRAPBUF_LEN; + bytes = bytes_wrap = min(WRAPBUF_LEN, bytes_total); } else { - sptr = streambuf->readp; bytes = bytes_wrap; } @@ -517,7 +516,7 @@ static decode_state helixaac_decode(void) { frames_t f; frames_t count; ISAMPLE_T *optr; - + IF_DIRECT( f = _buf_cont_write(outputbuf) / BYTES_PER_FRAME; optr = (ISAMPLE_T *)outputbuf->writep; @@ -559,7 +558,7 @@ static decode_state helixaac_decode(void) { if (frames) LOG_ERROR("unhandled case"); ); } - + UNLOCK_O_direct; return DECODE_RUNNING;