summaryrefslogtreecommitdiff
path: root/src/codecs/foxenflac.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-10 19:12:38 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-10 19:12:38 +1000
commit958160aa545e3d91b2a4f1a367817e73d298e8a9 (patch)
tree190e6591a6dda1f0d9651c7e127666ead2a3373b /src/codecs/foxenflac.cpp
parentd8fc77101dcf80a3643a00b3446dca1e390ce997 (diff)
downloadtangara-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.cpp12
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};
}