From 958160aa545e3d91b2a4f1a367817e73d298e8a9 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 10 Aug 2023 19:12:38 +1000 Subject: Use the libspeexdsp resampler AFAICT it runs a little slower? but it's fixed point, and has much better understood audio characteristics. --- src/codecs/foxenflac.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/codecs/foxenflac.cpp') diff --git a/src/codecs/foxenflac.cpp b/src/codecs/foxenflac.cpp index cc110920..eef8225a 100644 --- a/src/codecs/foxenflac.cpp +++ b/src/codecs/foxenflac.cpp @@ -74,19 +74,25 @@ auto FoxenFlacDecoder::DecodeTo(cpp::span output) -> cpp::result { bool is_eof = buffer_.Refill(input_.get()); - fx_flac_state_t state; - uint32_t samples_written = output.size(); + cpp::span output32{reinterpret_cast(output.data()), + output.size() / 2}; + uint32_t samples_written = output32.size(); + fx_flac_state_t state; buffer_.ConsumeBytes([&](cpp::span buf) -> size_t { uint32_t bytes_read = buf.size_bytes(); state = fx_flac_process(flac_, reinterpret_cast(buf.data()), - &bytes_read, output.data(), &samples_written); + &bytes_read, output32.data(), &samples_written); return bytes_read; }); if (state == FLAC_ERR) { return cpp::fail(Error::kMalformedData); } + for (size_t i = 0; i < samples_written; i++) { + output[i] = output32[i] >> 16; + } + return OutputInfo{.samples_written = samples_written, .is_stream_finished = samples_written == 0 && is_eof}; } -- cgit v1.2.3