OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa.h" | 5 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 #include <utility> | 10 #include <utility> |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 // StreamMixerAlsa::InputQueue implementation: | 144 // StreamMixerAlsa::InputQueue implementation: |
145 int input_samples_per_second() const override { return samples_per_second_; } | 145 int input_samples_per_second() const override { return samples_per_second_; } |
146 float volume_multiplier() const override { return multiplier_; } | 146 float volume_multiplier() const override { return multiplier_; } |
147 bool primary() const override { return primary_; } | 147 bool primary() const override { return primary_; } |
148 bool IsDeleting() const override { return deleting_; } | 148 bool IsDeleting() const override { return deleting_; } |
149 MOCK_METHOD1(Initialize, | 149 MOCK_METHOD1(Initialize, |
150 void(const MediaPipelineBackendAlsa::RenderingDelay& | 150 void(const MediaPipelineBackendAlsa::RenderingDelay& |
151 mixer_rendering_delay)); | 151 mixer_rendering_delay)); |
152 int MaxReadSize() override { return max_read_size_; } | 152 int MaxReadSize() override { return max_read_size_; } |
153 MOCK_METHOD2(GetResampledData, void(::media::AudioBus* dest, int frames)); | 153 MOCK_METHOD2(GetResampledData, void(::media::AudioBus* dest, int frames)); |
| 154 MOCK_METHOD0(OnSkipped, void()); |
154 MOCK_METHOD1(AfterWriteFrames, | 155 MOCK_METHOD1(AfterWriteFrames, |
155 void(const MediaPipelineBackendAlsa::RenderingDelay& | 156 void(const MediaPipelineBackendAlsa::RenderingDelay& |
156 mixer_rendering_delay)); | 157 mixer_rendering_delay)); |
157 MOCK_METHOD1(SignalError, void(StreamMixerAlsaInput::MixerError error)); | 158 MOCK_METHOD1(SignalError, void(StreamMixerAlsaInput::MixerError error)); |
158 MOCK_METHOD1(PrepareToDelete, void(const OnReadyToDeleteCb& delete_cb)); | 159 MOCK_METHOD1(PrepareToDelete, void(const OnReadyToDeleteCb& delete_cb)); |
159 | 160 |
160 // Setters and getters for test control. | 161 // Setters and getters for test control. |
161 void SetPaused(bool paused) { paused_ = paused; } | 162 void SetPaused(bool paused) { paused_ = paused; } |
162 void SetMaxReadSize(int max_read_size) { max_read_size_ = max_read_size; } | 163 void SetMaxReadSize(int max_read_size) { max_read_size_ = max_read_size; } |
163 void SetData(std::unique_ptr<::media::AudioBus> data) { | 164 void SetData(std::unique_ptr<::media::AudioBus> data) { |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 | 370 |
370 // TODO(slan): Verify that the data is mixed properly with math. | 371 // TODO(slan): Verify that the data is mixed properly with math. |
371 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 512)).Times(1); | 372 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 512)).Times(1); |
372 mixer->WriteFramesForTest(); | 373 mixer->WriteFramesForTest(); |
373 | 374 |
374 // Make two of these streams non-primary, and exhaust a non-primary stream. | 375 // Make two of these streams non-primary, and exhaust a non-primary stream. |
375 // All non-empty streams shall be polled for data and the mixer shall write | 376 // All non-empty streams shall be polled for data and the mixer shall write |
376 // to ALSA. | 377 // to ALSA. |
377 inputs[1]->SetPrimary(false); | 378 inputs[1]->SetPrimary(false); |
378 inputs[1]->SetMaxReadSize(0); | 379 inputs[1]->SetMaxReadSize(0); |
| 380 EXPECT_CALL(*inputs[1], OnSkipped()); |
379 inputs[2]->SetPrimary(false); | 381 inputs[2]->SetPrimary(false); |
380 for (auto* input : inputs) { | 382 for (auto* input : inputs) { |
381 if (input != inputs[1]) | 383 if (input != inputs[1]) |
382 EXPECT_CALL(*input, GetResampledData(_, 1024)).Times(1); | 384 EXPECT_CALL(*input, GetResampledData(_, 1024)).Times(1); |
383 EXPECT_CALL(*input, AfterWriteFrames(_)).Times(1); | 385 EXPECT_CALL(*input, AfterWriteFrames(_)).Times(1); |
384 } | 386 } |
385 // Note that the new smallest stream shall dictate the length of the write. | 387 // Note that the new smallest stream shall dictate the length of the write. |
386 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 1024)).Times(1); | 388 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, 1024)).Times(1); |
387 mixer->WriteFramesForTest(); | 389 mixer->WriteFramesForTest(); |
388 | 390 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 649 |
648 // Poll the inputs for data. The first input will provide data (since the | 650 // Poll the inputs for data. The first input will provide data (since the |
649 // output is in an underrun condition); the second input can't provide any | 651 // output is in an underrun condition); the second input can't provide any |
650 // data, but AfterWriteFrames() will still be called on it so that it has the | 652 // data, but AfterWriteFrames() will still be called on it so that it has the |
651 // correct rendering delay. | 653 // correct rendering delay. |
652 const int kNumFrames = 32; | 654 const int kNumFrames = 32; |
653 inputs[0]->SetData(GetTestData(0)); | 655 inputs[0]->SetData(GetTestData(0)); |
654 EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); | 656 EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); |
655 EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); | 657 EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); |
656 EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); | 658 EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); |
| 659 EXPECT_CALL(*inputs[1], OnSkipped()); |
657 EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); | 660 EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); |
658 | 661 |
659 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); | 662 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); |
660 mixer->WriteFramesForTest(); | 663 mixer->WriteFramesForTest(); |
661 } | 664 } |
662 | 665 |
663 TEST_F(StreamMixerAlsaTest, StuckStreamWithLowBuffer) { | 666 TEST_F(StreamMixerAlsaTest, StuckStreamWithLowBuffer) { |
664 // Create a group of input streams. | 667 // Create a group of input streams. |
665 std::vector<testing::StrictMock<MockInputQueue>*> inputs; | 668 std::vector<testing::StrictMock<MockInputQueue>*> inputs; |
666 const int kNumInputs = 2; | 669 const int kNumInputs = 2; |
(...skipping 14 matching lines...) Expand all Loading... |
681 | 684 |
682 // Poll the inputs for data. The first input will provide data (since the | 685 // Poll the inputs for data. The first input will provide data (since the |
683 // output is in an low buffer condition); the second input can't provide any | 686 // output is in an low buffer condition); the second input can't provide any |
684 // data, but AfterWriteFrames() will still be called on it so that it has the | 687 // data, but AfterWriteFrames() will still be called on it so that it has the |
685 // correct rendering delay. | 688 // correct rendering delay. |
686 const int kNumFrames = 32; | 689 const int kNumFrames = 32; |
687 inputs[0]->SetData(GetTestData(0)); | 690 inputs[0]->SetData(GetTestData(0)); |
688 EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); | 691 EXPECT_CALL(*inputs[0], GetResampledData(_, kNumFrames)); |
689 EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); | 692 EXPECT_CALL(*inputs[0], AfterWriteFrames(_)); |
690 EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); | 693 EXPECT_CALL(*inputs[1], GetResampledData(_, _)).Times(0); |
| 694 EXPECT_CALL(*inputs[1], OnSkipped()); |
691 EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); | 695 EXPECT_CALL(*inputs[1], AfterWriteFrames(_)); |
692 | 696 |
693 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); | 697 EXPECT_CALL(*mock_alsa(), PcmWritei(_, _, kNumFrames)).Times(1); |
694 mixer->WriteFramesForTest(); | 698 mixer->WriteFramesForTest(); |
695 } | 699 } |
696 | 700 |
697 } // namespace media | 701 } // namespace media |
698 } // namespace chromecast | 702 } // namespace chromecast |
OLD | NEW |