| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "media/renderers/audio_renderer_impl.h" | 5 #include "media/renderers/audio_renderer_impl.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 ScopedVector<AudioDecoder> decoders; | 121 ScopedVector<AudioDecoder> decoders; |
| 122 decoders.push_back(decoder_); | 122 decoders.push_back(decoder_); |
| 123 renderer_.reset(new AudioRendererImpl(message_loop_.task_runner(), | 123 renderer_.reset(new AudioRendererImpl(message_loop_.task_runner(), |
| 124 sink_.get(), std::move(decoders), | 124 sink_.get(), std::move(decoders), |
| 125 new MediaLog())); | 125 new MediaLog())); |
| 126 testing::Mock::VerifyAndClearExpectations(&demuxer_stream_); | 126 testing::Mock::VerifyAndClearExpectations(&demuxer_stream_); |
| 127 EXPECT_CALL(demuxer_stream_, SupportsConfigChanges()) | 127 EXPECT_CALL(demuxer_stream_, SupportsConfigChanges()) |
| 128 .WillRepeatedly(Return(false)); | 128 .WillRepeatedly(Return(false)); |
| 129 } | 129 } |
| 130 | 130 |
| 131 // Reconfigures a renderer with config change support using given params. |
| 132 void ConfigureConfigChangeRenderer(const AudioParameters& params, |
| 133 const AudioParameters& hardware_params) { |
| 134 hardware_params_ = hardware_params; |
| 135 sink_ = new FakeAudioRendererSink(hardware_params_); |
| 136 decoder_ = new MockAudioDecoder(); |
| 137 ScopedVector<AudioDecoder> decoders; |
| 138 decoders.push_back(decoder_); |
| 139 renderer_.reset(new AudioRendererImpl(message_loop_.task_runner(), |
| 140 sink_.get(), std::move(decoders), |
| 141 new MediaLog())); |
| 142 testing::Mock::VerifyAndClearExpectations(&demuxer_stream_); |
| 143 EXPECT_CALL(demuxer_stream_, SupportsConfigChanges()) |
| 144 .WillRepeatedly(Return(true)); |
| 145 } |
| 146 |
| 131 void ExpectUnsupportedAudioDecoder() { | 147 void ExpectUnsupportedAudioDecoder() { |
| 132 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) | 148 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) |
| 133 .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(false))); | 149 .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(false))); |
| 134 } | 150 } |
| 135 | 151 |
| 136 // RendererClient implementation. | 152 // RendererClient implementation. |
| 137 MOCK_METHOD1(OnError, void(PipelineStatus)); | 153 MOCK_METHOD1(OnError, void(PipelineStatus)); |
| 138 void OnEnded() override { | 154 void OnEnded() override { |
| 139 CHECK(!ended_); | 155 CHECK(!ended_); |
| 140 ended_ = true; | 156 ended_ = true; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 | 382 |
| 367 InputFrames converter_input_frames_left() const { | 383 InputFrames converter_input_frames_left() const { |
| 368 return InputFrames( | 384 return InputFrames( |
| 369 renderer_->buffer_converter_->input_frames_left_for_testing()); | 385 renderer_->buffer_converter_->input_frames_left_for_testing()); |
| 370 } | 386 } |
| 371 | 387 |
| 372 base::TimeDelta CurrentMediaTime() { | 388 base::TimeDelta CurrentMediaTime() { |
| 373 return renderer_->CurrentMediaTime(); | 389 return renderer_->CurrentMediaTime(); |
| 374 } | 390 } |
| 375 | 391 |
| 392 std::vector<bool> channel_mask() const { return renderer_->channel_mask_; } |
| 393 |
| 376 bool ended() const { return ended_; } | 394 bool ended() const { return ended_; } |
| 377 | 395 |
| 378 // Fixture members. | 396 // Fixture members. |
| 379 AudioParameters hardware_params_; | 397 AudioParameters hardware_params_; |
| 380 base::MessageLoop message_loop_; | 398 base::MessageLoop message_loop_; |
| 381 std::unique_ptr<AudioRendererImpl> renderer_; | 399 std::unique_ptr<AudioRendererImpl> renderer_; |
| 382 scoped_refptr<FakeAudioRendererSink> sink_; | 400 scoped_refptr<FakeAudioRendererSink> sink_; |
| 383 base::SimpleTestTickClock* tick_clock_; | 401 base::SimpleTestTickClock* tick_clock_; |
| 384 PipelineStatistics last_statistics_; | 402 PipelineStatistics last_statistics_; |
| 385 | 403 |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 // Verify in the no-config-changes-expected case. | 589 // Verify in the no-config-changes-expected case. |
| 572 ConfigureBasicRenderer(AudioParameters( | 590 ConfigureBasicRenderer(AudioParameters( |
| 573 AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout, | 591 AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout, |
| 574 kOutputSamplesPerSecond, SampleFormatToBytesPerChannel(kSampleFormat) * 8, | 592 kOutputSamplesPerSecond, SampleFormatToBytesPerChannel(kSampleFormat) * 8, |
| 575 1024 * 15)); | 593 1024 * 15)); |
| 576 | 594 |
| 577 Initialize(); | 595 Initialize(); |
| 578 EXPECT_GT(buffer_capacity().value, hardware_params_.frames_per_buffer()); | 596 EXPECT_GT(buffer_capacity().value, hardware_params_.frames_per_buffer()); |
| 579 } | 597 } |
| 580 | 598 |
| 599 // Verify that the proper reduced search space is configured for playback rate |
| 600 // changes when upmixing is applied to the input. |
| 601 TEST_F(AudioRendererImplTest, ChannelMask) { |
| 602 Initialize(); |
| 603 AudioParameters hw_params(AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 604 CHANNEL_LAYOUT_7_1, kOutputSamplesPerSecond, |
| 605 SampleFormatToBytesPerChannel(kSampleFormat) * 8, |
| 606 1024); |
| 607 ConfigureConfigChangeRenderer( |
| 608 AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 609 CHANNEL_LAYOUT_STEREO, kOutputSamplesPerSecond, |
| 610 SampleFormatToBytesPerChannel(kSampleFormat) * 8, 1024), |
| 611 hw_params); |
| 612 std::vector<bool> mask = channel_mask(); |
| 613 EXPECT_TRUE(mask.empty()); |
| 614 Initialize(); |
| 615 mask = channel_mask(); |
| 616 EXPECT_FALSE(mask.empty()); |
| 617 for (int ch = 0; ch < hw_params.channels(); ++ch) { |
| 618 if (ch > 1) |
| 619 ASSERT_FALSE(mask[ch]); |
| 620 else |
| 621 ASSERT_TRUE(mask[ch]); |
| 622 } |
| 623 } |
| 624 |
| 581 TEST_F(AudioRendererImplTest, Underflow_Flush) { | 625 TEST_F(AudioRendererImplTest, Underflow_Flush) { |
| 582 Initialize(); | 626 Initialize(); |
| 583 Preroll(); | 627 Preroll(); |
| 584 StartTicking(); | 628 StartTicking(); |
| 585 | 629 |
| 586 // Force underflow. | 630 // Force underflow. |
| 587 EXPECT_TRUE(ConsumeBufferedData(frames_buffered())); | 631 EXPECT_TRUE(ConsumeBufferedData(frames_buffered())); |
| 588 WaitForPendingRead(); | 632 WaitForPendingRead(); |
| 589 EXPECT_CALL(*this, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 633 EXPECT_CALL(*this, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
| 590 EXPECT_FALSE(ConsumeBufferedData(OutputFrames(1))); | 634 EXPECT_FALSE(ConsumeBufferedData(OutputFrames(1))); |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 // Advance far enough that we shouldn't be clamped to current time (tested | 1037 // Advance far enough that we shouldn't be clamped to current time (tested |
| 994 // already above). | 1038 // already above). |
| 995 tick_clock_->Advance(kOneSecond); | 1039 tick_clock_->Advance(kOneSecond); |
| 996 EXPECT_EQ( | 1040 EXPECT_EQ( |
| 997 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), | 1041 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), |
| 998 CurrentMediaWallClockTime(&is_time_moving)); | 1042 CurrentMediaWallClockTime(&is_time_moving)); |
| 999 EXPECT_TRUE(is_time_moving); | 1043 EXPECT_TRUE(is_time_moving); |
| 1000 } | 1044 } |
| 1001 | 1045 |
| 1002 } // namespace media | 1046 } // namespace media |
| OLD | NEW |