fix issues with leftover bytes in audio converter
This commit is contained in:
@@ -92,7 +92,6 @@ auto SampleConverter::Main() -> void {
|
|||||||
resampler_.reset();
|
resampler_.reset();
|
||||||
source_format_ = args.format;
|
source_format_ = args.format;
|
||||||
leftover_bytes_ = 0;
|
leftover_bytes_ = 0;
|
||||||
leftover_offset_ = 0;
|
|
||||||
|
|
||||||
auto new_target = sink_->PrepareFormat(args.format);
|
auto new_target = sink_->PrepareFormat(args.format);
|
||||||
if (new_target != target_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
|
// First top up the input buffer, taking care not to overwrite anything
|
||||||
// remaining from a previous iteration.
|
// remaining from a previous iteration.
|
||||||
size_t bytes_read_this_it = xStreamBufferReceive(
|
size_t bytes_read_this_it = xStreamBufferReceive(
|
||||||
source_,
|
source_, input_buffer_as_bytes_.subspan(leftover_bytes_).data(),
|
||||||
input_buffer_as_bytes_.subspan(leftover_offset_ + leftover_bytes_)
|
std::min(input_buffer_as_bytes_.size() - leftover_bytes_,
|
||||||
.data(),
|
|
||||||
std::min(input_buffer_as_bytes_.size() - leftover_offset_ -
|
|
||||||
leftover_bytes_,
|
|
||||||
bytes_to_read - bytes_read),
|
bytes_to_read - bytes_read),
|
||||||
portMAX_DELAY);
|
portMAX_DELAY);
|
||||||
bytes_read += bytes_read_this_it;
|
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 bytes_in_buffer = bytes_read_this_it + leftover_bytes_;
|
||||||
size_t samples_in_buffer = bytes_in_buffer / sizeof(sample::Sample);
|
size_t samples_in_buffer = bytes_in_buffer / sizeof(sample::Sample);
|
||||||
|
|
||||||
size_t samples_used = HandleSamples(
|
size_t samples_used =
|
||||||
input_buffer_.subspan(leftover_offset_).first(samples_in_buffer),
|
HandleSamples(input_buffer_.first(samples_in_buffer),
|
||||||
args.is_end_of_stream && bytes_read == bytes_to_read);
|
args.is_end_of_stream && bytes_read == bytes_to_read);
|
||||||
|
|
||||||
// Maybe the resampler didn't consume everything. Maybe the last few
|
// 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
|
// 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);
|
size_t bytes_used = samples_used * sizeof(sample::Sample);
|
||||||
assert(bytes_used <= bytes_in_buffer);
|
assert(bytes_used <= bytes_in_buffer);
|
||||||
|
|
||||||
leftover_bytes_ = bytes_in_buffer - bytes_used;
|
leftover_bytes_ = bytes_in_buffer - bytes_used;
|
||||||
if (leftover_bytes_ == 0) {
|
if (leftover_bytes_ > 0) {
|
||||||
leftover_offset_ = 0;
|
std::memmove(input_buffer_as_bytes_.data(),
|
||||||
} else {
|
input_buffer_as_bytes_.data() + bytes_used,
|
||||||
leftover_offset_ += bytes_used;
|
leftover_bytes_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ class SampleConverter {
|
|||||||
IAudioOutput::Format source_format_;
|
IAudioOutput::Format source_format_;
|
||||||
IAudioOutput::Format target_format_;
|
IAudioOutput::Format target_format_;
|
||||||
size_t leftover_bytes_;
|
size_t leftover_bytes_;
|
||||||
size_t leftover_offset_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace audio
|
} // namespace audio
|
||||||
|
|||||||
Reference in New Issue
Block a user