diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-08-10 19:12:38 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-08-10 19:12:38 +1000 |
| commit | 958160aa545e3d91b2a4f1a367817e73d298e8a9 (patch) | |
| tree | 190e6591a6dda1f0d9651c7e127666ead2a3373b /src/codecs/foxenflac.cpp | |
| parent | d8fc77101dcf80a3643a00b3446dca1e390ce997 (diff) | |
| download | tangara-fw-958160aa545e3d91b2a4f1a367817e73d298e8a9.tar.gz | |
Use the libspeexdsp resampler
AFAICT it runs a little slower? but it's fixed point, and has much
better understood audio characteristics.
Diffstat (limited to 'src/codecs/foxenflac.cpp')
| -rw-r--r-- | src/codecs/foxenflac.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
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<sample::Sample> output) -> cpp::result<OutputInfo, Error> { bool is_eof = buffer_.Refill(input_.get()); - fx_flac_state_t state; - uint32_t samples_written = output.size(); + cpp::span<int32_t> output32{reinterpret_cast<int32_t*>(output.data()), + output.size() / 2}; + uint32_t samples_written = output32.size(); + fx_flac_state_t state; buffer_.ConsumeBytes([&](cpp::span<std::byte> buf) -> size_t { uint32_t bytes_read = buf.size_bytes(); state = fx_flac_process(flac_, reinterpret_cast<const uint8_t*>(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}; } |
