mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-09 04:57:06 +03:00
AAC files might be blocked in a loop at the end
This commit is contained in:
@@ -58,6 +58,7 @@ void embedded_init(void);
|
|||||||
void register_external(void);
|
void register_external(void);
|
||||||
void deregister_external(void);
|
void deregister_external(void);
|
||||||
void decode_restore(int external);
|
void decode_restore(int external);
|
||||||
|
// used when other client wants to use slimproto socket to send messages
|
||||||
extern mutex_type slimp_mutex;
|
extern mutex_type slimp_mutex;
|
||||||
#define LOCK_P mutex_lock(slimp_mutex)
|
#define LOCK_P mutex_lock(slimp_mutex)
|
||||||
#define UNLOCK_P mutex_unlock(slimp_mutex)
|
#define UNLOCK_P mutex_unlock(slimp_mutex)
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ static decode_state helixaac_decode(void) {
|
|||||||
u8_t *sptr;
|
u8_t *sptr;
|
||||||
bool endstream;
|
bool endstream;
|
||||||
frames_t frames;
|
frames_t frames;
|
||||||
|
|
||||||
LOCK_S;
|
LOCK_S;
|
||||||
bytes_total = _buf_used(streambuf);
|
bytes_total = _buf_used(streambuf);
|
||||||
bytes_wrap = min(bytes_total, _buf_cont_read(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
|
// 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, 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;
|
sptr = a->wrap_buf;
|
||||||
bytes = bytes_wrap = WRAPBUF_LEN;
|
bytes = bytes_wrap = min(WRAPBUF_LEN, bytes_total);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
sptr = streambuf->readp;
|
sptr = streambuf->readp;
|
||||||
bytes = bytes_wrap;
|
bytes = bytes_wrap;
|
||||||
}
|
}
|
||||||
@@ -517,7 +516,7 @@ static decode_state helixaac_decode(void) {
|
|||||||
frames_t f;
|
frames_t f;
|
||||||
frames_t count;
|
frames_t count;
|
||||||
ISAMPLE_T *optr;
|
ISAMPLE_T *optr;
|
||||||
|
|
||||||
IF_DIRECT(
|
IF_DIRECT(
|
||||||
f = _buf_cont_write(outputbuf) / BYTES_PER_FRAME;
|
f = _buf_cont_write(outputbuf) / BYTES_PER_FRAME;
|
||||||
optr = (ISAMPLE_T *)outputbuf->writep;
|
optr = (ISAMPLE_T *)outputbuf->writep;
|
||||||
@@ -559,7 +558,7 @@ static decode_state helixaac_decode(void) {
|
|||||||
if (frames) LOG_ERROR("unhandled case");
|
if (frames) LOG_ERROR("unhandled case");
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNLOCK_O_direct;
|
UNLOCK_O_direct;
|
||||||
|
|
||||||
return DECODE_RUNNING;
|
return DECODE_RUNNING;
|
||||||
|
|||||||
Reference in New Issue
Block a user