[Cast] Fix frame mismatch in WavMixerInputSource Wrap the Audio Bus if num_frames is less than buffer frames. Bug: b/175134526 Test: run cplay with config that filter group doesn't require resampler. Change-Id: I477221ad202aa4af11fdb535da0c27203aaf560d Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2585959 Reviewed-by: Kenneth MacKay <kmackay@chromium.org> Commit-Queue: Mingyu Kang <kenkangxgwe@google.com> Cr-Commit-Position: refs/heads/master@{#835969}
diff --git a/chromecast/media/cma/backend/cplay/cplay.cc b/chromecast/media/cma/backend/cplay/cplay.cc index 3faba4d7..7ad4065f 100644 --- a/chromecast/media/cma/backend/cplay/cplay.cc +++ b/chromecast/media/cma/backend/cplay/cplay.cc
@@ -129,8 +129,18 @@ ::media::AudioBus* buffer) override { CHECK(buffer); size_t bytes_written; - CHECK_EQ(num_frames, buffer->frames()); - CHECK(input_handler_->CopyTo(buffer, cursor_, &bytes_written)); + CHECK_LE(num_frames, buffer->frames()); + if (num_frames < buffer->frames()) { + std::vector<float*> channel_data; + for (int i = 0; i < buffer->channels(); ++i) { + channel_data.push_back(buffer->channel(i)); + } + std::unique_ptr<::media::AudioBus> buffer_wrapper = + ::media::AudioBus::WrapVector(num_frames, channel_data); + CHECK(input_handler_->CopyTo(buffer_wrapper.get(), cursor_, &bytes_written)); + } else { + CHECK(input_handler_->CopyTo(buffer, cursor_, &bytes_written)); + } cursor_ += bytes_written; return bytes_written / bytes_per_frame_; }