| Index: chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc
|
| diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc
|
| index 9770a4c023129252ec0b7905f128f33fb914b9e7..db5e3421bb6a6df36c083dd7299f3cf37db9b3f4 100644
|
| --- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc
|
| +++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc
|
| @@ -15,6 +15,7 @@
|
| #include "base/run_loop.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "chromecast/media/cma/backend/alsa/mock_alsa_wrapper.h"
|
| +#include "media/audio/audio_device_description.h"
|
| #include "media/base/audio_bus.h"
|
| #include "media/base/vector_math.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| @@ -126,13 +127,17 @@ std::unique_ptr<::media::AudioBus> GetTestData(size_t index) {
|
|
|
| class MockInputQueue : public StreamMixerAlsa::InputQueue {
|
| public:
|
| - explicit MockInputQueue(int samples_per_second)
|
| + explicit MockInputQueue(int samples_per_second,
|
| + const std::string& device_id =
|
| + ::media::AudioDeviceDescription::kDefaultDeviceId)
|
| : paused_(true),
|
| samples_per_second_(samples_per_second),
|
| max_read_size_(kTestMaxReadSize),
|
| multiplier_(1.0),
|
| primary_(true),
|
| - deleting_(false) {
|
| + deleting_(false),
|
| + device_id_(device_id),
|
| + filter_group_(nullptr) {
|
| ON_CALL(*this, GetResampledData(_, _)).WillByDefault(
|
| testing::Invoke(this, &MockInputQueue::DoGetResampledData));
|
| ON_CALL(*this, VolumeScaleAccumulate(_, _, _, _)).WillByDefault(
|
| @@ -151,6 +156,9 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue {
|
| MOCK_METHOD1(Initialize,
|
| void(const MediaPipelineBackendAlsa::RenderingDelay&
|
| mixer_rendering_delay));
|
| + std::string device_id() const override { return device_id_; }
|
| + void set_filter_group(FilterGroup* group) override { filter_group_ = group; }
|
| + FilterGroup* filter_group() override { return filter_group_; }
|
| int MaxReadSize() override { return max_read_size_; }
|
| MOCK_METHOD2(GetResampledData, void(::media::AudioBus* dest, int frames));
|
| MOCK_METHOD4(
|
| @@ -214,6 +222,9 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue {
|
| float multiplier_;
|
| bool primary_;
|
| bool deleting_;
|
| + const std::string device_id_;
|
| + FilterGroup* filter_group_;
|
| +
|
| std::unique_ptr<::media::AudioBus> data_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MockInputQueue);
|
| @@ -514,6 +525,48 @@ TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsMixProperly) {
|
| // Get the actual stream rendered to ALSA, and compare it against the
|
| // expected stream. The stream should match exactly.
|
| auto actual = ::media::AudioBus::Create(kNumChannels, kNumFrames);
|
| + actual->FromInterleaved(&(mock_alsa()->data()[0]), kNumFrames,
|
| + kBytesPerSample);
|
| + CompareAudioData(*expected, *actual);
|
| +}
|
| +
|
| +TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsWithDifferentIdsMixProperly) {
|
| + // Create a group of input streams.
|
| + std::vector<testing::StrictMock<MockInputQueue>*> inputs;
|
| + inputs.push_back(new testing::StrictMock<MockInputQueue>(
|
| + kTestSamplesPerSecond,
|
| + ::media::AudioDeviceDescription::kDefaultDeviceId));
|
| + inputs.back()->SetPaused(false);
|
| + inputs.push_back(new testing::StrictMock<MockInputQueue>(
|
| + kTestSamplesPerSecond,
|
| + ::media::AudioDeviceDescription::kCommunicationsDeviceId));
|
| + inputs.back()->SetPaused(false);
|
| +
|
| + StreamMixerAlsa* mixer = StreamMixerAlsa::Get();
|
| + for (size_t i = 0; i < inputs.size(); ++i) {
|
| + EXPECT_CALL(*inputs[i], Initialize(_)).Times(1);
|
| + mixer->AddInput(base::WrapUnique(inputs[i]));
|
| + }
|
| +
|
| + // Poll the inputs for data.
|
| + const int kNumFrames = 32;
|
| + for (size_t i = 0; i < inputs.size(); ++i) {
|
| + inputs[i]->SetData(GetTestData(i));
|
| + EXPECT_CALL(*inputs[i], GetResampledData(_, kNumFrames));
|
| + EXPECT_CALL(*inputs[i], VolumeScaleAccumulate(_, _, kNumFrames, _))
|
| + .Times(kNumChannels);
|
| + EXPECT_CALL(*inputs[i], AfterWriteFrames(_));
|
| + }
|
| +
|
| + EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1);
|
| + mixer->WriteFramesForTest();
|
| +
|
| + // Mix the inputs manually.
|
| + auto expected = GetMixedAudioData(inputs);
|
| +
|
| + // Get the actual stream rendered to ALSA, and compare it against the
|
| + // expected stream. The stream should match exactly.
|
| + auto actual = ::media::AudioBus::Create(kNumChannels, kNumFrames);
|
| actual->FromInterleaved(
|
| &(mock_alsa()->data()[0]), kNumFrames, kBytesPerSample);
|
| CompareAudioData(*expected, *actual);
|
|
|