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 "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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |