summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-01-03 17:04:48 +1100
committerjacqueline <me@jacqueline.id.au>2024-01-03 17:04:48 +1100
commitb6d16a20a4fc9e35c931af9064da309c64796689 (patch)
treede57ac2de151a18b245580c878526dcc42ba4d0a /src
parent5f0e16e97a773480a3b09c5312c98742e7049f1d (diff)
downloadtangara-fw-b6d16a20a4fc9e35c931af9064da309c64796689.tar.gz
fix issues with leftover bytes in audio converter
Diffstat (limited to 'src')
-rw-r--r--src/audio/audio_converter.cpp26
-rw-r--r--src/audio/include/audio_converter.hpp1
2 files changed, 12 insertions, 15 deletions
diff --git a/src/audio/audio_converter.cpp b/src/audio/audio_converter.cpp
index efe384eb..77773c5b 100644
--- a/src/audio/audio_converter.cpp
+++ b/src/audio/audio_converter.cpp
@@ -92,7 +92,6 @@ auto SampleConverter::Main() -> void {
resampler_.reset();
source_format_ = args.format;
leftover_bytes_ = 0;
- leftover_offset_ = 0;
auto new_target = sink_->PrepareFormat(args.format);
if (new_target != target_format_) {
@@ -119,11 +118,8 @@ auto SampleConverter::Main() -> void {
// First top up the input buffer, taking care not to overwrite anything
// remaining from a previous iteration.
size_t bytes_read_this_it = xStreamBufferReceive(
- source_,
- input_buffer_as_bytes_.subspan(leftover_offset_ + leftover_bytes_)
- .data(),
- std::min(input_buffer_as_bytes_.size() - leftover_offset_ -
- leftover_bytes_,
+ source_, input_buffer_as_bytes_.subspan(leftover_bytes_).data(),
+ std::min(input_buffer_as_bytes_.size() - leftover_bytes_,
bytes_to_read - bytes_read),
portMAX_DELAY);
bytes_read += bytes_read_this_it;
@@ -132,20 +128,22 @@ auto SampleConverter::Main() -> void {
size_t bytes_in_buffer = bytes_read_this_it + leftover_bytes_;
size_t samples_in_buffer = bytes_in_buffer / sizeof(sample::Sample);
- size_t samples_used = HandleSamples(
- input_buffer_.subspan(leftover_offset_).first(samples_in_buffer),
- args.is_end_of_stream && bytes_read == bytes_to_read);
+ size_t samples_used =
+ HandleSamples(input_buffer_.first(samples_in_buffer),
+ args.is_end_of_stream && bytes_read == bytes_to_read);
// Maybe the resampler didn't consume everything. Maybe the last few
// bytes we read were half a frame. Either way, we need to calculate the
- // size of the remainder in bytes.
+ // size of the remainder in bytes, then move it to the front of our
+ // buffer.
size_t bytes_used = samples_used * sizeof(sample::Sample);
assert(bytes_used <= bytes_in_buffer);
+
leftover_bytes_ = bytes_in_buffer - bytes_used;
- if (leftover_bytes_ == 0) {
- leftover_offset_ = 0;
- } else {
- leftover_offset_ += bytes_used;
+ if (leftover_bytes_ > 0) {
+ std::memmove(input_buffer_as_bytes_.data(),
+ input_buffer_as_bytes_.data() + bytes_used,
+ leftover_bytes_);
}
}
}
diff --git a/src/audio/include/audio_converter.hpp b/src/audio/include/audio_converter.hpp
index 81532969..c2ebde60 100644
--- a/src/audio/include/audio_converter.hpp
+++ b/src/audio/include/audio_converter.hpp
@@ -59,7 +59,6 @@ class SampleConverter {
IAudioOutput::Format source_format_;
IAudioOutput::Format target_format_;
size_t leftover_bytes_;
- size_t leftover_offset_;
};
} // namespace audio