From 4b1f8a8d4bea7bcb2613ac5777d4445ecbe4ebcc Mon Sep 17 00:00:00 2001 From: philippe44 Date: Sat, 27 Jan 2024 22:32:01 -0800 Subject: [PATCH] see CHANGELOG - release --- CHANGELOG | 6 +++- components/codecs/inc/FLAC/stream_decoder.h | 32 +++++++++++++++++++- components/codecs/lib/libFLAC.a | Bin 691878 -> 693582 bytes components/squeezelite/flac.c | 3 ++ components/squeezelite/opus.c | 2 +- components/squeezelite/stream.c | 23 ++++++++------ components/squeezelite/vorbis.c | 2 +- 7 files changed, 55 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e6df73e3..55cb938a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2024-01-27 + - complete libflac fix and add chaining enablement + - fixed stream Ogg demux issue with unknown granule + 2024-01-19 - fixed libflac with OggFlac - AirPlay missed frame logging @@ -31,7 +35,7 @@ - force gpio_pad_select_gpio in dac_controlset in case somebody uses UART gpio's (or other pre-programmed) 2023-11-08 - - execute dac_controlset even whne there is no i2s (for gpio) + - execute dac_controlset even when there is no i2s (for gpio) 2023-11-07 - led-vu gain + misc fixes diff --git a/components/codecs/inc/FLAC/stream_decoder.h b/components/codecs/inc/FLAC/stream_decoder.h index f4e16488..da0db792 100644 --- a/components/codecs/inc/FLAC/stream_decoder.h +++ b/components/codecs/inc/FLAC/stream_decoder.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2022 Xiph.Org Foundation + * Copyright (C) 2011-2023 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -782,6 +782,25 @@ FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); */ FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); +/** Set the "allow Ogg chaining" flag. If set, the Ogg decoder will + * prepare to receive a new stream once the last Ogg page arrives for + * the stream encapsulating the FLAC audio data. This can be used to + * support chained Ogg FLAC streams; a new \c STREAMINFO signals the + * beginning of a new stream. + * + * \note + * This function has no effect with native FLAC decoding. + * + * \default \c false + * \param decoder A decoder instance to set. + * \param allow Whether to allow chained streams. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_chaining(FLAC__StreamDecoder* decoder, FLAC__bool value); + /** Set the "MD5 signature checking" flag. If \c true, the decoder will * compute the MD5 signature of the unencoded audio data while decoding * and compare it to the signature from the STREAMINFO block, if it @@ -906,6 +925,17 @@ FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__Str */ FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); +/** Get the "allow Ogg chaining" flag as described in + * \code FLAC__stream_decoder_set_ogg_chaining \endcode. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_ogg_chaining(const FLAC__StreamDecoder* decoder); + /** Get the "MD5 signature checking" flag. * This is the value of the setting, not whether or not the decoder is * currently checking the MD5 (remember, it can be turned off automatically diff --git a/components/codecs/lib/libFLAC.a b/components/codecs/lib/libFLAC.a index e535aa932669825412ffc98ed0c55ee34a8034d2..2ea8603cc506905eff6e34c6d18e73692b148976 100644 GIT binary patch delta 63352 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 diff --git a/components/squeezelite/flac.c b/components/squeezelite/flac.c index 2afa2e19..01a58297 100644 --- a/components/squeezelite/flac.c +++ b/components/squeezelite/flac.c @@ -70,6 +70,7 @@ struct flac { ); FLAC__bool (* FLAC__stream_decoder_process_single)(FLAC__StreamDecoder *decoder); FLAC__StreamDecoderState (* FLAC__stream_decoder_get_state)(const FLAC__StreamDecoder *decoder); + FLAC__bool (*FLAC__stream_decoder_set_ogg_chaining)(FLAC__StreamDecoder* decoder, FLAC__bool allow); #endif }; @@ -256,6 +257,7 @@ static void flac_open(u8_t sample_size, u8_t sample_rate, u8_t channels, u8_t en if ( f->container == 'o' ) { LOG_INFO("ogg/flac container - using init_ogg_stream"); + FLAC(f, stream_decoder_set_ogg_chaining, f->decoder, true); FLAC(f, stream_decoder_init_ogg_stream, f->decoder, &read_cb, NULL, NULL, NULL, NULL, &write_cb, NULL, &error_cb, NULL); } else { FLAC(f, stream_decoder_init_stream, f->decoder, &read_cb, NULL, NULL, NULL, NULL, &write_cb, NULL, &error_cb, NULL); @@ -298,6 +300,7 @@ static bool load_flac() { f->FLAC__stream_decoder_init_ogg_stream = dlsym(handle, "FLAC__stream_decoder_init_ogg_stream"); f->FLAC__stream_decoder_process_single = dlsym(handle, "FLAC__stream_decoder_process_single"); f->FLAC__stream_decoder_get_state = dlsym(handle, "FLAC__stream_decoder_get_state"); + f->FLAC__stream_decoder_set_ogg_chaining = dlsym(handle, "FLAC__stream_decoder_set_ogg_chaining"); if ((err = dlerror()) != NULL) { LOG_INFO("dlerror: %s", err); diff --git a/components/squeezelite/opus.c b/components/squeezelite/opus.c index 0b15d7f3..27c8a352 100644 --- a/components/squeezelite/opus.c +++ b/components/squeezelite/opus.c @@ -194,7 +194,7 @@ static int read_opus_header(void) { // nothing has been found and we have no more bytes, come back later if (status <= 0) break; - // always set stream serialno if we have a new one + // always set stream serialno if we have a new one (no multiplexed streams) if (OG(&go, page_bos, &u->page)) OG(&go, stream_reset_serialno, &u->state, OG(&go, page_serialno, &u->page)); // bring new page in if we want it (otherwise we're just skipping) diff --git a/components/squeezelite/stream.c b/components/squeezelite/stream.c index 759a7487..7f203081 100644 --- a/components/squeezelite/stream.c +++ b/components/squeezelite/stream.c @@ -63,9 +63,9 @@ struct EXT_RAM_ATTR streamstate stream; static EXT_RAM_ATTR struct { bool flac; + u64_t serial; enum { OGG_OFF, OGG_SYNC, OGG_HEADER, OGG_SEGMENTS, OGG_PAGE } state; size_t want, miss, match; - u64_t granule; u8_t* data, segments[255]; #pragma pack(push, 1) struct { @@ -237,19 +237,22 @@ static void stream_ogg(size_t n) { // calculate size of page using lacing values for (size_t i = 0; i < ogg.want; i++) ogg.miss += ogg.data[i]; ogg.want = ogg.miss; + + // acquire serial number when we are looking for headers and hit a bos + if (ogg.serial == ULLONG_MAX && (ogg.header.type & 0x02)) ogg.serial = ogg.header.serial; - if (ogg.header.granule == 0 || (ogg.header.granule == -1 && ogg.granule == 0)) { - // granule 0 means a new stream, so let's look into it - ogg.state = OGG_PAGE; - ogg.data = malloc(ogg.want); - } else { + // we have overshot and missed header, reset serial number to restart search (O and -1 are le/be) + if (ogg.header.serial == ogg.serial && ogg.header.granule && ogg.header.granule != -1) ogg.serial = ULLONG_MAX; + + // not our serial (the above protected us from granule > 0) + if (ogg.header.serial != ogg.serial) { // otherwise, jump over data ogg.state = OGG_SYNC; ogg.data = NULL; + } else { + ogg.state = OGG_PAGE; + ogg.data = malloc(ogg.want); } - - // memorize granule for next page - if (ogg.header.granule != -1) ogg.granule = ogg.header.granule; break; case OGG_PAGE: { char** tag = (char* []){ "\x3vorbis", "OpusTags", NULL }; @@ -289,6 +292,7 @@ static void stream_ogg(size_t n) { } ogg.flac = false; + ogg.serial = ULLONG_MAX; stream.meta_send = true; wake_controller(); LOG_INFO("Ogg metadata length: %u", stream.header_len - 3); @@ -736,6 +740,7 @@ void stream_sock(u32_t ip, u16_t port, bool use_ssl, bool use_ogg, const char *h ogg.miss = ogg.match = 0; ogg.state = use_ogg ? OGG_SYNC : OGG_OFF; ogg.flac = false; + ogg.serial = ULLONG_MAX; UNLOCK; } diff --git a/components/squeezelite/vorbis.c b/components/squeezelite/vorbis.c index a330a303..613b95d2 100644 --- a/components/squeezelite/vorbis.c +++ b/components/squeezelite/vorbis.c @@ -201,7 +201,7 @@ static int read_vorbis_header(void) { // nothing has been found and we have no more bytes, come back later if (status <= 0) break; - // always set stream serialno if we have a new one + // always set stream serialno if we have a new one (no multiplexed streams) if (OG(&go, page_bos, &v->page)) OG(&go, stream_reset_serialno, &v->state, OG(&go, page_serialno, &v->page)); // bring new page in if we want it (otherwise we're just skipping)