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

Side by Side Diff: media/base/audio_renderer_mixer_unittest.cc

Issue 1942803002: Caching AudioOutputDevice instances in mixer manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase, fix for sleep() compile error on win and a bit of cleanup around timeouts. 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 // MSVC++ requires this to be set before any other includes to get M_PI. 5 // MSVC++ requires this to be set before any other includes to get M_PI.
6 #define _USE_MATH_DEFINES 6 #define _USE_MATH_DEFINES
7 7
8 #include "media/base/audio_renderer_mixer.h" 8 #include "media/base/audio_renderer_mixer.h"
9 9
10 #include <stddef.h> 10 #include <stddef.h>
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 65
66 // Create output parameters based on test parameters. 66 // Create output parameters based on test parameters.
67 output_parameters_ = AudioParameters( 67 output_parameters_ = AudioParameters(
68 AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout, 68 AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout,
69 std::tr1::get<2>(GetParam()), 16, kLowLatencyBufferSize); 69 std::tr1::get<2>(GetParam()), 16, kLowLatencyBufferSize);
70 70
71 sink_ = new MockAudioRendererSink(); 71 sink_ = new MockAudioRendererSink();
72 EXPECT_CALL(*sink_.get(), Start()); 72 EXPECT_CALL(*sink_.get(), Start());
73 EXPECT_CALL(*sink_.get(), Stop()); 73 EXPECT_CALL(*sink_.get(), Stop());
74 74
75 mixer_.reset(new AudioRendererMixer(output_parameters_, sink_)); 75 mixer_.reset(
76 new AudioRendererMixer(output_parameters_, sink_.get(),
77 base::Bind(&AudioRendererMixerTest::ReleaseSink,
78 base::Unretained(this))));
76 mixer_callback_ = sink_->callback(); 79 mixer_callback_ = sink_->callback();
77 80
78 audio_bus_ = AudioBus::Create(output_parameters_); 81 audio_bus_ = AudioBus::Create(output_parameters_);
79 expected_audio_bus_ = AudioBus::Create(output_parameters_); 82 expected_audio_bus_ = AudioBus::Create(output_parameters_);
80 83
81 // Allocate one callback for generating expected results. 84 // Allocate one callback for generating expected results.
82 double step = kSineCycles / static_cast<double>( 85 double step = kSineCycles / static_cast<double>(
83 output_parameters_.frames_per_buffer()); 86 output_parameters_.frames_per_buffer());
84 expected_callback_.reset(new FakeAudioRenderCallback(step)); 87 expected_callback_.reset(new FakeAudioRenderCallback(step));
85 } 88 }
86 89
87 AudioRendererMixer* GetMixer(const AudioParameters& params, 90 AudioRendererMixer* GetMixer(const AudioParameters& params,
88 const std::string& device_id, 91 const std::string& device_id,
89 const url::Origin& security_origin, 92 const url::Origin& security_origin,
90 OutputDeviceStatus* device_status) { 93 OutputDeviceStatus* device_status) {
91 return mixer_.get(); 94 return mixer_.get();
92 } 95 }
93 96
94 MOCK_METHOD3(RemoveMixer, 97 MOCK_METHOD3(RemoveMixer,
95 void(const AudioParameters&, 98 void(const AudioParameters&,
96 const std::string&, 99 const std::string&,
97 const url::Origin&)); 100 const url::Origin&));
98 101
102 MOCK_METHOD2(GetOutputDeviceInfo,
103 OutputDeviceInfo(const std::string&, const url::Origin&));
104
105 MOCK_METHOD1(ReleaseSink, void(AudioRendererSink*));
106
99 void InitializeInputs(int inputs_per_sample_rate) { 107 void InitializeInputs(int inputs_per_sample_rate) {
100 mixer_inputs_.reserve(inputs_per_sample_rate * input_parameters_.size()); 108 mixer_inputs_.reserve(inputs_per_sample_rate * input_parameters_.size());
101 fake_callbacks_.reserve(inputs_per_sample_rate * input_parameters_.size()); 109 fake_callbacks_.reserve(inputs_per_sample_rate * input_parameters_.size());
102 110
103 for (size_t i = 0, input = 0; i < input_parameters_.size(); ++i) { 111 for (size_t i = 0, input = 0; i < input_parameters_.size(); ++i) {
104 // Setup FakeAudioRenderCallback step to compensate for resampling. 112 // Setup FakeAudioRenderCallback step to compensate for resampling.
105 double scale_factor = 113 double scale_factor =
106 input_parameters_[i].sample_rate() / 114 input_parameters_[i].sample_rate() /
107 static_cast<double>(output_parameters_.sample_rate()); 115 static_cast<double>(output_parameters_.sample_rate());
108 double step = 116 double step =
109 kSineCycles / 117 kSineCycles /
110 (scale_factor * 118 (scale_factor *
111 static_cast<double>(output_parameters_.frames_per_buffer())); 119 static_cast<double>(output_parameters_.frames_per_buffer()));
112 120
113 for (int j = 0; j < inputs_per_sample_rate; ++j, ++input) { 121 for (int j = 0; j < inputs_per_sample_rate; ++j, ++input) {
114 fake_callbacks_.push_back(new FakeAudioRenderCallback(step)); 122 fake_callbacks_.push_back(new FakeAudioRenderCallback(step));
115 mixer_inputs_.push_back(new AudioRendererMixerInput( 123 mixer_inputs_.push_back(CreateMixerInput());
116 base::Bind(&AudioRendererMixerTest::GetMixer,
117 base::Unretained(this)),
118 base::Bind(&AudioRendererMixerTest::RemoveMixer,
119 base::Unretained(this)),
120 // Default device ID and security origin.
121 std::string(), url::Origin()));
122 mixer_inputs_[input]->Initialize(input_parameters_[i], 124 mixer_inputs_[input]->Initialize(input_parameters_[i],
123 fake_callbacks_[input]); 125 fake_callbacks_[input]);
124 mixer_inputs_[input]->SetVolume(1.0f); 126 mixer_inputs_[input]->SetVolume(1.0f);
125 } 127 }
126 } 128 }
127 EXPECT_CALL(*this, RemoveMixer(testing::_, testing::_, testing::_)) 129 EXPECT_CALL(*this, RemoveMixer(testing::_, testing::_, testing::_))
128 .Times(mixer_inputs_.size()); 130 .Times(mixer_inputs_.size());
129 } 131 }
130 132
131 bool ValidateAudioData(int index, int frames, float scale, double epsilon) { 133 bool ValidateAudioData(int index, int frames, float scale, double epsilon) {
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 if (mixer_inputs_.size() % 2) 324 if (mixer_inputs_.size() % 2)
323 mixer_inputs_[mixer_inputs_.size() - 1]->Stop(); 325 mixer_inputs_[mixer_inputs_.size() - 1]->Stop();
324 326
325 ASSERT_TRUE(RenderAndValidateAudioData( 327 ASSERT_TRUE(RenderAndValidateAudioData(
326 std::max(1.f, static_cast<float>(floor(mixer_inputs_.size() / 2.f))))); 328 std::max(1.f, static_cast<float>(floor(mixer_inputs_.size() / 2.f)))));
327 329
328 for (size_t i = 1; i < mixer_inputs_.size(); i += 2) 330 for (size_t i = 1; i < mixer_inputs_.size(); i += 2)
329 mixer_inputs_[i]->Stop(); 331 mixer_inputs_[i]->Stop();
330 } 332 }
331 333
334 scoped_refptr<AudioRendererMixerInput> CreateMixerInput() {
335 return new AudioRendererMixerInput(
336 base::Bind(&AudioRendererMixerTest::GetMixer, base::Unretained(this)),
337 base::Bind(&AudioRendererMixerTest::RemoveMixer,
338 base::Unretained(this)),
339 base::Bind(&AudioRendererMixerTest::GetOutputDeviceInfo,
340 base::Unretained(this)),
341 // Default device ID and security origin.
342 std::string(), url::Origin());
343 }
344
332 protected: 345 protected:
333 virtual ~AudioRendererMixerTest() {} 346 virtual ~AudioRendererMixerTest() {}
334 347
335 scoped_refptr<MockAudioRendererSink> sink_; 348 scoped_refptr<MockAudioRendererSink> sink_;
336 std::unique_ptr<AudioRendererMixer> mixer_; 349 std::unique_ptr<AudioRendererMixer> mixer_;
337 AudioRendererSink::RenderCallback* mixer_callback_; 350 AudioRendererSink::RenderCallback* mixer_callback_;
338 std::vector<AudioParameters> input_parameters_; 351 std::vector<AudioParameters> input_parameters_;
339 AudioParameters output_parameters_; 352 AudioParameters output_parameters_;
340 std::unique_ptr<AudioBus> audio_bus_; 353 std::unique_ptr<AudioBus> audio_bus_;
341 std::unique_ptr<AudioBus> expected_audio_bus_; 354 std::unique_ptr<AudioBus> expected_audio_bus_;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 472
460 for (size_t i = 0; i < mixer_inputs_.size(); ++i) 473 for (size_t i = 0; i < mixer_inputs_.size(); ++i)
461 mixer_inputs_[i]->Stop(); 474 mixer_inputs_[i]->Stop();
462 } 475 }
463 476
464 // Ensure constructing an AudioRendererMixerInput, but not initializing it does 477 // Ensure constructing an AudioRendererMixerInput, but not initializing it does
465 // not call RemoveMixer(). 478 // not call RemoveMixer().
466 TEST_P(AudioRendererMixerBehavioralTest, NoInitialize) { 479 TEST_P(AudioRendererMixerBehavioralTest, NoInitialize) {
467 EXPECT_CALL(*this, RemoveMixer(testing::_, testing::_, testing::_)).Times(0); 480 EXPECT_CALL(*this, RemoveMixer(testing::_, testing::_, testing::_)).Times(0);
468 scoped_refptr<AudioRendererMixerInput> audio_renderer_mixer_input = 481 scoped_refptr<AudioRendererMixerInput> audio_renderer_mixer_input =
469 new AudioRendererMixerInput( 482 CreateMixerInput();
470 base::Bind(&AudioRendererMixerTest::GetMixer, base::Unretained(this)),
471 base::Bind(&AudioRendererMixerTest::RemoveMixer,
472 base::Unretained(this)),
473 // Default device ID and security origin.
474 std::string(), url::Origin());
475 } 483 }
476 484
477 // Ensure the physical stream is paused after a certain amount of time with no 485 // Ensure the physical stream is paused after a certain amount of time with no
478 // inputs playing. The test will hang if the behavior is incorrect. 486 // inputs playing. The test will hang if the behavior is incorrect.
479 TEST_P(AudioRendererMixerBehavioralTest, MixerPausesStream) { 487 TEST_P(AudioRendererMixerBehavioralTest, MixerPausesStream) {
480 const base::TimeDelta kPauseTime = base::TimeDelta::FromMilliseconds(500); 488 const base::TimeDelta kPauseTime = base::TimeDelta::FromMilliseconds(500);
481 // This value can't be too low or valgrind, tsan will timeout on the bots. 489 // This value can't be too low or valgrind, tsan will timeout on the bots.
482 const base::TimeDelta kTestTimeout = 10 * kPauseTime; 490 const base::TimeDelta kTestTimeout = 10 * kPauseTime;
483 mixer_->set_pause_delay_for_testing(kPauseTime); 491 mixer_->set_pause_delay_for_testing(kPauseTime);
484 492
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 INSTANTIATE_TEST_CASE_P( 559 INSTANTIATE_TEST_CASE_P(
552 AudioRendererMixerBehavioralTest, 560 AudioRendererMixerBehavioralTest,
553 AudioRendererMixerBehavioralTest, 561 AudioRendererMixerBehavioralTest,
554 testing::ValuesIn(std::vector<AudioRendererMixerTestData>( 562 testing::ValuesIn(std::vector<AudioRendererMixerTestData>(
555 1, 563 1,
556 std::tr1::make_tuple(&kTestInputLower, 564 std::tr1::make_tuple(&kTestInputLower,
557 1, 565 1,
558 kTestInputLower, 566 kTestInputLower,
559 0.00000048)))); 567 0.00000048))));
560 } // namespace media 568 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698