Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Side by Side Diff: media/renderers/audio_renderer_impl_unittest.cc

Issue 1942803002: Caching AudioOutputDevice instances in mixer manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make WebAudioSourceProvider to always return real sink info reguardless the client - to avoid behavior change. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/renderers/audio_renderer_impl.cc ('k') | media/renderers/default_renderer_factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "base/callback_helpers.h" 11 #include "base/callback_helpers.h"
12 #include "base/format_macros.h" 12 #include "base/format_macros.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/test/simple_test_tick_clock.h" 16 #include "base/test/simple_test_tick_clock.h"
17 #include "media/base/audio_buffer_converter.h" 17 #include "media/base/audio_buffer_converter.h"
18 #include "media/base/audio_hardware_config.h"
19 #include "media/base/audio_splicer.h" 18 #include "media/base/audio_splicer.h"
20 #include "media/base/fake_audio_renderer_sink.h" 19 #include "media/base/fake_audio_renderer_sink.h"
21 #include "media/base/gmock_callback_support.h" 20 #include "media/base/gmock_callback_support.h"
22 #include "media/base/media_util.h" 21 #include "media/base/media_util.h"
23 #include "media/base/mock_filters.h" 22 #include "media/base/mock_filters.h"
24 #include "media/base/test_helpers.h" 23 #include "media/base/test_helpers.h"
25 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
26 25
27 using ::base::TimeDelta; 26 using ::base::TimeDelta;
28 using ::testing::_; 27 using ::testing::_;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 kOutputSamplesPerSecond; 61 kOutputSamplesPerSecond;
63 62
64 ACTION_P(EnterPendingDecoderInitStateAction, test) { 63 ACTION_P(EnterPendingDecoderInitStateAction, test) {
65 test->EnterPendingDecoderInitState(arg2); 64 test->EnterPendingDecoderInitState(arg2);
66 } 65 }
67 66
68 class AudioRendererImplTest : public ::testing::Test, public RendererClient { 67 class AudioRendererImplTest : public ::testing::Test, public RendererClient {
69 public: 68 public:
70 // Give the decoder some non-garbage media properties. 69 // Give the decoder some non-garbage media properties.
71 AudioRendererImplTest() 70 AudioRendererImplTest()
72 : hardware_config_(AudioParameters(), AudioParameters()), 71 : hardware_params_(AudioParameters::AUDIO_PCM_LOW_LATENCY,
72 kChannelLayout,
73 kOutputSamplesPerSecond,
74 SampleFormatToBytesPerChannel(kSampleFormat) * 8,
75 512),
76 sink_(new FakeAudioRendererSink(hardware_params_)),
73 tick_clock_(new base::SimpleTestTickClock()), 77 tick_clock_(new base::SimpleTestTickClock()),
74 demuxer_stream_(DemuxerStream::AUDIO), 78 demuxer_stream_(DemuxerStream::AUDIO),
75 decoder_(new MockAudioDecoder()), 79 decoder_(new MockAudioDecoder()),
76 ended_(false) { 80 ended_(false) {
77 AudioDecoderConfig audio_config(kCodec, kSampleFormat, kChannelLayout, 81 AudioDecoderConfig audio_config(kCodec, kSampleFormat, kChannelLayout,
78 kInputSamplesPerSecond, EmptyExtraData(), 82 kInputSamplesPerSecond, EmptyExtraData(),
79 Unencrypted()); 83 Unencrypted());
80 demuxer_stream_.set_audio_decoder_config(audio_config); 84 demuxer_stream_.set_audio_decoder_config(audio_config);
81 85
82 // Used to save callbacks and run them at a later time. 86 // Used to save callbacks and run them at a later time.
83 EXPECT_CALL(*decoder_, Decode(_, _)) 87 EXPECT_CALL(*decoder_, Decode(_, _))
84 .WillRepeatedly(Invoke(this, &AudioRendererImplTest::DecodeDecoder)); 88 .WillRepeatedly(Invoke(this, &AudioRendererImplTest::DecodeDecoder));
85 EXPECT_CALL(*decoder_, Reset(_)) 89 EXPECT_CALL(*decoder_, Reset(_))
86 .WillRepeatedly(Invoke(this, &AudioRendererImplTest::ResetDecoder)); 90 .WillRepeatedly(Invoke(this, &AudioRendererImplTest::ResetDecoder));
87 91
88 // Mock out demuxer reads. 92 // Mock out demuxer reads.
89 EXPECT_CALL(demuxer_stream_, Read(_)).WillRepeatedly( 93 EXPECT_CALL(demuxer_stream_, Read(_)).WillRepeatedly(
90 RunCallback<0>(DemuxerStream::kOk, 94 RunCallback<0>(DemuxerStream::kOk,
91 scoped_refptr<DecoderBuffer>(new DecoderBuffer(0)))); 95 scoped_refptr<DecoderBuffer>(new DecoderBuffer(0))));
92 EXPECT_CALL(demuxer_stream_, SupportsConfigChanges()) 96 EXPECT_CALL(demuxer_stream_, SupportsConfigChanges())
93 .WillRepeatedly(Return(true)); 97 .WillRepeatedly(Return(true));
94 AudioParameters out_params(AudioParameters::AUDIO_PCM_LOW_LATENCY, 98 AudioParameters out_params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
95 kChannelLayout, 99 kChannelLayout,
96 kOutputSamplesPerSecond, 100 kOutputSamplesPerSecond,
97 SampleFormatToBytesPerChannel(kSampleFormat) * 8, 101 SampleFormatToBytesPerChannel(kSampleFormat) * 8,
98 512); 102 512);
99 hardware_config_.UpdateOutputConfig(out_params);
100 ScopedVector<AudioDecoder> decoders; 103 ScopedVector<AudioDecoder> decoders;
101 decoders.push_back(decoder_); 104 decoders.push_back(decoder_);
102 sink_ = new FakeAudioRendererSink();
103 renderer_.reset(new AudioRendererImpl(message_loop_.task_runner(), 105 renderer_.reset(new AudioRendererImpl(message_loop_.task_runner(),
104 sink_.get(), std::move(decoders), 106 sink_.get(), std::move(decoders),
105 hardware_config_, new MediaLog())); 107 new MediaLog()));
106 renderer_->tick_clock_.reset(tick_clock_); 108 renderer_->tick_clock_.reset(tick_clock_);
107 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); 109 tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
108 } 110 }
109 111
110 virtual ~AudioRendererImplTest() { 112 virtual ~AudioRendererImplTest() {
111 SCOPED_TRACE("~AudioRendererImplTest()"); 113 SCOPED_TRACE("~AudioRendererImplTest()");
112 } 114 }
113 115
114 void ExpectUnsupportedAudioDecoder() { 116 void ExpectUnsupportedAudioDecoder() {
115 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) 117 EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 return renderer_->splicer_->HasNextBuffer(); 357 return renderer_->splicer_->HasNextBuffer();
356 } 358 }
357 359
358 base::TimeDelta CurrentMediaTime() { 360 base::TimeDelta CurrentMediaTime() {
359 return renderer_->CurrentMediaTime(); 361 return renderer_->CurrentMediaTime();
360 } 362 }
361 363
362 bool ended() const { return ended_; } 364 bool ended() const { return ended_; }
363 365
364 // Fixture members. 366 // Fixture members.
367 AudioParameters hardware_params_;
365 base::MessageLoop message_loop_; 368 base::MessageLoop message_loop_;
366 std::unique_ptr<AudioRendererImpl> renderer_; 369 std::unique_ptr<AudioRendererImpl> renderer_;
367 scoped_refptr<FakeAudioRendererSink> sink_; 370 scoped_refptr<FakeAudioRendererSink> sink_;
368 AudioHardwareConfig hardware_config_;
369 base::SimpleTestTickClock* tick_clock_; 371 base::SimpleTestTickClock* tick_clock_;
370 PipelineStatistics last_statistics_; 372 PipelineStatistics last_statistics_;
371 373
372 private: 374 private:
373 void DecodeDecoder(const scoped_refptr<DecoderBuffer>& buffer, 375 void DecodeDecoder(const scoped_refptr<DecoderBuffer>& buffer,
374 const AudioDecoder::DecodeCB& decode_cb) { 376 const AudioDecoder::DecodeCB& decode_cb) {
375 // TODO(scherkus): Make this a DCHECK after threading semantics are fixed. 377 // TODO(scherkus): Make this a DCHECK after threading semantics are fixed.
376 if (base::MessageLoop::current() != &message_loop_) { 378 if (base::MessageLoop::current() != &message_loop_) {
377 message_loop_.PostTask(FROM_HERE, base::Bind( 379 message_loop_.PostTask(FROM_HERE, base::Bind(
378 &AudioRendererImplTest::DecodeDecoder, 380 &AudioRendererImplTest::DecodeDecoder,
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 timestamp_helper.AddFrames(frames_to_consume.value); 710 timestamp_helper.AddFrames(frames_to_consume.value);
709 EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime()); 711 EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime());
710 } 712 }
711 713
712 TEST_F(AudioRendererImplTest, RenderingDelayedForEarlyStartTime) { 714 TEST_F(AudioRendererImplTest, RenderingDelayedForEarlyStartTime) {
713 Initialize(); 715 Initialize();
714 716
715 // Choose a first timestamp a few buffers into the future, which ends halfway 717 // Choose a first timestamp a few buffers into the future, which ends halfway
716 // through the desired output buffer; this allows for maximum test coverage. 718 // through the desired output buffer; this allows for maximum test coverage.
717 const double kBuffers = 4.5; 719 const double kBuffers = 4.5;
718 const base::TimeDelta first_timestamp = base::TimeDelta::FromSecondsD( 720 const base::TimeDelta first_timestamp =
719 hardware_config_.GetOutputBufferSize() * kBuffers / 721 base::TimeDelta::FromSecondsD(hardware_params_.frames_per_buffer() *
720 hardware_config_.GetOutputSampleRate()); 722 kBuffers / hardware_params_.sample_rate());
721 723
722 Preroll(base::TimeDelta(), first_timestamp, PIPELINE_OK); 724 Preroll(base::TimeDelta(), first_timestamp, PIPELINE_OK);
723 StartTicking(); 725 StartTicking();
724 726
725 // Verify the first few buffers are silent. 727 // Verify the first few buffers are silent.
726 std::unique_ptr<AudioBus> bus = 728 std::unique_ptr<AudioBus> bus = AudioBus::Create(hardware_params_);
727 AudioBus::Create(hardware_config_.GetOutputConfig());
728 int frames_read = 0; 729 int frames_read = 0;
729 for (int i = 0; i < std::floor(kBuffers); ++i) { 730 for (int i = 0; i < std::floor(kBuffers); ++i) {
730 EXPECT_TRUE(sink_->Render(bus.get(), 0, &frames_read)); 731 EXPECT_TRUE(sink_->Render(bus.get(), 0, &frames_read));
731 EXPECT_EQ(frames_read, bus->frames()); 732 EXPECT_EQ(frames_read, bus->frames());
732 for (int j = 0; j < bus->frames(); ++j) 733 for (int j = 0; j < bus->frames(); ++j)
733 ASSERT_FLOAT_EQ(0.0f, bus->channel(0)[j]); 734 ASSERT_FLOAT_EQ(0.0f, bus->channel(0)[j]);
734 WaitForPendingRead(); 735 WaitForPendingRead();
735 DeliverRemainingAudio(); 736 DeliverRemainingAudio();
736 } 737 }
737 738
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 // Advance far enough that we shouldn't be clamped to current time (tested 942 // Advance far enough that we shouldn't be clamped to current time (tested
942 // already above). 943 // already above).
943 tick_clock_->Advance(kOneSecond); 944 tick_clock_->Advance(kOneSecond);
944 EXPECT_EQ( 945 EXPECT_EQ(
945 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), 946 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value),
946 CurrentMediaWallClockTime(&is_time_moving)); 947 CurrentMediaWallClockTime(&is_time_moving));
947 EXPECT_TRUE(is_time_moving); 948 EXPECT_TRUE(is_time_moving);
948 } 949 }
949 950
950 } // namespace media 951 } // namespace media
OLDNEW
« no previous file with comments | « media/renderers/audio_renderer_impl.cc ('k') | media/renderers/default_renderer_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698