From 39f7545cd5ef7a30bbd482f3579df7744c6b688d Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 7 Jul 2023 15:29:47 +1000 Subject: wire up the playing screen with some real data Includes implementing song duration calculation for CBR MP3 files --- src/audio/audio_decoder.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/audio/audio_decoder.cpp') diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp index 966a8c37..b8054574 100644 --- a/src/audio/audio_decoder.cpp +++ b/src/audio/audio_decoder.cpp @@ -53,7 +53,7 @@ auto AudioDecoder::ProcessStreamInfo(const StreamInfo& info) -> bool { } const auto& new_format = std::get(info.format); - current_input_format_ = info.format; + current_input_format_ = new_format; ESP_LOGI(kTag, "creating new decoder"); auto result = codecs::CreateCodecForType(new_format.type); @@ -112,6 +112,15 @@ auto AudioDecoder::Process(const std::vector& inputs, .sample_rate = format.sample_rate_hz, }; + if (format.duration_seconds) { + duration_seconds_from_decoder_ = format.duration_seconds; + } else if (format.bits_per_second && + current_input_format_->duration_bytes) { + duration_seconds_from_decoder_ = + (current_input_format_->duration_bytes.value() - res.first) * 8 / + format.bits_per_second.value() / format.num_channels; + } + if (info.seek_to_seconds) { seek_to_sample_ = *info.seek_to_seconds * format.sample_rate_hz; } else { @@ -144,6 +153,9 @@ auto AudioDecoder::Process(const std::vector& inputs, if (!has_prepared_output_ && !output->prepare(*current_output_format_)) { return; } + if (duration_seconds_from_decoder_) { + output->set_duration(*duration_seconds_from_decoder_); + } has_prepared_output_ = true; // Parse frames and produce samples. -- cgit v1.2.3