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

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: dalecurtis@'s comments addressed, build issue fixed Created 4 years, 7 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
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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 return renderer_->splicer_->HasNextBuffer(); 353 return renderer_->splicer_->HasNextBuffer();
352 } 354 }
353 355
354 base::TimeDelta CurrentMediaTime() { 356 base::TimeDelta CurrentMediaTime() {
355 return renderer_->CurrentMediaTime(); 357 return renderer_->CurrentMediaTime();
356 } 358 }
357 359
358 bool ended() const { return ended_; } 360 bool ended() const { return ended_; }
359 361
360 // Fixture members. 362 // Fixture members.
363 AudioParameters hardware_params_;
361 base::MessageLoop message_loop_; 364 base::MessageLoop message_loop_;
362 std::unique_ptr<AudioRendererImpl> renderer_; 365 std::unique_ptr<AudioRendererImpl> renderer_;
363 scoped_refptr<FakeAudioRendererSink> sink_; 366 scoped_refptr<FakeAudioRendererSink> sink_;
364 AudioHardwareConfig hardware_config_;
365 base::SimpleTestTickClock* tick_clock_; 367 base::SimpleTestTickClock* tick_clock_;
366 PipelineStatistics last_statistics_; 368 PipelineStatistics last_statistics_;
367 369
368 private: 370 private:
369 void DecodeDecoder(const scoped_refptr<DecoderBuffer>& buffer, 371 void DecodeDecoder(const scoped_refptr<DecoderBuffer>& buffer,
370 const AudioDecoder::DecodeCB& decode_cb) { 372 const AudioDecoder::DecodeCB& decode_cb) {
371 // TODO(scherkus): Make this a DCHECK after threading semantics are fixed. 373 // TODO(scherkus): Make this a DCHECK after threading semantics are fixed.
372 if (base::MessageLoop::current() != &message_loop_) { 374 if (base::MessageLoop::current() != &message_loop_) {
373 message_loop_.PostTask(FROM_HERE, base::Bind( 375 message_loop_.PostTask(FROM_HERE, base::Bind(
374 &AudioRendererImplTest::DecodeDecoder, 376 &AudioRendererImplTest::DecodeDecoder,
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 timestamp_helper.AddFrames(frames_to_consume.value); 706 timestamp_helper.AddFrames(frames_to_consume.value);
705 EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime()); 707 EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime());
706 } 708 }
707 709
708 TEST_F(AudioRendererImplTest, RenderingDelayedForEarlyStartTime) { 710 TEST_F(AudioRendererImplTest, RenderingDelayedForEarlyStartTime) {
709 Initialize(); 711 Initialize();
710 712
711 // Choose a first timestamp a few buffers into the future, which ends halfway 713 // Choose a first timestamp a few buffers into the future, which ends halfway
712 // through the desired output buffer; this allows for maximum test coverage. 714 // through the desired output buffer; this allows for maximum test coverage.
713 const double kBuffers = 4.5; 715 const double kBuffers = 4.5;
714 const base::TimeDelta first_timestamp = base::TimeDelta::FromSecondsD( 716 const base::TimeDelta first_timestamp =
715 hardware_config_.GetOutputBufferSize() * kBuffers / 717 base::TimeDelta::FromSecondsD(hardware_params_.frames_per_buffer() *
716 hardware_config_.GetOutputSampleRate()); 718 kBuffers / hardware_params_.sample_rate());
717 719
718 Preroll(base::TimeDelta(), first_timestamp, PIPELINE_OK); 720 Preroll(base::TimeDelta(), first_timestamp, PIPELINE_OK);
719 StartTicking(); 721 StartTicking();
720 722
721 // Verify the first few buffers are silent. 723 // Verify the first few buffers are silent.
722 std::unique_ptr<AudioBus> bus = 724 std::unique_ptr<AudioBus> bus = AudioBus::Create(hardware_params_);
723 AudioBus::Create(hardware_config_.GetOutputConfig());
724 int frames_read = 0; 725 int frames_read = 0;
725 for (int i = 0; i < std::floor(kBuffers); ++i) { 726 for (int i = 0; i < std::floor(kBuffers); ++i) {
726 EXPECT_TRUE(sink_->Render(bus.get(), 0, &frames_read)); 727 EXPECT_TRUE(sink_->Render(bus.get(), 0, &frames_read));
727 EXPECT_EQ(frames_read, bus->frames()); 728 EXPECT_EQ(frames_read, bus->frames());
728 for (int j = 0; j < bus->frames(); ++j) 729 for (int j = 0; j < bus->frames(); ++j)
729 ASSERT_FLOAT_EQ(0.0f, bus->channel(0)[j]); 730 ASSERT_FLOAT_EQ(0.0f, bus->channel(0)[j]);
730 WaitForPendingRead(); 731 WaitForPendingRead();
731 DeliverRemainingAudio(); 732 DeliverRemainingAudio();
732 } 733 }
733 734
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 // Advance far enough that we shouldn't be clamped to current time (tested 938 // Advance far enough that we shouldn't be clamped to current time (tested
938 // already above). 939 // already above).
939 tick_clock_->Advance(kOneSecond); 940 tick_clock_->Advance(kOneSecond);
940 EXPECT_EQ( 941 EXPECT_EQ(
941 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), 942 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value),
942 CurrentMediaWallClockTime(&is_time_moving)); 943 CurrentMediaWallClockTime(&is_time_moving));
943 EXPECT_TRUE(is_time_moving); 944 EXPECT_TRUE(is_time_moving);
944 } 945 }
945 946
946 } // namespace media 947 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698