[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_;
   }