diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-01-03 17:04:48 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-01-03 17:04:48 +1100 |
| commit | b6d16a20a4fc9e35c931af9064da309c64796689 (patch) | |
| tree | de57ac2de151a18b245580c878526dcc42ba4d0a /src/audio/audio_converter.cpp | |
| parent | 5f0e16e97a773480a3b09c5312c98742e7049f1d (diff) | |
| download | tangara-fw-b6d16a20a4fc9e35c931af9064da309c64796689.tar.gz | |
fix issues with leftover bytes in audio converter
Diffstat (limited to 'src/audio/audio_converter.cpp')
| -rw-r--r-- | src/audio/audio_converter.cpp | 26 |
1 files changed, 12 insertions, 14 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_); } } } |
