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

Side by Side Diff: content/renderer/media/audio_renderer_mixer_manager_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 #include "content/renderer/media/audio_renderer_mixer_manager.h" 5 #include "content/renderer/media/audio_renderer_mixer_manager.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h"
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/macros.h" 11 #include "base/macros.h"
11 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
12 #include "content/renderer/media/audio_device_factory.h" 13 #include "content/renderer/media/audio_renderer_sink_cache.h"
13 #include "media/audio/audio_device_description.h" 14 #include "media/audio/audio_device_description.h"
14 #include "media/base/audio_capturer_source.h"
15 #include "media/base/audio_parameters.h" 15 #include "media/base/audio_parameters.h"
16 #include "media/base/audio_renderer_mixer.h" 16 #include "media/base/audio_renderer_mixer.h"
17 #include "media/base/audio_renderer_mixer_input.h" 17 #include "media/base/audio_renderer_mixer_input.h"
18 #include "media/base/fake_audio_render_callback.h" 18 #include "media/base/fake_audio_render_callback.h"
19 #include "media/base/mock_audio_renderer_sink.h" 19 #include "media/base/mock_audio_renderer_sink.h"
20 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "url/gurl.h" 22 #include "url/gurl.h"
23 23
24 namespace content { 24 namespace content {
25 25
26 static const int kBitsPerChannel = 16; 26 static const int kBitsPerChannel = 16;
27 static const int kSampleRate = 48000; 27 static const int kSampleRate = 48000;
28 static const int kBufferSize = 8192; 28 static const int kBufferSize = 8192;
29 static const media::ChannelLayout kChannelLayout = media::CHANNEL_LAYOUT_STEREO; 29 static const media::ChannelLayout kChannelLayout = media::CHANNEL_LAYOUT_STEREO;
30 static const media::ChannelLayout kAnotherChannelLayout = 30 static const media::ChannelLayout kAnotherChannelLayout =
31 media::CHANNEL_LAYOUT_2_1; 31 media::CHANNEL_LAYOUT_2_1;
32 static const char* const kDefaultDeviceId = 32 static const char* const kDefaultDeviceId =
33 media::AudioDeviceDescription::kDefaultDeviceId; 33 media::AudioDeviceDescription::kDefaultDeviceId;
34 static const char kAnotherDeviceId[] = "another-device-id"; 34 static const char kAnotherDeviceId[] = "another-device-id";
35 static const char kMatchedDeviceId[] = "matched-device-id"; 35 static const char kMatchedDeviceId[] = "matched-device-id";
36 static const char kNonexistentDeviceId[] = "nonexistent-device-id"; 36 static const char kNonexistentDeviceId[] = "nonexistent-device-id";
37 37
38 static const int kRenderFrameId = 124; 38 static const int kRenderFrameId = 124;
39 static const int kAnotherRenderFrameId = 678; 39 static const int kAnotherRenderFrameId = 678;
40 40
41 using media::AudioParameters; 41 using media::AudioParameters;
42 42
43 class AudioRendererMixerManagerTest : public testing::Test, 43 class FakeAudioRendererSinkCache : public AudioRendererSinkCache {
44 public AudioDeviceFactory { 44 public:
45 typedef base::Callback<media::AudioRendererSink*(
miu 2016/05/12 21:53:06 nit: Consider using the more-readable C++11 "using
o1ka 2016/05/17 17:17:23 Done.
46 int render_frame_id,
47 int session_id,
48 const std::string& device_id,
49 const url::Origin& security_origin)>
50 GetSinkCallback;
51
52 typedef base::Callback<void(media::AudioRendererSink*)> ReleaseSinkCallback;
53
54 FakeAudioRendererSinkCache(const GetSinkCallback& get_sink_cb,
55 const ReleaseSinkCallback& release_sink_cb)
56 : get_sink_cb_(get_sink_cb), release_sink_cb_(release_sink_cb) {}
57
58 media::OutputDeviceInfo GetSinkInfo(
59 int source_render_frame_id,
60 int session_id,
61 const std::string& device_id,
62 const url::Origin& security_origin) final {
63 return get_sink_cb_
64 .Run(source_render_frame_id, session_id, device_id, security_origin)
65 ->GetOutputDeviceInfo();
66 }
67
68 media::AudioRendererSink* GetSink(int source_render_frame_id,
69 const std::string& device_id,
70 const url::Origin& security_origin) final {
71 return get_sink_cb_.Run(source_render_frame_id, 0, device_id,
72 security_origin);
73 }
74
75 void ReleaseSink(media::AudioRendererSink* sink) final {
76 release_sink_cb_.Run(sink);
77 }
78
79 private:
80 GetSinkCallback get_sink_cb_;
81 ReleaseSinkCallback release_sink_cb_;
82 };
83
84 class AudioRendererMixerManagerTest : public testing::Test {
45 public: 85 public:
46 AudioRendererMixerManagerTest() 86 AudioRendererMixerManagerTest()
47 : manager_(new AudioRendererMixerManager()), 87 : manager_(new AudioRendererMixerManager(
88 std::unique_ptr<AudioRendererSinkCache>(
89 new FakeAudioRendererSinkCache(
90 base::Bind(&AudioRendererMixerManagerTest::GetSinkPtr,
91 base::Unretained(this)),
92 base::Bind(&AudioRendererMixerManagerTest::ReleaseSinkPtr,
93 base::Unretained(this)))))),
48 mock_sink_(new media::MockAudioRendererSink()), 94 mock_sink_(new media::MockAudioRendererSink()),
49 mock_sink_no_device_(new media::MockAudioRendererSink( 95 mock_sink_no_device_(new media::MockAudioRendererSink(
50 kNonexistentDeviceId, 96 kNonexistentDeviceId,
51 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND)), 97 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND)),
52 mock_sink_matched_device_( 98 mock_sink_matched_device_(
53 new media::MockAudioRendererSink(kMatchedDeviceId, 99 new media::MockAudioRendererSink(kMatchedDeviceId,
54 media::OUTPUT_DEVICE_STATUS_OK)), 100 media::OUTPUT_DEVICE_STATUS_OK)),
55 mock_sink_for_session_id_(
56 new media::MockAudioRendererSink(kMatchedDeviceId,
57 media::OUTPUT_DEVICE_STATUS_OK)),
58 kSecurityOrigin2(GURL("http://localhost")) {} 101 kSecurityOrigin2(GURL("http://localhost")) {}
59 102
60 media::AudioRendererMixer* GetMixer( 103 media::AudioRendererMixer* GetMixer(
61 int source_render_frame_id, 104 int source_render_frame_id,
62 const media::AudioParameters& params, 105 const media::AudioParameters& params,
63 const std::string& device_id, 106 const std::string& device_id,
64 const url::Origin& security_origin, 107 const url::Origin& security_origin,
65 media::OutputDeviceStatus* device_status) { 108 media::OutputDeviceStatus* device_status) {
66 return manager_->GetMixer(source_render_frame_id, params, device_id, 109 return manager_->GetMixer(source_render_frame_id, params, device_id,
67 security_origin, device_status); 110 security_origin, device_status);
68 } 111 }
69 112
70 void RemoveMixer(int source_render_frame_id, 113 void RemoveMixer(int source_render_frame_id,
71 const media::AudioParameters& params, 114 const media::AudioParameters& params,
72 const std::string& device_id, 115 const std::string& device_id,
73 const url::Origin& security_origin) { 116 const url::Origin& security_origin) {
74 return manager_->RemoveMixer(source_render_frame_id, params, device_id, 117 return manager_->RemoveMixer(source_render_frame_id, params, device_id,
75 security_origin); 118 security_origin);
76 } 119 }
77 120
78 // Number of instantiated mixers. 121 // Number of instantiated mixers.
79 int mixer_count() { 122 int mixer_count() {
80 return manager_->mixers_.size(); 123 return manager_->mixers_.size();
81 } 124 }
82 125
83 protected: 126 protected:
84 MOCK_METHOD1(CreateAudioCapturerSource, 127 media::AudioRendererSink* GetSinkPtr(int source_render_frame_id,
85 scoped_refptr<media::AudioCapturerSource>(int)); 128 int session_id,
86 MOCK_METHOD5( 129 const std::string& device_id,
87 CreateSwitchableAudioRendererSink, 130 const url::Origin& security_origin) {
88 scoped_refptr<media::SwitchableAudioRendererSink>(SourceType,
89 int,
90 int,
91 const std::string&,
92 const url::Origin&));
93 MOCK_METHOD5(CreateAudioRendererSink,
94 scoped_refptr<media::AudioRendererSink>(SourceType,
95 int,
96 int,
97 const std::string&,
98 const url::Origin&));
99
100 scoped_refptr<media::AudioRendererSink> CreateFinalAudioRendererSink(
101 int render_frame_id,
102 int session_id,
103 const std::string& device_id,
104 const url::Origin& security_origin) {
105 if ((device_id == kDefaultDeviceId) || (device_id == kAnotherDeviceId)) { 131 if ((device_id == kDefaultDeviceId) || (device_id == kAnotherDeviceId)) {
106 // We don't care about separate sinks for these devices. 132 // We don't care about separate sinks for these devices.
107 return mock_sink_; 133 return mock_sink_.get();
108 } 134 }
109 if (device_id == kNonexistentDeviceId) 135 if (device_id == kNonexistentDeviceId)
110 return mock_sink_no_device_; 136 return mock_sink_no_device_.get();
111 if (device_id.empty()) { 137 if (device_id.empty()) {
112 // The sink used to get device ID from session ID if it's not empty 138 // The sink used to get device ID from session ID if it's not empty
113 return session_id ? mock_sink_for_session_id_ : mock_sink_; 139 return session_id ? mock_sink_matched_device_.get() : mock_sink_.get();
114 } 140 }
115 if (device_id == kMatchedDeviceId) 141 if (device_id == kMatchedDeviceId)
116 return mock_sink_matched_device_; 142 return mock_sink_matched_device_.get();
117 143
118 NOTREACHED(); 144 NOTREACHED();
119 return nullptr; 145 return nullptr;
120 } 146 }
121 147
148 MOCK_METHOD1(ReleaseSinkPtr, void(media::AudioRendererSink*));
149
122 std::unique_ptr<AudioRendererMixerManager> manager_; 150 std::unique_ptr<AudioRendererMixerManager> manager_;
151
123 scoped_refptr<media::MockAudioRendererSink> mock_sink_; 152 scoped_refptr<media::MockAudioRendererSink> mock_sink_;
124 scoped_refptr<media::MockAudioRendererSink> mock_sink_no_device_; 153 scoped_refptr<media::MockAudioRendererSink> mock_sink_no_device_;
125 scoped_refptr<media::MockAudioRendererSink> mock_sink_matched_device_; 154 scoped_refptr<media::MockAudioRendererSink> mock_sink_matched_device_;
126 scoped_refptr<media::MockAudioRendererSink> mock_sink_for_session_id_;
127 155
128 // To avoid global/static non-POD constants. 156 // To avoid global/static non-POD constants.
129 const url::Origin kSecurityOrigin; 157 const url::Origin kSecurityOrigin;
130 const url::Origin kSecurityOrigin2; 158 const url::Origin kSecurityOrigin2;
131 159
132 private: 160 private:
133 DISALLOW_COPY_AND_ASSIGN(AudioRendererMixerManagerTest); 161 DISALLOW_COPY_AND_ASSIGN(AudioRendererMixerManagerTest);
134 }; 162 };
135 163
136 // Verify GetMixer() and RemoveMixer() both work as expected; particularly with 164 // Verify GetMixer() and RemoveMixer() both work as expected; particularly with
137 // respect to the explicit ref counting done. 165 // respect to the explicit ref counting done.
138 TEST_F(AudioRendererMixerManagerTest, GetRemoveMixer) { 166 TEST_F(AudioRendererMixerManagerTest, GetRemoveMixer) {
139 // Since we're testing two different sets of parameters, we expect 167 // Since we're testing two different sets of parameters, we expect
140 // AudioRendererMixerManager to call Start and Stop on our mock twice. 168 // AudioRendererMixerManager to call Start and Stop on our mock twice.
141 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2); 169 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2);
142 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2); 170 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2);
143 171
172 // We expect 2 mixers to be created; each of them should release the sink.
173 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(2);
174
144 // There should be no mixers outstanding to start with. 175 // There should be no mixers outstanding to start with.
145 EXPECT_EQ(0, mixer_count()); 176 EXPECT_EQ(0, mixer_count());
146 177
147 media::AudioParameters params1( 178 media::AudioParameters params1(
148 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 179 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate,
149 kBitsPerChannel, kBufferSize); 180 kBitsPerChannel, kBufferSize);
150 181
151 media::AudioRendererMixer* mixer1 = GetMixer( 182 media::AudioRendererMixer* mixer1 = GetMixer(
152 kRenderFrameId, params1, kDefaultDeviceId, kSecurityOrigin, nullptr); 183 kRenderFrameId, params1, kDefaultDeviceId, kSecurityOrigin, nullptr);
153 ASSERT_TRUE(mixer1); 184 ASSERT_TRUE(mixer1);
(...skipping 26 matching lines...) Expand all
180 EXPECT_EQ(0, mixer_count()); 211 EXPECT_EQ(0, mixer_count());
181 } 212 }
182 213
183 // Verify GetMixer() correctly deduplicates mixer with irrelevant AudioParameter 214 // Verify GetMixer() correctly deduplicates mixer with irrelevant AudioParameter
184 // differences. 215 // differences.
185 TEST_F(AudioRendererMixerManagerTest, MixerReuse) { 216 TEST_F(AudioRendererMixerManagerTest, MixerReuse) {
186 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2); 217 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2);
187 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2); 218 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2);
188 EXPECT_EQ(mixer_count(), 0); 219 EXPECT_EQ(mixer_count(), 0);
189 220
221 // We expect 2 mixers to be created; each of them should release the sink.
222 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(2);
223
190 media::AudioParameters params1(AudioParameters::AUDIO_PCM_LINEAR, 224 media::AudioParameters params1(AudioParameters::AUDIO_PCM_LINEAR,
191 kChannelLayout, 225 kChannelLayout,
192 kSampleRate, 226 kSampleRate,
193 kBitsPerChannel, 227 kBitsPerChannel,
194 kBufferSize); 228 kBufferSize);
195 media::AudioRendererMixer* mixer1 = GetMixer( 229 media::AudioRendererMixer* mixer1 = GetMixer(
196 kRenderFrameId, params1, kDefaultDeviceId, kSecurityOrigin, nullptr); 230 kRenderFrameId, params1, kDefaultDeviceId, kSecurityOrigin, nullptr);
197 ASSERT_TRUE(mixer1); 231 ASSERT_TRUE(mixer1);
198 EXPECT_EQ(1, mixer_count()); 232 EXPECT_EQ(1, mixer_count());
199 233
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 // Verify CreateInput() provides AudioRendererMixerInput with the appropriate 266 // Verify CreateInput() provides AudioRendererMixerInput with the appropriate
233 // callbacks and they are working as expected. Also, verify that separate 267 // callbacks and they are working as expected. Also, verify that separate
234 // mixers are created for separate render views, even though the AudioParameters 268 // mixers are created for separate render views, even though the AudioParameters
235 // are the same. 269 // are the same.
236 TEST_F(AudioRendererMixerManagerTest, CreateInput) { 270 TEST_F(AudioRendererMixerManagerTest, CreateInput) {
237 // Expect AudioRendererMixerManager to call Start and Stop on our mock twice 271 // Expect AudioRendererMixerManager to call Start and Stop on our mock twice
238 // each. Note: Under normal conditions, each mixer would get its own sink! 272 // each. Note: Under normal conditions, each mixer would get its own sink!
239 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2); 273 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2);
240 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2); 274 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2);
241 275
276 // We expect 2 mixers to be created; each of them should release the sink.
277 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(2);
278
242 media::AudioParameters params( 279 media::AudioParameters params(
243 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 280 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate,
244 kBitsPerChannel, kBufferSize); 281 kBitsPerChannel, kBufferSize);
245 282
246 // Create two mixer inputs and ensure this doesn't instantiate any mixers yet. 283 // Create two mixer inputs and ensure this doesn't instantiate any mixers yet.
247 EXPECT_EQ(0, mixer_count()); 284 EXPECT_EQ(0, mixer_count());
248 media::FakeAudioRenderCallback callback(0); 285 media::FakeAudioRenderCallback callback(0);
249 scoped_refptr<media::AudioRendererMixerInput> input(manager_->CreateInput( 286 scoped_refptr<media::AudioRendererMixerInput> input(manager_->CreateInput(
250 kRenderFrameId, 0, kDefaultDeviceId, kSecurityOrigin)); 287 kRenderFrameId, 0, kDefaultDeviceId, kSecurityOrigin));
251 input->Initialize(params, &callback); 288 input->Initialize(params, &callback);
(...skipping 28 matching lines...) Expand all
280 // each: for kDefaultDeviceId and for kAnotherDeviceId. Note: Under normal 317 // each: for kDefaultDeviceId and for kAnotherDeviceId. Note: Under normal
281 // conditions, each mixer would get its own sink! 318 // conditions, each mixer would get its own sink!
282 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2); 319 EXPECT_CALL(*mock_sink_.get(), Start()).Times(2);
283 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2); 320 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(2);
284 321
285 // Expect AudioRendererMixerManager to call Start and Stop on the matched sink 322 // Expect AudioRendererMixerManager to call Start and Stop on the matched sink
286 // once. 323 // once.
287 EXPECT_CALL(*mock_sink_matched_device_.get(), Start()).Times(1); 324 EXPECT_CALL(*mock_sink_matched_device_.get(), Start()).Times(1);
288 EXPECT_CALL(*mock_sink_matched_device_.get(), Stop()).Times(1); 325 EXPECT_CALL(*mock_sink_matched_device_.get(), Stop()).Times(1);
289 326
327 // We expect 3 mixers to be created; each of them should release a sink.
328 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(2);
329 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_matched_device_.get())).Times(1);
330
290 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, 331 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR,
291 kChannelLayout, kSampleRate, kBitsPerChannel, 332 kChannelLayout, kSampleRate, kBitsPerChannel,
292 kBufferSize); 333 kBufferSize);
293 media::FakeAudioRenderCallback callback(0); 334 media::FakeAudioRenderCallback callback(0);
294 EXPECT_EQ(0, mixer_count()); 335 EXPECT_EQ(0, mixer_count());
295 336
296 // Empty device id, zero session id; 337 // Empty device id, zero session id;
297 scoped_refptr<media::AudioRendererMixerInput> input_to_default_device( 338 scoped_refptr<media::AudioRendererMixerInput> input_to_default_device(
298 manager_->CreateInput(kRenderFrameId, 0, // session_id 339 manager_->CreateInput(kRenderFrameId, 0, // session_id
299 std::string(), kSecurityOrigin)); 340 std::string(), kSecurityOrigin));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 EXPECT_EQ(0, mixer_count()); 393 EXPECT_EQ(0, mixer_count());
353 } 394 }
354 395
355 // Verify GetMixer() correctly creates different mixers with the same 396 // Verify GetMixer() correctly creates different mixers with the same
356 // parameters, but different device ID and/or security origin 397 // parameters, but different device ID and/or security origin
357 TEST_F(AudioRendererMixerManagerTest, MixerDevices) { 398 TEST_F(AudioRendererMixerManagerTest, MixerDevices) {
358 EXPECT_CALL(*mock_sink_.get(), Start()).Times(3); 399 EXPECT_CALL(*mock_sink_.get(), Start()).Times(3);
359 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(3); 400 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(3);
360 EXPECT_EQ(0, mixer_count()); 401 EXPECT_EQ(0, mixer_count());
361 402
403 // We expect 3 mixers to be created; each of them should release a sink.
404 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(3);
405
362 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, 406 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR,
363 kChannelLayout, kSampleRate, kBitsPerChannel, 407 kChannelLayout, kSampleRate, kBitsPerChannel,
364 kBufferSize); 408 kBufferSize);
365 media::AudioRendererMixer* mixer1 = GetMixer( 409 media::AudioRendererMixer* mixer1 = GetMixer(
366 kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin, nullptr); 410 kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin, nullptr);
367 ASSERT_TRUE(mixer1); 411 ASSERT_TRUE(mixer1);
368 EXPECT_EQ(1, mixer_count()); 412 EXPECT_EQ(1, mixer_count());
369 413
370 media::AudioRendererMixer* mixer2 = GetMixer( 414 media::AudioRendererMixer* mixer2 = GetMixer(
371 kRenderFrameId, params, kAnotherDeviceId, kSecurityOrigin, nullptr); 415 kRenderFrameId, params, kAnotherDeviceId, kSecurityOrigin, nullptr);
(...skipping 16 matching lines...) Expand all
388 EXPECT_EQ(0, mixer_count()); 432 EXPECT_EQ(0, mixer_count());
389 } 433 }
390 434
391 // Verify GetMixer() correctly deduplicate mixers with the same 435 // Verify GetMixer() correctly deduplicate mixers with the same
392 // parameters, different security origins but default device ID 436 // parameters, different security origins but default device ID
393 TEST_F(AudioRendererMixerManagerTest, OneMixerDifferentOriginsDefaultDevice) { 437 TEST_F(AudioRendererMixerManagerTest, OneMixerDifferentOriginsDefaultDevice) {
394 EXPECT_CALL(*mock_sink_.get(), Start()).Times(1); 438 EXPECT_CALL(*mock_sink_.get(), Start()).Times(1);
395 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(1); 439 EXPECT_CALL(*mock_sink_.get(), Stop()).Times(1);
396 EXPECT_EQ(0, mixer_count()); 440 EXPECT_EQ(0, mixer_count());
397 441
442 // We expect 1 mixers to be created; it should release its sink.
443 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_.get())).Times(1);
444
398 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, 445 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR,
399 kChannelLayout, kSampleRate, kBitsPerChannel, 446 kChannelLayout, kSampleRate, kBitsPerChannel,
400 kBufferSize); 447 kBufferSize);
401 media::AudioRendererMixer* mixer1 = GetMixer( 448 media::AudioRendererMixer* mixer1 = GetMixer(
402 kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin, nullptr); 449 kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin, nullptr);
403 ASSERT_TRUE(mixer1); 450 ASSERT_TRUE(mixer1);
404 EXPECT_EQ(1, mixer_count()); 451 EXPECT_EQ(1, mixer_count());
405 452
406 media::AudioRendererMixer* mixer2 = 453 media::AudioRendererMixer* mixer2 =
407 GetMixer(kRenderFrameId, params, std::string(), kSecurityOrigin, nullptr); 454 GetMixer(kRenderFrameId, params, std::string(), kSecurityOrigin, nullptr);
(...skipping 20 matching lines...) Expand all
428 RemoveMixer(kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin2); 475 RemoveMixer(kRenderFrameId, params, kDefaultDeviceId, kSecurityOrigin2);
429 EXPECT_EQ(1, mixer_count()); 476 EXPECT_EQ(1, mixer_count());
430 RemoveMixer(kRenderFrameId, params, std::string(), kSecurityOrigin2); 477 RemoveMixer(kRenderFrameId, params, std::string(), kSecurityOrigin2);
431 EXPECT_EQ(0, mixer_count()); 478 EXPECT_EQ(0, mixer_count());
432 } 479 }
433 480
434 // Verify that GetMixer() correctly returns a null mixer and an appropriate 481 // Verify that GetMixer() correctly returns a null mixer and an appropriate
435 // status code when a nonexistent device is requested. 482 // status code when a nonexistent device is requested.
436 TEST_F(AudioRendererMixerManagerTest, NonexistentDevice) { 483 TEST_F(AudioRendererMixerManagerTest, NonexistentDevice) {
437 EXPECT_EQ(0, mixer_count()); 484 EXPECT_EQ(0, mixer_count());
485
486 // Mixer manager should release a not-ok sink when failing to create a mixer.
487 EXPECT_CALL(*this, ReleaseSinkPtr(mock_sink_no_device_.get())).Times(1);
488
438 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, 489 media::AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR,
439 kChannelLayout, kSampleRate, kBitsPerChannel, 490 kChannelLayout, kSampleRate, kBitsPerChannel,
440 kBufferSize); 491 kBufferSize);
441 media::OutputDeviceStatus device_status = media::OUTPUT_DEVICE_STATUS_OK; 492 media::OutputDeviceStatus device_status = media::OUTPUT_DEVICE_STATUS_OK;
442 EXPECT_CALL(*mock_sink_no_device_.get(), Stop()); 493
443 media::AudioRendererMixer* mixer = 494 media::AudioRendererMixer* mixer =
444 GetMixer(kRenderFrameId, params, kNonexistentDeviceId, kSecurityOrigin, 495 GetMixer(kRenderFrameId, params, kNonexistentDeviceId, kSecurityOrigin,
445 &device_status); 496 &device_status);
497
446 EXPECT_FALSE(mixer); 498 EXPECT_FALSE(mixer);
447 EXPECT_EQ(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, device_status); 499 EXPECT_EQ(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, device_status);
448 EXPECT_EQ(0, mixer_count()); 500 EXPECT_EQ(0, mixer_count());
449 } 501 }
450 502
451 } // namespace content 503 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698