mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-10 21:47:04 +03:00
Merge branch 'master-v4.3' of https://github.com/wizmo2/squeezelite-esp32 into led_visu-v4.3
This commit is contained in:
@@ -54,7 +54,6 @@ struct opus {
|
||||
size_t overframes;
|
||||
u8_t *overbuf;
|
||||
int channels;
|
||||
bool eos;
|
||||
};
|
||||
|
||||
#if !LINKALL
|
||||
@@ -133,7 +132,7 @@ static opus_uint32 parse_uint32(const unsigned char* _data) {
|
||||
}
|
||||
|
||||
static int get_opus_packet(void) {
|
||||
int status = 0;
|
||||
int status, packet = -1;
|
||||
|
||||
LOCK_S;
|
||||
size_t bytes = min(_buf_used(streambuf), _buf_cont_read(streambuf));
|
||||
@@ -152,9 +151,13 @@ static int get_opus_packet(void) {
|
||||
// if we have a new page, put it in
|
||||
if (status) OG(&go, stream_pagein, &u->state, &u->page);
|
||||
}
|
||||
|
||||
// only return a negative value when end of streaming is reached
|
||||
if (status > 0) packet = status;
|
||||
else if (stream.state > DISCONNECT) packet = 0;
|
||||
|
||||
UNLOCK_S;
|
||||
return status;
|
||||
return packet;
|
||||
}
|
||||
|
||||
static int read_opus_header(void) {
|
||||
@@ -219,7 +222,6 @@ static int read_opus_header(void) {
|
||||
|
||||
static decode_state opus_decompress(void) {
|
||||
frames_t frames;
|
||||
int n;
|
||||
u8_t *write_buf;
|
||||
|
||||
if (decode.new_stream) {
|
||||
@@ -257,6 +259,8 @@ static decode_state opus_decompress(void) {
|
||||
frames = process.max_in_frames;
|
||||
write_buf = process.inbuf;
|
||||
);
|
||||
|
||||
int packet, n = 0;
|
||||
|
||||
// get some packets and decode them, or use the leftover from previous pass
|
||||
if (u->overframes) {
|
||||
@@ -265,7 +269,7 @@ static decode_state opus_decompress(void) {
|
||||
memcpy(write_buf, u->overbuf, u->overframes * BYTES_PER_FRAME);
|
||||
n = u->overframes;
|
||||
u->overframes = 0;
|
||||
} else if (get_opus_packet() > 0) {
|
||||
} else if ((packet = get_opus_packet()) > 0) {
|
||||
if (frames < MAX_OPUS_FRAMES) {
|
||||
// don't have enough contiguous space, use the overflow buffer
|
||||
n = OP(&gu, decode, u->decoder, u->packet.packet, u->packet.bytes, (opus_int16*) u->overbuf, MAX_OPUS_FRAMES, 0);
|
||||
@@ -280,10 +284,10 @@ static decode_state opus_decompress(void) {
|
||||
* outputbuf and streambuf for maybe a long time while we process it all, so don't do that */
|
||||
n = OP(&gu, decode, u->decoder, u->packet.packet, u->packet.bytes, (opus_int16*) write_buf, frames, 0);
|
||||
}
|
||||
} else if (!OG(&go, page_eos, &u->page)) {
|
||||
} else if (!packet && !OG(&go, page_eos, &u->page)) {
|
||||
UNLOCK_O_direct;
|
||||
return DECODE_RUNNING;
|
||||
} else u->eos = true;
|
||||
}
|
||||
|
||||
if (n > 0) {
|
||||
frames_t count;
|
||||
@@ -326,7 +330,7 @@ static decode_state opus_decompress(void) {
|
||||
|
||||
} else if (n == 0) {
|
||||
|
||||
if (stream.state <= DISCONNECT && u->eos) {
|
||||
if (packet < 0) {
|
||||
LOG_INFO("end of decode");
|
||||
UNLOCK_O_direct;
|
||||
return DECODE_COMPLETE;
|
||||
@@ -351,7 +355,6 @@ static void opus_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
|
||||
|
||||
if (!u->overbuf) u->overbuf = malloc(MAX_OPUS_FRAMES * BYTES_PER_FRAME);
|
||||
|
||||
u->eos = false;
|
||||
u->status = OGG_SYNC;
|
||||
u->overframes = 0;
|
||||
|
||||
|
||||
@@ -65,7 +65,6 @@ struct vorbis {
|
||||
};
|
||||
int rate, channels;
|
||||
uint32_t overflow;
|
||||
bool eos;
|
||||
};
|
||||
|
||||
#if !LINKALL
|
||||
@@ -133,7 +132,7 @@ extern struct processstate process;
|
||||
#endif
|
||||
|
||||
static int get_ogg_packet(void) {
|
||||
int status = 0;
|
||||
int status, packet = -1;
|
||||
|
||||
LOCK_S;
|
||||
size_t bytes = min(_buf_used(streambuf), _buf_cont_read(streambuf));
|
||||
@@ -152,9 +151,13 @@ static int get_ogg_packet(void) {
|
||||
// if we have a new page, put it in
|
||||
if (status) OG(&go, stream_pagein, &v->state, &v->page);
|
||||
}
|
||||
|
||||
// only return a negative value when end of streaming is reached
|
||||
if (status > 0) packet = status;
|
||||
else if (stream.state > DISCONNECT) packet = 0;
|
||||
|
||||
UNLOCK_S;
|
||||
return status;
|
||||
return packet;
|
||||
}
|
||||
|
||||
static int read_vorbis_header(void) {
|
||||
@@ -261,10 +264,8 @@ inline int pcm_out(vorbis_dsp_state* decoder, void*** pcm) {
|
||||
|
||||
static decode_state vorbis_decode(void) {
|
||||
frames_t frames;
|
||||
int n = 0;
|
||||
u8_t *write_buf;
|
||||
void** pcm = NULL;
|
||||
|
||||
|
||||
if (decode.new_stream) {
|
||||
int status = read_vorbis_header();
|
||||
|
||||
@@ -300,19 +301,22 @@ static decode_state vorbis_decode(void) {
|
||||
frames = process.max_in_frames;
|
||||
write_buf = process.inbuf;
|
||||
);
|
||||
|
||||
void** pcm = NULL;
|
||||
int packet, n = 0;
|
||||
|
||||
if (v->overflow) {
|
||||
n = pcm_out(&v->decoder, &pcm);
|
||||
v->overflow = n - min(n, frames);
|
||||
} else if (get_ogg_packet() > 0) {
|
||||
} else if ((packet = get_ogg_packet()) > 0) {
|
||||
n = OV(&gv, synthesis, &v->block, &v->packet);
|
||||
if (n == 0) n = OV(&gv, synthesis_blockin, &v->decoder, &v->block);
|
||||
if (n == 0) n = pcm_out(&v->decoder, &pcm);
|
||||
v->overflow = n - min(n, frames);
|
||||
} else if (!OG(&go, page_eos, &v->page)) {
|
||||
} else if (!packet && !OG(&go, page_eos, &v->page)) {
|
||||
UNLOCK_O_direct;
|
||||
return DECODE_RUNNING;
|
||||
} else v->eos = true;
|
||||
}
|
||||
|
||||
if (n > 0) {
|
||||
ISAMPLE_T *optr = (ISAMPLE_T*) write_buf;
|
||||
@@ -370,7 +374,7 @@ static decode_state vorbis_decode(void) {
|
||||
|
||||
} else if (n == 0) {
|
||||
|
||||
if (stream.state <= DISCONNECT && v->eos) {
|
||||
if (packet < 0) {
|
||||
LOG_INFO("end of decode");
|
||||
UNLOCK_O_direct;
|
||||
return DECODE_COMPLETE;
|
||||
@@ -397,7 +401,6 @@ static void vorbis_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
|
||||
OV(&go, dsp_clear, &v->decoder);
|
||||
}
|
||||
|
||||
v->eos = false;
|
||||
v->opened = false;
|
||||
v->status = OGG_SYNC;
|
||||
v->overflow = 0;
|
||||
|
||||
Reference in New Issue
Block a user