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

Side by Side Diff: content/renderer/media/webrtc_local_audio_track_unittest.cc

Issue 190643003: Fix/Add content_unittests to work for the code behind --enable-audio-track-processing (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: removed an empty line. Created 6 years, 9 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 | « content/renderer/media/webrtc_audio_capturer_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "base/synchronization/waitable_event.h" 5 #include "base/synchronization/waitable_event.h"
6 #include "base/test/test_timeouts.h" 6 #include "base/test/test_timeouts.h"
7 #include "content/renderer/media/mock_media_constraint_factory.h"
7 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" 8 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
8 #include "content/renderer/media/webrtc_audio_capturer.h" 9 #include "content/renderer/media/webrtc_audio_capturer.h"
9 #include "content/renderer/media/webrtc_audio_device_impl.h" 10 #include "content/renderer/media/webrtc_audio_device_impl.h"
10 #include "content/renderer/media/webrtc_local_audio_source_provider.h" 11 #include "content/renderer/media/webrtc_local_audio_source_provider.h"
11 #include "content/renderer/media/webrtc_local_audio_track.h" 12 #include "content/renderer/media/webrtc_local_audio_track.h"
12 #include "media/audio/audio_parameters.h" 13 #include "media/audio/audio_parameters.h"
13 #include "media/base/audio_bus.h" 14 #include "media/base/audio_bus.h"
14 #include "media/base/audio_capturer_source.h" 15 #include "media/base/audio_capturer_source.h"
15 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 ~MockMediaStreamAudioSink() {} 128 ~MockMediaStreamAudioSink() {}
128 int OnData(const int16* audio_data, 129 int OnData(const int16* audio_data,
129 int sample_rate, 130 int sample_rate,
130 int number_of_channels, 131 int number_of_channels,
131 int number_of_frames, 132 int number_of_frames,
132 const std::vector<int>& channels, 133 const std::vector<int>& channels,
133 int audio_delay_milliseconds, 134 int audio_delay_milliseconds,
134 int current_volume, 135 int current_volume,
135 bool need_audio_processing, 136 bool need_audio_processing,
136 bool key_pressed) OVERRIDE { 137 bool key_pressed) OVERRIDE {
138 EXPECT_EQ(params_.sample_rate(), sample_rate);
139 EXPECT_EQ(params_.channels(), number_of_channels);
140 EXPECT_EQ(params_.frames_per_buffer(), number_of_frames);
137 CaptureData(channels.size(), 141 CaptureData(channels.size(),
138 sample_rate,
139 number_of_channels,
140 number_of_frames,
141 audio_delay_milliseconds, 142 audio_delay_milliseconds,
142 current_volume, 143 current_volume,
143 need_audio_processing, 144 need_audio_processing,
144 key_pressed); 145 key_pressed);
145 return 0; 146 return 0;
146 } 147 }
147 MOCK_METHOD8(CaptureData, 148 MOCK_METHOD5(CaptureData,
148 void(int number_of_network_channels, 149 void(int number_of_network_channels,
149 int sample_rate,
150 int number_of_channels,
151 int number_of_frames,
152 int audio_delay_milliseconds, 150 int audio_delay_milliseconds,
153 int current_volume, 151 int current_volume,
154 bool need_audio_processing, 152 bool need_audio_processing,
155 bool key_pressed)); 153 bool key_pressed));
156 MOCK_METHOD1(OnSetFormat, void(const media::AudioParameters& params)); 154 void OnSetFormat(const media::AudioParameters& params) {
155 params_ = params;
156 FormatIsSet();
157 }
158 MOCK_METHOD0(FormatIsSet, void());
159
160 const media::AudioParameters& audio_params() const { return params_; }
161
162 private:
163 media::AudioParameters params_;
157 }; 164 };
158 165
159 } // namespace 166 } // namespace
160 167
161 class WebRtcLocalAudioTrackTest : public ::testing::Test { 168 class WebRtcLocalAudioTrackTest : public ::testing::Test {
162 protected: 169 protected:
163 virtual void SetUp() OVERRIDE { 170 virtual void SetUp() OVERRIDE {
164 params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, 171 params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
165 media::CHANNEL_LAYOUT_STEREO, 2, 0, 48000, 16, 480); 172 media::CHANNEL_LAYOUT_STEREO, 2, 0, 48000, 16, 480);
166 blink::WebMediaConstraints constraints; 173 blink::WebMediaConstraints constraints;
(...skipping 28 matching lines...) Expand all
195 track->Start(); 202 track->Start();
196 EXPECT_TRUE(track->GetAudioAdapter()->enabled()); 203 EXPECT_TRUE(track->GetAudioAdapter()->enabled());
197 204
198 // Connect a number of network channels to the audio track. 205 // Connect a number of network channels to the audio track.
199 static const int kNumberOfNetworkChannels = 4; 206 static const int kNumberOfNetworkChannels = 4;
200 for (int i = 0; i < kNumberOfNetworkChannels; ++i) { 207 for (int i = 0; i < kNumberOfNetworkChannels; ++i) {
201 static_cast<webrtc::AudioTrackInterface*>( 208 static_cast<webrtc::AudioTrackInterface*>(
202 adapter.get())->GetRenderer()->AddChannel(i); 209 adapter.get())->GetRenderer()->AddChannel(i);
203 } 210 }
204 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); 211 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink());
205 const media::AudioParameters params = capturer_->source_audio_parameters();
206 base::WaitableEvent event(false, false); 212 base::WaitableEvent event(false, false);
207 EXPECT_CALL(*sink, OnSetFormat(_)).WillOnce(Return()); 213 EXPECT_CALL(*sink, FormatIsSet());
208 EXPECT_CALL(*sink, 214 EXPECT_CALL(*sink,
209 CaptureData(kNumberOfNetworkChannels, 215 CaptureData(kNumberOfNetworkChannels,
210 params.sample_rate(),
211 params.channels(),
212 params.sample_rate() / 100,
213 0, 216 0,
214 0, 217 0,
215 true, 218 _,
216 false)).Times(AtLeast(1)) 219 false)).Times(AtLeast(1))
217 .WillRepeatedly(SignalEvent(&event)); 220 .WillRepeatedly(SignalEvent(&event));
218 track->AddSink(sink.get()); 221 track->AddSink(sink.get());
219
220 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 222 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
221 track->RemoveSink(sink.get()); 223 track->RemoveSink(sink.get());
222 224
223 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return()); 225 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return());
224 capturer_->Stop(); 226 capturer_->Stop();
225 } 227 }
226 228
227 // The same setup as ConnectAndDisconnectOneSink, but enable and disable the 229 // The same setup as ConnectAndDisconnectOneSink, but enable and disable the
228 // audio track on the fly. When the audio track is disabled, there is no data 230 // audio track on the fly. When the audio track is disabled, there is no data
229 // callback to the sink; when the audio track is enabled, there comes data 231 // callback to the sink; when the audio track is enabled, there comes data
(...skipping 10 matching lines...) Expand all
240 static_cast<WebRtcLocalAudioSourceProvider*>( 242 static_cast<WebRtcLocalAudioSourceProvider*>(
241 track->audio_source_provider())->SetSinkParamsForTesting(params_); 243 track->audio_source_provider())->SetSinkParamsForTesting(params_);
242 track->Start(); 244 track->Start();
243 static_cast<webrtc::AudioTrackInterface*>( 245 static_cast<webrtc::AudioTrackInterface*>(
244 adapter.get())->GetRenderer()->AddChannel(0); 246 adapter.get())->GetRenderer()->AddChannel(0);
245 EXPECT_TRUE(track->GetAudioAdapter()->enabled()); 247 EXPECT_TRUE(track->GetAudioAdapter()->enabled());
246 EXPECT_TRUE(track->GetAudioAdapter()->set_enabled(false)); 248 EXPECT_TRUE(track->GetAudioAdapter()->set_enabled(false));
247 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); 249 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink());
248 const media::AudioParameters params = capturer_->source_audio_parameters(); 250 const media::AudioParameters params = capturer_->source_audio_parameters();
249 base::WaitableEvent event(false, false); 251 base::WaitableEvent event(false, false);
250 EXPECT_CALL(*sink, OnSetFormat(_)).Times(1); 252 EXPECT_CALL(*sink, FormatIsSet()).Times(1);
251 EXPECT_CALL(*sink, 253 EXPECT_CALL(*sink,
252 CaptureData(1, 254 CaptureData(1, 0, 0, _, false)).Times(0);
253 params.sample_rate(), 255 EXPECT_EQ(sink->audio_params().frames_per_buffer(),
254 params.channels(), 256 params.sample_rate() / 100);
255 params.sample_rate() / 100,
256 0,
257 0,
258 true,
259 false)).Times(0);
260 track->AddSink(sink.get()); 257 track->AddSink(sink.get());
261 EXPECT_FALSE(event.TimedWait(TestTimeouts::tiny_timeout())); 258 EXPECT_FALSE(event.TimedWait(TestTimeouts::tiny_timeout()));
262 259
263 event.Reset(); 260 event.Reset();
264 EXPECT_CALL(*sink, 261 EXPECT_CALL(*sink,
265 CaptureData(1, 262 CaptureData(1, 0, 0, _, false)).Times(AtLeast(1))
266 params.sample_rate(),
267 params.channels(),
268 params.sample_rate() / 100,
269 0,
270 0,
271 true,
272 false)).Times(AtLeast(1))
273 .WillRepeatedly(SignalEvent(&event)); 263 .WillRepeatedly(SignalEvent(&event));
274 EXPECT_TRUE(track->GetAudioAdapter()->set_enabled(true)); 264 EXPECT_TRUE(track->GetAudioAdapter()->set_enabled(true));
275 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 265 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
276 track->RemoveSink(sink.get()); 266 track->RemoveSink(sink.get());
277 267
278 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return()); 268 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return());
279 capturer_->Stop(); 269 capturer_->Stop();
280 track.reset(); 270 track.reset();
281 } 271 }
282 272
283 // Create multiple audio tracks and enable/disable them, verify that the audio 273 // Create multiple audio tracks and enable/disable them, verify that the audio
284 // callbacks appear/disappear. 274 // callbacks appear/disappear.
285 // Flaky due to a data race, see http://crbug.com/295418 275 // Flaky due to a data race, see http://crbug.com/295418
286 TEST_F(WebRtcLocalAudioTrackTest, DISABLED_MultipleAudioTracks) { 276 TEST_F(WebRtcLocalAudioTrackTest, DISABLED_MultipleAudioTracks) {
287 EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true)); 277 EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true));
288 EXPECT_CALL(*capturer_source_.get(), OnStart()); 278 EXPECT_CALL(*capturer_source_.get(), OnStart());
289 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1( 279 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1(
290 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); 280 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
291 scoped_ptr<WebRtcLocalAudioTrack> track_1( 281 scoped_ptr<WebRtcLocalAudioTrack> track_1(
292 new WebRtcLocalAudioTrack(adapter_1, capturer_, NULL)); 282 new WebRtcLocalAudioTrack(adapter_1, capturer_, NULL));
293 static_cast<WebRtcLocalAudioSourceProvider*>( 283 static_cast<WebRtcLocalAudioSourceProvider*>(
294 track_1->audio_source_provider())->SetSinkParamsForTesting(params_); 284 track_1->audio_source_provider())->SetSinkParamsForTesting(params_);
295 track_1->Start(); 285 track_1->Start();
296 static_cast<webrtc::AudioTrackInterface*>( 286 static_cast<webrtc::AudioTrackInterface*>(
297 adapter_1.get())->GetRenderer()->AddChannel(0); 287 adapter_1.get())->GetRenderer()->AddChannel(0);
298 EXPECT_TRUE(track_1->GetAudioAdapter()->enabled()); 288 EXPECT_TRUE(track_1->GetAudioAdapter()->enabled());
299 scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink()); 289 scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink());
300 const media::AudioParameters params = capturer_->source_audio_parameters(); 290 const media::AudioParameters params = capturer_->source_audio_parameters();
301 base::WaitableEvent event_1(false, false); 291 base::WaitableEvent event_1(false, false);
302 EXPECT_CALL(*sink_1, OnSetFormat(_)).WillOnce(Return()); 292 EXPECT_CALL(*sink_1, FormatIsSet()).WillOnce(Return());
303 EXPECT_CALL(*sink_1, 293 EXPECT_CALL(*sink_1,
304 CaptureData(1, 294 CaptureData(1, 0, 0, _, false)).Times(AtLeast(1))
305 params.sample_rate(),
306 params.channels(),
307 params.sample_rate() / 100,
308 0,
309 0,
310 true,
311 false)).Times(AtLeast(1))
312 .WillRepeatedly(SignalEvent(&event_1)); 295 .WillRepeatedly(SignalEvent(&event_1));
296 EXPECT_EQ(sink_1->audio_params().frames_per_buffer(),
297 params.sample_rate() / 100);
313 track_1->AddSink(sink_1.get()); 298 track_1->AddSink(sink_1.get());
314 EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout())); 299 EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
315 300
316 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2( 301 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2(
317 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); 302 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
318 scoped_ptr<WebRtcLocalAudioTrack> track_2( 303 scoped_ptr<WebRtcLocalAudioTrack> track_2(
319 new WebRtcLocalAudioTrack(adapter_2, capturer_, NULL)); 304 new WebRtcLocalAudioTrack(adapter_2, capturer_, NULL));
320 static_cast<WebRtcLocalAudioSourceProvider*>( 305 static_cast<WebRtcLocalAudioSourceProvider*>(
321 track_2->audio_source_provider())->SetSinkParamsForTesting(params_); 306 track_2->audio_source_provider())->SetSinkParamsForTesting(params_);
322 track_2->Start(); 307 track_2->Start();
323 static_cast<webrtc::AudioTrackInterface*>( 308 static_cast<webrtc::AudioTrackInterface*>(
324 adapter_2.get())->GetRenderer()->AddChannel(1); 309 adapter_2.get())->GetRenderer()->AddChannel(1);
325 EXPECT_TRUE(track_2->GetAudioAdapter()->enabled()); 310 EXPECT_TRUE(track_2->GetAudioAdapter()->enabled());
326 311
327 // Verify both |sink_1| and |sink_2| get data. 312 // Verify both |sink_1| and |sink_2| get data.
328 event_1.Reset(); 313 event_1.Reset();
329 base::WaitableEvent event_2(false, false); 314 base::WaitableEvent event_2(false, false);
330 315
331 scoped_ptr<MockMediaStreamAudioSink> sink_2(new MockMediaStreamAudioSink()); 316 scoped_ptr<MockMediaStreamAudioSink> sink_2(new MockMediaStreamAudioSink());
332 EXPECT_CALL(*sink_2, OnSetFormat(_)).WillOnce(Return()); 317 EXPECT_CALL(*sink_2, FormatIsSet()).WillOnce(Return());
333 EXPECT_CALL(*sink_1, 318 EXPECT_CALL(*sink_1, CaptureData(1, 0, 0, _, false)).Times(AtLeast(1))
334 CaptureData(1,
335 params.sample_rate(),
336 params.channels(),
337 params.sample_rate() / 100,
338 0,
339 0,
340 true,
341 false)).Times(AtLeast(1))
342 .WillRepeatedly(SignalEvent(&event_1)); 319 .WillRepeatedly(SignalEvent(&event_1));
343 EXPECT_CALL(*sink_2, 320 EXPECT_EQ(sink_1->audio_params().frames_per_buffer(),
344 CaptureData(1, 321 params.sample_rate() / 100);
345 params.sample_rate(), 322 EXPECT_CALL(*sink_2, CaptureData(1, 0, 0, _, false)).Times(AtLeast(1))
346 params.channels(),
347 params.sample_rate() / 100,
348 0,
349 0,
350 true,
351 false)).Times(AtLeast(1))
352 .WillRepeatedly(SignalEvent(&event_2)); 323 .WillRepeatedly(SignalEvent(&event_2));
324 EXPECT_EQ(sink_2->audio_params().frames_per_buffer(),
325 params.sample_rate() / 100);
353 track_2->AddSink(sink_2.get()); 326 track_2->AddSink(sink_2.get());
354 EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout())); 327 EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
355 EXPECT_TRUE(event_2.TimedWait(TestTimeouts::tiny_timeout())); 328 EXPECT_TRUE(event_2.TimedWait(TestTimeouts::tiny_timeout()));
356 329
357 track_1->RemoveSink(sink_1.get()); 330 track_1->RemoveSink(sink_1.get());
358 track_1->Stop(); 331 track_1->Stop();
359 track_1.reset(); 332 track_1.reset();
360 333
361 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return()); 334 EXPECT_CALL(*capturer_source_.get(), OnStop()).WillOnce(Return());
362 track_2->RemoveSink(sink_2.get()); 335 track_2->RemoveSink(sink_2.get());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 static_cast<webrtc::AudioTrackInterface*>( 374 static_cast<webrtc::AudioTrackInterface*>(
402 adapter_1.get())->GetRenderer()->AddChannel(0); 375 adapter_1.get())->GetRenderer()->AddChannel(0);
403 static_cast<WebRtcLocalAudioSourceProvider*>( 376 static_cast<WebRtcLocalAudioSourceProvider*>(
404 track_1->audio_source_provider())->SetSinkParamsForTesting(params_); 377 track_1->audio_source_provider())->SetSinkParamsForTesting(params_);
405 track_1->Start(); 378 track_1->Start();
406 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 379 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
407 380
408 // Verify the data flow by connecting the sink to |track_1|. 381 // Verify the data flow by connecting the sink to |track_1|.
409 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); 382 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink());
410 event.Reset(); 383 event.Reset();
411 EXPECT_CALL(*sink, OnSetFormat(_)).WillOnce(SignalEvent(&event)); 384 EXPECT_CALL(*sink, FormatIsSet()).WillOnce(SignalEvent(&event));
412 EXPECT_CALL(*sink, CaptureData(_, _, _, _, 0, 0, true, false)) 385 EXPECT_CALL(*sink, CaptureData(_, 0, 0, _, false))
413 .Times(AnyNumber()).WillRepeatedly(Return()); 386 .Times(AnyNumber()).WillRepeatedly(Return());
414 track_1->AddSink(sink.get()); 387 track_1->AddSink(sink.get());
415 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 388 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
416 389
417 // Start the second audio track will not start the |capturer_source_| 390 // Start the second audio track will not start the |capturer_source_|
418 // since it has been started. 391 // since it has been started.
419 EXPECT_CALL(*capturer_source_.get(), OnStart()).Times(0); 392 EXPECT_CALL(*capturer_source_.get(), OnStart()).Times(0);
420 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2( 393 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2(
421 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); 394 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
422 scoped_ptr<WebRtcLocalAudioTrack> track_2( 395 scoped_ptr<WebRtcLocalAudioTrack> track_2(
423 new WebRtcLocalAudioTrack(adapter_2, capturer_, NULL)); 396 new WebRtcLocalAudioTrack(adapter_2, capturer_, NULL));
424 static_cast<WebRtcLocalAudioSourceProvider*>( 397 static_cast<WebRtcLocalAudioSourceProvider*>(
425 track_2->audio_source_provider())->SetSinkParamsForTesting(params_); 398 track_2->audio_source_provider())->SetSinkParamsForTesting(params_);
426 track_2->Start(); 399 track_2->Start();
427 static_cast<webrtc::AudioTrackInterface*>( 400 static_cast<webrtc::AudioTrackInterface*>(
428 adapter_2.get())->GetRenderer()->AddChannel(1); 401 adapter_2.get())->GetRenderer()->AddChannel(1);
429 402
430 // Stop the capturer will clear up the track lists in the capturer. 403 // Stop the capturer will clear up the track lists in the capturer.
431 EXPECT_CALL(*capturer_source_.get(), OnStop()); 404 EXPECT_CALL(*capturer_source_.get(), OnStop());
432 capturer_->Stop(); 405 capturer_->Stop();
433 406
434 // Adding a new track to the capturer. 407 // Adding a new track to the capturer.
435 track_2->AddSink(sink.get()); 408 track_2->AddSink(sink.get());
436 EXPECT_CALL(*sink, OnSetFormat(_)).Times(0); 409 EXPECT_CALL(*sink, FormatIsSet()).Times(0);
437 410
438 // Stop the capturer again will not trigger stopping the source of the 411 // Stop the capturer again will not trigger stopping the source of the
439 // capturer again.. 412 // capturer again..
440 event.Reset(); 413 event.Reset();
441 EXPECT_CALL(*capturer_source_.get(), OnStop()).Times(0); 414 EXPECT_CALL(*capturer_source_.get(), OnStop()).Times(0);
442 capturer_->Stop(); 415 capturer_->Stop();
443 } 416 }
444 417
445 // Create a new capturer with new source, connect it to a new audio track. 418 // Create a new capturer with new source, connect it to a new audio track.
446 TEST_F(WebRtcLocalAudioTrackTest, ConnectTracksToDifferentCapturers) { 419 TEST_F(WebRtcLocalAudioTrackTest, ConnectTracksToDifferentCapturers) {
447 // Setup the first audio track and start it. 420 // Setup the first audio track and start it.
448 EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true)); 421 EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true));
449 EXPECT_CALL(*capturer_source_.get(), OnStart()); 422 EXPECT_CALL(*capturer_source_.get(), OnStart());
450 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1( 423 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1(
451 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); 424 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
452 scoped_ptr<WebRtcLocalAudioTrack> track_1( 425 scoped_ptr<WebRtcLocalAudioTrack> track_1(
453 new WebRtcLocalAudioTrack(adapter_1, capturer_, NULL)); 426 new WebRtcLocalAudioTrack(adapter_1, capturer_, NULL));
454 static_cast<WebRtcLocalAudioSourceProvider*>( 427 static_cast<WebRtcLocalAudioSourceProvider*>(
455 track_1->audio_source_provider())->SetSinkParamsForTesting(params_); 428 track_1->audio_source_provider())->SetSinkParamsForTesting(params_);
456 track_1->Start(); 429 track_1->Start();
457 430
458 // Connect a number of network channels to the |track_1|. 431 // Connect a number of network channels to the |track_1|.
459 static const int kNumberOfNetworkChannelsForTrack1 = 2; 432 static const int kNumberOfNetworkChannelsForTrack1 = 2;
460 for (int i = 0; i < kNumberOfNetworkChannelsForTrack1; ++i) { 433 for (int i = 0; i < kNumberOfNetworkChannelsForTrack1; ++i) {
461 static_cast<webrtc::AudioTrackInterface*>( 434 static_cast<webrtc::AudioTrackInterface*>(
462 adapter_1.get())->GetRenderer()->AddChannel(i); 435 adapter_1.get())->GetRenderer()->AddChannel(i);
463 } 436 }
464 // Verify the data flow by connecting the |sink_1| to |track_1|. 437 // Verify the data flow by connecting the |sink_1| to |track_1|.
465 scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink()); 438 scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink());
466 EXPECT_CALL( 439 EXPECT_CALL(*sink_1.get(),
467 *sink_1.get(), 440 CaptureData(kNumberOfNetworkChannelsForTrack1,
468 CaptureData( 441 0, 0, _, false))
469 kNumberOfNetworkChannelsForTrack1, 48000, 2, _, 0, 0, true, false))
470 .Times(AnyNumber()).WillRepeatedly(Return()); 442 .Times(AnyNumber()).WillRepeatedly(Return());
471 EXPECT_CALL(*sink_1.get(), OnSetFormat(_)).Times(AnyNumber()); 443 EXPECT_CALL(*sink_1.get(), FormatIsSet()).Times(AnyNumber());
472 track_1->AddSink(sink_1.get()); 444 track_1->AddSink(sink_1.get());
473 445
474 // Create a new capturer with new source with different audio format. 446 // Create a new capturer with new source with different audio format.
475 blink::WebMediaConstraints constraints; 447 blink::WebMediaConstraints constraints;
476 StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE, 448 StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE,
477 std::string(), std::string()); 449 std::string(), std::string());
478 scoped_refptr<WebRtcAudioCapturer> new_capturer( 450 scoped_refptr<WebRtcAudioCapturer> new_capturer(
479 WebRtcAudioCapturer::CreateCapturer(-1, device, constraints, NULL)); 451 WebRtcAudioCapturer::CreateCapturer(-1, device, constraints, NULL));
480 scoped_refptr<MockCapturerSource> new_source( 452 scoped_refptr<MockCapturerSource> new_source(
481 new MockCapturerSource(new_capturer.get())); 453 new MockCapturerSource(new_capturer.get()));
(...skipping 16 matching lines...) Expand all
498 470
499 // Connect a number of network channels to the |track_2|. 471 // Connect a number of network channels to the |track_2|.
500 static const int kNumberOfNetworkChannelsForTrack2 = 3; 472 static const int kNumberOfNetworkChannelsForTrack2 = 3;
501 for (int i = 0; i < kNumberOfNetworkChannelsForTrack2; ++i) { 473 for (int i = 0; i < kNumberOfNetworkChannelsForTrack2; ++i) {
502 static_cast<webrtc::AudioTrackInterface*>( 474 static_cast<webrtc::AudioTrackInterface*>(
503 adapter_2.get())->GetRenderer()->AddChannel(i); 475 adapter_2.get())->GetRenderer()->AddChannel(i);
504 } 476 }
505 // Verify the data flow by connecting the |sink_2| to |track_2|. 477 // Verify the data flow by connecting the |sink_2| to |track_2|.
506 scoped_ptr<MockMediaStreamAudioSink> sink_2(new MockMediaStreamAudioSink()); 478 scoped_ptr<MockMediaStreamAudioSink> sink_2(new MockMediaStreamAudioSink());
507 base::WaitableEvent event(false, false); 479 base::WaitableEvent event(false, false);
508 EXPECT_CALL( 480 EXPECT_CALL(*sink_2,
509 *sink_2, 481 CaptureData(kNumberOfNetworkChannelsForTrack2, 0, 0, _, false))
510 CaptureData(
511 kNumberOfNetworkChannelsForTrack2, new_param.sample_rate(),
512 new_param.channels(), _, 0, 0, true, false))
513 .Times(AnyNumber()).WillRepeatedly(Return()); 482 .Times(AnyNumber()).WillRepeatedly(Return());
514 EXPECT_CALL(*sink_2, OnSetFormat(_)).WillOnce(SignalEvent(&event)); 483 EXPECT_CALL(*sink_2, FormatIsSet()).WillOnce(SignalEvent(&event));
515 track_2->AddSink(sink_2.get()); 484 track_2->AddSink(sink_2.get());
516 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 485 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
517 486
518 // Stopping the new source will stop the second track. 487 // Stopping the new source will stop the second track.
519 event.Reset(); 488 event.Reset();
520 EXPECT_CALL(*new_source.get(), OnStop()) 489 EXPECT_CALL(*new_source.get(), OnStop())
521 .Times(1).WillOnce(SignalEvent(&event)); 490 .Times(1).WillOnce(SignalEvent(&event));
522 new_capturer->Stop(); 491 new_capturer->Stop();
523 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 492 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
524 493
525 // Stop the capturer of the first audio track. 494 // Stop the capturer of the first audio track.
526 EXPECT_CALL(*capturer_source_.get(), OnStop()); 495 EXPECT_CALL(*capturer_source_.get(), OnStop());
527 capturer_->Stop(); 496 capturer_->Stop();
528 } 497 }
529 498
530 499
531 // Make sure a audio track can deliver packets with a buffer size smaller than 500 // Make sure a audio track can deliver packets with a buffer size smaller than
532 // 10ms when it is not connected with a peer connection. 501 // 10ms when it is not connected with a peer connection.
533 TEST_F(WebRtcLocalAudioTrackTest, TrackWorkWithSmallBufferSize) { 502 TEST_F(WebRtcLocalAudioTrackTest, TrackWorkWithSmallBufferSize) {
534 // Setup a capturer which works with a buffer size smaller than 10ms. 503 // Setup a capturer which works with a buffer size smaller than 10ms.
535 media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, 504 media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
536 media::CHANNEL_LAYOUT_STEREO, 48000, 16, 128); 505 media::CHANNEL_LAYOUT_STEREO, 48000, 16, 128);
537 506
538 // Create a capturer with new source which works with the format above. 507 // Create a capturer with new source which works with the format above.
539 blink::WebMediaConstraints constraints; 508 MockMediaConstraintFactory factory;
509 factory.DisableDefaultAudioConstraints();
540 scoped_refptr<WebRtcAudioCapturer> capturer( 510 scoped_refptr<WebRtcAudioCapturer> capturer(
541 WebRtcAudioCapturer::CreateCapturer( 511 WebRtcAudioCapturer::CreateCapturer(
542 -1, 512 -1,
543 StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, 513 StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE,
544 "", "", params.sample_rate(), 514 "", "", params.sample_rate(),
545 params.channel_layout(), 515 params.channel_layout(),
546 params.frames_per_buffer()), 516 params.frames_per_buffer()),
547 constraints, 517 factory.CreateWebMediaConstraints(),
548 NULL)); 518 NULL));
549 scoped_refptr<MockCapturerSource> source( 519 scoped_refptr<MockCapturerSource> source(
550 new MockCapturerSource(capturer.get())); 520 new MockCapturerSource(capturer.get()));
551 EXPECT_CALL(*source.get(), OnInitialize(_, capturer.get(), -1)); 521 EXPECT_CALL(*source.get(), OnInitialize(_, capturer.get(), -1));
552 capturer->SetCapturerSourceForTesting(source, params); 522 capturer->SetCapturerSourceForTesting(source, params);
553 523
554 // Setup a audio track, connect it to the capturer and start it. 524 // Setup a audio track, connect it to the capturer and start it.
555 EXPECT_CALL(*source.get(), SetAutomaticGainControl(true)); 525 EXPECT_CALL(*source.get(), SetAutomaticGainControl(true));
556 EXPECT_CALL(*source.get(), OnStart()); 526 EXPECT_CALL(*source.get(), OnStart());
557 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( 527 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter(
558 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); 528 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
559 scoped_ptr<WebRtcLocalAudioTrack> track( 529 scoped_ptr<WebRtcLocalAudioTrack> track(
560 new WebRtcLocalAudioTrack(adapter, capturer, NULL)); 530 new WebRtcLocalAudioTrack(adapter, capturer, NULL));
561 static_cast<WebRtcLocalAudioSourceProvider*>( 531 static_cast<WebRtcLocalAudioSourceProvider*>(
562 track->audio_source_provider())->SetSinkParamsForTesting(params); 532 track->audio_source_provider())->SetSinkParamsForTesting(params);
563 track->Start(); 533 track->Start();
564 534
565 // Verify the data flow by connecting the |sink| to |track|. 535 // Verify the data flow by connecting the |sink| to |track|.
566 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); 536 scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink());
567 base::WaitableEvent event(false, false); 537 base::WaitableEvent event(false, false);
568 EXPECT_CALL(*sink, OnSetFormat(_)).Times(1); 538 EXPECT_CALL(*sink, FormatIsSet()).Times(1);
569 // Verify the sinks are getting the packets with an expecting buffer size. 539 // Verify the sinks are getting the packets with an expecting buffer size.
570 #if defined(OS_ANDROID) 540 #if defined(OS_ANDROID)
571 const int expected_buffer_size = params.sample_rate() / 100; 541 const int expected_buffer_size = params.sample_rate() / 100;
572 #else 542 #else
573 const int expected_buffer_size = params.frames_per_buffer(); 543 const int expected_buffer_size = params.frames_per_buffer();
574 #endif 544 #endif
575 EXPECT_CALL(*sink, CaptureData( 545 EXPECT_CALL(*sink, CaptureData(
576 0, params.sample_rate(), params.channels(), expected_buffer_size, 546 0, 0, 0, _, false))
577 0, 0, true, false))
578 .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event)); 547 .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event));
579 track->AddSink(sink.get()); 548 track->AddSink(sink.get());
580 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); 549 EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
550 EXPECT_EQ(expected_buffer_size, sink->audio_params().frames_per_buffer());
581 551
582 // Stopping the new source will stop the second track. 552 // Stopping the new source will stop the second track.
583 EXPECT_CALL(*source, OnStop()).Times(1); 553 EXPECT_CALL(*source, OnStop()).Times(1);
584 capturer->Stop(); 554 capturer->Stop();
585 } 555 }
586 556
587 } // namespace content 557 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/webrtc_audio_capturer_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698