fix issues with leftover bytes in audio converter

custom
jacqueline 1 year ago
parent 5f0e16e97a
commit b6d16a20a4
  1. 24
      src/audio/audio_converter.cpp
  2. 1
      src/audio/include/audio_converter.hpp

@ -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),
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_);
}
}
}

@ -59,7 +59,6 @@ class SampleConverter {
IAudioOutput::Format source_format_;
IAudioOutput::Format target_format_;
size_t leftover_bytes_;
size_t leftover_offset_;
};
} // namespace audio

Loading…
Cancel
Save