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 14a12641ca7230eab8e955af2d1765d2674e4095..0f12323980f755abcfeeebf2590a59769c0abde8 100644 |
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
@@ -16,6 +16,7 @@ |
#include "base/threading/thread_task_runner_handle.h" |
#include "chromecast/media/cma/backend/alsa/mock_alsa_wrapper.h" |
#include "media/base/audio_bus.h" |
+#include "media/base/vector_math.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -134,6 +135,8 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue { |
deleting_(false) { |
ON_CALL(*this, GetResampledData(_, _)).WillByDefault( |
testing::Invoke(this, &MockInputQueue::DoGetResampledData)); |
+ ON_CALL(*this, VolumeScaleAccumulate(_, _, _, _)).WillByDefault( |
+ testing::Invoke(this, &MockInputQueue::DoVolumeScaleAccumulate)); |
ON_CALL(*this, PrepareToDelete(_)).WillByDefault( |
testing::Invoke(this, &MockInputQueue::DoPrepareToDelete)); |
} |
@@ -143,7 +146,6 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue { |
// StreamMixerAlsa::InputQueue implementation: |
int input_samples_per_second() const override { return samples_per_second_; } |
- float volume_multiplier() const override { return multiplier_; } |
bool primary() const override { return primary_; } |
bool IsDeleting() const override { return deleting_; } |
MOCK_METHOD1(Initialize, |
@@ -151,6 +153,9 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue { |
mixer_rendering_delay)); |
int MaxReadSize() override { return max_read_size_; } |
MOCK_METHOD2(GetResampledData, void(::media::AudioBus* dest, int frames)); |
+ MOCK_METHOD4( |
+ VolumeScaleAccumulate, |
+ void(bool repeat_transition, const float* src, int frames, float* dest)); |
MOCK_METHOD1(AfterWriteFrames, |
void(const MediaPipelineBackendAlsa::RenderingDelay& |
mixer_rendering_delay)); |
@@ -187,6 +192,16 @@ class MockInputQueue : public StreamMixerAlsa::InputQueue { |
} |
} |
+ void DoVolumeScaleAccumulate(bool repeat_transition, |
+ const float* src, |
+ int frames, |
+ float* dest) { |
+ CHECK(src); |
+ CHECK(dest); |
+ CHECK(multiplier_ >= 0.0 && multiplier_ <= 1.0); |
+ ::media::vector_math::FMAC(src, multiplier_, frames, dest); |
+ } |
+ |
void DoPrepareToDelete(const OnReadyToDeleteCb& delete_cb) { |
deleting_ = true; |
delete_cb.Run(this); |
@@ -364,6 +379,8 @@ TEST_F(StreamMixerAlsaTest, WriteFrames) { |
inputs[2]->SetMaxReadSize(2048); |
for (auto* input : inputs) { |
EXPECT_CALL(*input, GetResampledData(_, 512)).Times(1); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 512, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)).Times(1); |
} |
@@ -378,8 +395,11 @@ TEST_F(StreamMixerAlsaTest, WriteFrames) { |
inputs[1]->SetMaxReadSize(0); |
inputs[2]->SetPrimary(false); |
for (auto* input : inputs) { |
- if (input != inputs[1]) |
+ if (input != inputs[1]) { |
EXPECT_CALL(*input, GetResampledData(_, 1024)).Times(1); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 1024, _)) |
+ .Times(kNumChannels); |
+ } |
EXPECT_CALL(*input, AfterWriteFrames(_)).Times(1); |
} |
// Note that the new smallest stream shall dictate the length of the write. |
@@ -410,6 +430,8 @@ TEST_F(StreamMixerAlsaTest, OneStreamMixesProperly) { |
// Write the stream to ALSA. |
EXPECT_CALL(*input, GetResampledData(_, kNumFrames)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, kNumFrames, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
mixer->WriteFramesForTest(); |
@@ -442,6 +464,8 @@ TEST_F(StreamMixerAlsaTest, OneStreamIsScaledDownProperly) { |
// Write the stream to ALSA. |
EXPECT_CALL(*input, GetResampledData(_, kNumFrames)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, kNumFrames, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
mixer->WriteFramesForTest(); |
@@ -474,6 +498,8 @@ TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsMixProperly) { |
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(_)); |
} |
@@ -546,6 +572,8 @@ TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsMixProperlyWithEdgeCases) { |
test_data->FromInterleaved(kEdgeData[i], kNumFrames, kBytesPerSample); |
inputs[i]->SetData(std::move(test_data)); |
EXPECT_CALL(*inputs[i], GetResampledData(_, kNumFrames)); |
+ EXPECT_CALL(*inputs[i], VolumeScaleAccumulate(_, _, kNumFrames, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*inputs[i], AfterWriteFrames(_)); |
} |
@@ -576,24 +604,28 @@ TEST_F(StreamMixerAlsaTest, WriteBuffersOfVaryingLength) { |
// The input stream will provide buffers of several different lengths. |
input->SetMaxReadSize(7); |
EXPECT_CALL(*input, GetResampledData(_, 7)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 7, _)).Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 7)).Times(1); |
mixer->WriteFramesForTest(); |
input->SetMaxReadSize(100); |
EXPECT_CALL(*input, GetResampledData(_, 100)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 100, _)).Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 100)).Times(1); |
mixer->WriteFramesForTest(); |
input->SetMaxReadSize(32); |
EXPECT_CALL(*input, GetResampledData(_, 32)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 32, _)).Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 32)).Times(1); |
mixer->WriteFramesForTest(); |
input->SetMaxReadSize(1024); |
EXPECT_CALL(*input, GetResampledData(_, 1024)); |
+ EXPECT_CALL(*input, VolumeScaleAccumulate(_, _, 1024, _)).Times(kNumChannels); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 1024)).Times(1); |
mixer->WriteFramesForTest(); |
@@ -620,6 +652,7 @@ TEST_F(StreamMixerAlsaTest, StuckStreamWithoutUnderrun) { |
// to give. |
inputs[0]->SetData(GetTestData(0)); |
EXPECT_CALL(*inputs[0], GetResampledData(_, _)).Times(0); |
+ EXPECT_CALL(*inputs[0], VolumeScaleAccumulate(_, _, _, _)).Times(0); |
EXPECT_CALL(*inputs[0], AfterWriteFrames(_)).Times(0); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, _)).Times(0); |
@@ -652,8 +685,11 @@ TEST_F(StreamMixerAlsaTest, StuckStreamWithUnderrun) { |
const int kNumFrames = 32; |
inputs[0]->SetData(GetTestData(0)); |
EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); |
+ EXPECT_CALL(*inputs[0], VolumeScaleAccumulate(_, _, kNumFrames, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); |
EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); |
+ EXPECT_CALL(*inputs[1], VolumeScaleAccumulate(_, _, kNumFrames, _)).Times(0); |
EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); |
@@ -686,8 +722,11 @@ TEST_F(StreamMixerAlsaTest, StuckStreamWithLowBuffer) { |
const int kNumFrames = 32; |
inputs[0]->SetData(GetTestData(0)); |
EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); |
+ EXPECT_CALL(*inputs[0], VolumeScaleAccumulate(_, _, kNumFrames, _)) |
+ .Times(kNumChannels); |
EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); |
EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); |
+ EXPECT_CALL(*inputs[1], VolumeScaleAccumulate(_, _, _, _)).Times(0); |
EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); |
EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); |