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

Side by Side Diff: chromecast/media/audio/cast_audio_output_stream_unittest.cc

Issue 1913973003: [chromecast] Simplify CastAudioOutputStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup 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
« no previous file with comments | « chromecast/media/audio/cast_audio_output_stream.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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chromecast/media/audio/cast_audio_output_stream.h" 5 #include "chromecast/media/audio/cast_audio_output_stream.h"
6 6
7 #include <stddef.h>
8 #include <stdint.h>
9 #include <utility>
10
11 #include "base/bind.h"
12 #include "base/macros.h"
13 #include "base/run_loop.h" 7 #include "base/run_loop.h"
14 #include "base/synchronization/waitable_event.h"
15 #include "base/thread_task_runner_handle.h"
16 #include "chromecast/base/metrics/cast_metrics_test_helper.h" 8 #include "chromecast/base/metrics/cast_metrics_test_helper.h"
17 #include "chromecast/media/audio/cast_audio_manager.h" 9 #include "chromecast/media/audio/cast_audio_manager.h"
18 #include "chromecast/media/base/media_message_loop.h"
19 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h"
20 #include "chromecast/public/media/cast_decoder_buffer.h" 10 #include "chromecast/public/media/cast_decoder_buffer.h"
21 #include "chromecast/public/media/decoder_config.h"
22 #include "chromecast/public/media/decrypt_context.h"
23 #include "chromecast/public/media/media_pipeline_backend.h" 11 #include "chromecast/public/media/media_pipeline_backend.h"
24 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
25 13
26 namespace chromecast { 14 namespace chromecast {
27 namespace media { 15 namespace media {
28 namespace { 16 namespace {
29 const char kDefaultDeviceId[] = ""; 17 const char kDefaultDeviceId[] = "";
30 18
31 void RunUntilIdle(base::TaskRunner* task_runner) {
32 base::WaitableEvent completion_event(false, false);
33 task_runner->PostTask(FROM_HERE,
34 base::Bind(&base::WaitableEvent::Signal,
35 base::Unretained(&completion_event)));
36 completion_event.Wait();
37 }
38
39 class FakeAudioDecoder : public MediaPipelineBackend::AudioDecoder { 19 class FakeAudioDecoder : public MediaPipelineBackend::AudioDecoder {
40 public: 20 public:
41 enum PipelineStatus { 21 enum PipelineStatus {
42 PIPELINE_STATUS_OK, 22 PIPELINE_STATUS_OK,
43 PIPELINE_STATUS_BUSY, 23 PIPELINE_STATUS_BUSY,
44 PIPELINE_STATUS_ERROR, 24 PIPELINE_STATUS_ERROR,
45 PIPELINE_STATUS_ASYNC_ERROR, 25 PIPELINE_STATUS_ASYNC_ERROR,
46 }; 26 };
47 27
48 FakeAudioDecoder() 28 FakeAudioDecoder()
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 class FakeAudioManager : public CastAudioManager { 167 class FakeAudioManager : public CastAudioManager {
188 public: 168 public:
189 FakeAudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner) 169 FakeAudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner)
190 : CastAudioManager(task_runner, task_runner, nullptr, nullptr), 170 : CastAudioManager(task_runner, task_runner, nullptr, nullptr),
191 media_pipeline_backend_(nullptr) {} 171 media_pipeline_backend_(nullptr) {}
192 ~FakeAudioManager() override {} 172 ~FakeAudioManager() override {}
193 173
194 // CastAudioManager overrides. 174 // CastAudioManager overrides.
195 std::unique_ptr<MediaPipelineBackend> CreateMediaPipelineBackend( 175 std::unique_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
196 const MediaPipelineDeviceParams& params) override { 176 const MediaPipelineDeviceParams& params) override {
197 DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread()); 177 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
198 DCHECK(!media_pipeline_backend_); 178 DCHECK(!media_pipeline_backend_);
199 179
200 std::unique_ptr<FakeMediaPipelineBackend> backend( 180 std::unique_ptr<FakeMediaPipelineBackend> backend(
201 new FakeMediaPipelineBackend()); 181 new FakeMediaPipelineBackend());
202 // Cache the backend locally to be used by tests. 182 // Cache the backend locally to be used by tests.
203 media_pipeline_backend_ = backend.get(); 183 media_pipeline_backend_ = backend.get();
204 return std::move(backend); 184 return std::move(backend);
205 } 185 }
206 void ReleaseOutputStream(::media::AudioOutputStream* stream) override { 186 void ReleaseOutputStream(::media::AudioOutputStream* stream) override {
207 DCHECK(media_pipeline_backend_); 187 DCHECK(media_pipeline_backend_);
(...skipping 18 matching lines...) Expand all
226 : format_(::media::AudioParameters::AUDIO_PCM_LINEAR), 206 : format_(::media::AudioParameters::AUDIO_PCM_LINEAR),
227 channel_layout_(::media::CHANNEL_LAYOUT_MONO), 207 channel_layout_(::media::CHANNEL_LAYOUT_MONO),
228 sample_rate_(::media::AudioParameters::kAudioCDSampleRate), 208 sample_rate_(::media::AudioParameters::kAudioCDSampleRate),
229 bits_per_sample_(16), 209 bits_per_sample_(16),
230 frames_per_buffer_(256) {} 210 frames_per_buffer_(256) {}
231 ~CastAudioOutputStreamTest() override {} 211 ~CastAudioOutputStreamTest() override {}
232 212
233 protected: 213 protected:
234 void SetUp() override { 214 void SetUp() override {
235 metrics::InitializeMetricsHelperForTesting(); 215 metrics::InitializeMetricsHelperForTesting();
236 216 audio_manager_.reset(new FakeAudioManager(message_loop_.task_runner()));
237 audio_task_runner_ = base::ThreadTaskRunnerHandle::Get();
238 backend_task_runner_ = media::MediaMessageLoop::GetTaskRunner();
239 audio_manager_.reset(new FakeAudioManager(audio_task_runner_));
240 } 217 }
241 218
242 void TearDown() override { 219 void TearDown() override {
243 audio_manager_.reset(); 220 audio_manager_.reset();
244 } 221 }
245 222
246 ::media::AudioParameters GetAudioParams() { 223 ::media::AudioParameters GetAudioParams() {
247 return ::media::AudioParameters(format_, channel_layout_, sample_rate_, 224 return ::media::AudioParameters(format_, channel_layout_, sample_rate_,
248 bits_per_sample_, frames_per_buffer_); 225 bits_per_sample_, frames_per_buffer_);
249 } 226 }
250 227
251 FakeMediaPipelineBackend* GetBackend() { 228 FakeMediaPipelineBackend* GetBackend() {
252 return audio_manager_->media_pipeline_backend(); 229 return audio_manager_->media_pipeline_backend();
253 } 230 }
254 231
255 FakeAudioDecoder* GetAudio() { 232 FakeAudioDecoder* GetAudio() {
256 FakeMediaPipelineBackend* backend = GetBackend(); 233 FakeMediaPipelineBackend* backend = GetBackend();
257 return (backend ? backend->decoder() : nullptr); 234 return (backend ? backend->decoder() : nullptr);
258 } 235 }
259 236
260 // Synchronous utility functions.
261 ::media::AudioOutputStream* CreateStream() { 237 ::media::AudioOutputStream* CreateStream() {
262 return audio_manager_->MakeAudioOutputStream(GetAudioParams(), 238 return audio_manager_->MakeAudioOutputStream(GetAudioParams(),
263 kDefaultDeviceId); 239 kDefaultDeviceId);
264 } 240 }
265 bool OpenStream(::media::AudioOutputStream* stream) {
266 bool success = stream->Open();
267 // Drain the backend task runner so that appropriate states are set on
268 // the backend pipeline devices.
269 RunUntilIdle(backend_task_runner_.get());
270 return success;
271 }
272 void CloseStream(::media::AudioOutputStream* stream) {
273 stream->Close();
274 RunUntilIdle(backend_task_runner_.get());
275 // Backend task runner may have posted more tasks to the audio task runner.
276 // So we need to drain it once more.
277 message_loop_.RunUntilIdle();
278 }
279 void StartStream(
280 ::media::AudioOutputStream* stream,
281 ::media::AudioOutputStream::AudioSourceCallback* source_callback) {
282 stream->Start(source_callback);
283 // Drain the audio task runner so that tasks posted by
284 // media::AudioOutputStream::Start are run as well.
285 message_loop_.RunUntilIdle();
286 // Drain the backend task runner so that appropriate states are set on
287 // the backend pipeline devices.
288 RunUntilIdle(backend_task_runner_.get());
289 // Drain the audio task runner again to run the tasks posted by the
290 // backend on audio task runner.
291 message_loop_.RunUntilIdle();
292 }
293 void StopStream(::media::AudioOutputStream* stream) {
294 stream->Stop();
295 // Drain the backend task runner so that appropriate states are set on
296 // the backend pipeline devices.
297 RunUntilIdle(backend_task_runner_.get());
298 }
299 void SetStreamVolume(::media::AudioOutputStream* stream, double volume) {
300 stream->SetVolume(volume);
301 // Drain the backend task runner so that appropriate states are set on
302 // the backend pipeline devices.
303 RunUntilIdle(backend_task_runner_.get());
304 }
305 double GetStreamVolume(::media::AudioOutputStream* stream) {
306 double volume = 0.0;
307 stream->GetVolume(&volume);
308 // No need to drain the backend task runner because getting the volume
309 // does not involve posting any task to the backend.
310 return volume;
311 }
312 241
313 void RunAudioLoopFor(int frames) { 242 // Runs the messsage loop for duration equivalent to the given number of
243 // audio |frames|.
244 void RunMessageLoopFor(int frames) {
314 ::media::AudioParameters audio_params = GetAudioParams(); 245 ::media::AudioParameters audio_params = GetAudioParams();
315 base::TimeDelta duration = audio_params.GetBufferDuration() * frames; 246 base::TimeDelta duration = audio_params.GetBufferDuration() * frames;
316 247
317 base::RunLoop run_loop; 248 base::RunLoop run_loop;
318 message_loop_.task_runner()->PostDelayedTask( 249 message_loop_.task_runner()->PostDelayedTask(
319 FROM_HERE, run_loop.QuitClosure(), duration); 250 FROM_HERE, run_loop.QuitClosure(), duration);
320 run_loop.Run(); 251 run_loop.Run();
321 } 252 }
322 253
323 base::MessageLoop message_loop_; 254 base::MessageLoop message_loop_;
324 std::unique_ptr<FakeAudioManager> audio_manager_; 255 std::unique_ptr<FakeAudioManager> audio_manager_;
325 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
326 scoped_refptr<base::SingleThreadTaskRunner> backend_task_runner_;
327
328 // AudioParameters used to create AudioOutputStream. 256 // AudioParameters used to create AudioOutputStream.
329 // Tests can modify these parameters before calling CreateStream. 257 // Tests can modify these parameters before calling CreateStream.
330 ::media::AudioParameters::Format format_; 258 ::media::AudioParameters::Format format_;
331 ::media::ChannelLayout channel_layout_; 259 ::media::ChannelLayout channel_layout_;
332 int sample_rate_; 260 int sample_rate_;
333 int bits_per_sample_; 261 int bits_per_sample_;
334 int frames_per_buffer_; 262 int frames_per_buffer_;
335 }; 263 };
336 264
337 TEST_F(CastAudioOutputStreamTest, Format) { 265 TEST_F(CastAudioOutputStreamTest, Format) {
338 ::media::AudioParameters::Format format[] = { 266 ::media::AudioParameters::Format format[] = {
339 //::media::AudioParameters::AUDIO_PCM_LINEAR, 267 //::media::AudioParameters::AUDIO_PCM_LINEAR,
340 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY}; 268 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY};
341 for (size_t i = 0; i < arraysize(format); ++i) { 269 for (size_t i = 0; i < arraysize(format); ++i) {
342 format_ = format[i]; 270 format_ = format[i];
343 ::media::AudioOutputStream* stream = CreateStream(); 271 ::media::AudioOutputStream* stream = CreateStream();
344 ASSERT_TRUE(stream); 272 ASSERT_TRUE(stream);
345 EXPECT_TRUE(OpenStream(stream)); 273 EXPECT_TRUE(stream->Open());
346 274
347 FakeAudioDecoder* audio_decoder = GetAudio(); 275 FakeAudioDecoder* audio_decoder = GetAudio();
348 ASSERT_TRUE(audio_decoder); 276 ASSERT_TRUE(audio_decoder);
349 const AudioConfig& audio_config = audio_decoder->config(); 277 const AudioConfig& audio_config = audio_decoder->config();
350 EXPECT_EQ(kCodecPCM, audio_config.codec); 278 EXPECT_EQ(kCodecPCM, audio_config.codec);
351 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format); 279 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format);
352 EXPECT_FALSE(audio_config.encryption_scheme.is_encrypted()); 280 EXPECT_FALSE(audio_config.encryption_scheme.is_encrypted());
353 281
354 CloseStream(stream); 282 stream->Close();
355 } 283 }
356 } 284 }
357 285
358 TEST_F(CastAudioOutputStreamTest, ChannelLayout) { 286 TEST_F(CastAudioOutputStreamTest, ChannelLayout) {
359 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO, 287 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO,
360 ::media::CHANNEL_LAYOUT_STEREO}; 288 ::media::CHANNEL_LAYOUT_STEREO};
361 for (size_t i = 0; i < arraysize(layout); ++i) { 289 for (size_t i = 0; i < arraysize(layout); ++i) {
362 channel_layout_ = layout[i]; 290 channel_layout_ = layout[i];
363 ::media::AudioOutputStream* stream = CreateStream(); 291 ::media::AudioOutputStream* stream = CreateStream();
364 ASSERT_TRUE(stream); 292 ASSERT_TRUE(stream);
365 EXPECT_TRUE(OpenStream(stream)); 293 EXPECT_TRUE(stream->Open());
366 294
367 FakeAudioDecoder* audio_decoder = GetAudio(); 295 FakeAudioDecoder* audio_decoder = GetAudio();
368 ASSERT_TRUE(audio_decoder); 296 ASSERT_TRUE(audio_decoder);
369 const AudioConfig& audio_config = audio_decoder->config(); 297 const AudioConfig& audio_config = audio_decoder->config();
370 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_), 298 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_),
371 audio_config.channel_number); 299 audio_config.channel_number);
372 300
373 CloseStream(stream); 301 stream->Close();
374 } 302 }
375 } 303 }
376 304
377 TEST_F(CastAudioOutputStreamTest, SampleRate) { 305 TEST_F(CastAudioOutputStreamTest, SampleRate) {
378 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate; 306 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate;
379 ::media::AudioOutputStream* stream = CreateStream(); 307 ::media::AudioOutputStream* stream = CreateStream();
380 ASSERT_TRUE(stream); 308 ASSERT_TRUE(stream);
381 EXPECT_TRUE(OpenStream(stream)); 309 EXPECT_TRUE(stream->Open());
382 310
383 FakeAudioDecoder* audio_decoder = GetAudio(); 311 FakeAudioDecoder* audio_decoder = GetAudio();
384 ASSERT_TRUE(audio_decoder); 312 ASSERT_TRUE(audio_decoder);
385 const AudioConfig& audio_config = audio_decoder->config(); 313 const AudioConfig& audio_config = audio_decoder->config();
386 EXPECT_EQ(sample_rate_, audio_config.samples_per_second); 314 EXPECT_EQ(sample_rate_, audio_config.samples_per_second);
387 315
388 CloseStream(stream); 316 stream->Close();
389 } 317 }
390 318
391 TEST_F(CastAudioOutputStreamTest, BitsPerSample) { 319 TEST_F(CastAudioOutputStreamTest, BitsPerSample) {
392 bits_per_sample_ = 16; 320 bits_per_sample_ = 16;
393 ::media::AudioOutputStream* stream = CreateStream(); 321 ::media::AudioOutputStream* stream = CreateStream();
394 ASSERT_TRUE(stream); 322 ASSERT_TRUE(stream);
395 EXPECT_TRUE(OpenStream(stream)); 323 EXPECT_TRUE(stream->Open());
396 324
397 FakeAudioDecoder* audio_decoder = GetAudio(); 325 FakeAudioDecoder* audio_decoder = GetAudio();
398 ASSERT_TRUE(audio_decoder); 326 ASSERT_TRUE(audio_decoder);
399 const AudioConfig& audio_config = audio_decoder->config(); 327 const AudioConfig& audio_config = audio_decoder->config();
400 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel); 328 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel);
401 329
402 CloseStream(stream); 330 stream->Close();
403 } 331 }
404 332
405 TEST_F(CastAudioOutputStreamTest, DeviceState) { 333 TEST_F(CastAudioOutputStreamTest, DeviceState) {
406 ::media::AudioOutputStream* stream = CreateStream(); 334 ::media::AudioOutputStream* stream = CreateStream();
407 ASSERT_TRUE(stream); 335 ASSERT_TRUE(stream);
408 EXPECT_FALSE(GetAudio()); 336 EXPECT_FALSE(GetAudio());
409 337
410 EXPECT_TRUE(OpenStream(stream)); 338 EXPECT_TRUE(stream->Open());
411 FakeAudioDecoder* audio_decoder = GetAudio(); 339 FakeAudioDecoder* audio_decoder = GetAudio();
412 ASSERT_TRUE(audio_decoder); 340 ASSERT_TRUE(audio_decoder);
413 FakeMediaPipelineBackend* backend = GetBackend(); 341 FakeMediaPipelineBackend* backend = GetBackend();
414 ASSERT_TRUE(backend); 342 ASSERT_TRUE(backend);
415 EXPECT_EQ(FakeMediaPipelineBackend::kStateStopped, backend->state()); 343 EXPECT_EQ(FakeMediaPipelineBackend::kStateStopped, backend->state());
416 344
417 std::unique_ptr<FakeAudioSourceCallback> source_callback( 345 std::unique_ptr<FakeAudioSourceCallback> source_callback(
418 new FakeAudioSourceCallback); 346 new FakeAudioSourceCallback);
419 StartStream(stream, source_callback.get()); 347 stream->Start(source_callback.get());
420 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, backend->state()); 348 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, backend->state());
421 349
422 StopStream(stream); 350 stream->Stop();
423 EXPECT_EQ(FakeMediaPipelineBackend::kStatePaused, backend->state()); 351 EXPECT_EQ(FakeMediaPipelineBackend::kStatePaused, backend->state());
424 352
425 CloseStream(stream); 353 stream->Close();
426 EXPECT_FALSE(GetAudio()); 354 EXPECT_FALSE(GetAudio());
427 } 355 }
428 356
429 TEST_F(CastAudioOutputStreamTest, PushFrame) { 357 TEST_F(CastAudioOutputStreamTest, PushFrame) {
430 ::media::AudioOutputStream* stream = CreateStream(); 358 ::media::AudioOutputStream* stream = CreateStream();
431 ASSERT_TRUE(stream); 359 ASSERT_TRUE(stream);
432 EXPECT_TRUE(OpenStream(stream)); 360 EXPECT_TRUE(stream->Open());
433 361
434 FakeAudioDecoder* audio_decoder = GetAudio(); 362 FakeAudioDecoder* audio_decoder = GetAudio();
435 ASSERT_TRUE(audio_decoder); 363 ASSERT_TRUE(audio_decoder);
436 // Verify initial state. 364 // Verify initial state.
437 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count()); 365 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count());
438 EXPECT_FALSE(audio_decoder->last_buffer()); 366 EXPECT_FALSE(audio_decoder->last_buffer());
439 367
440 std::unique_ptr<FakeAudioSourceCallback> source_callback( 368 std::unique_ptr<FakeAudioSourceCallback> source_callback(
441 new FakeAudioSourceCallback); 369 new FakeAudioSourceCallback);
442 StartStream(stream, source_callback.get()); 370 stream->Start(source_callback.get());
443 RunAudioLoopFor(2); 371 RunMessageLoopFor(2);
444 StopStream(stream); 372 stream->Stop();
445 373
446 // Verify that the stream pushed frames to the backend. 374 // Verify that the stream pushed frames to the backend.
447 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); 375 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
448 EXPECT_TRUE(audio_decoder->last_buffer()); 376 EXPECT_TRUE(audio_decoder->last_buffer());
449 377
450 // Verify decoder buffer. 378 // Verify decoder buffer.
451 ::media::AudioParameters audio_params = GetAudioParams(); 379 ::media::AudioParameters audio_params = GetAudioParams();
452 const size_t expected_frame_size = 380 const size_t expected_frame_size =
453 static_cast<size_t>(audio_params.GetBytesPerBuffer()); 381 static_cast<size_t>(audio_params.GetBytesPerBuffer());
454 const CastDecoderBuffer* buffer = audio_decoder->last_buffer(); 382 const CastDecoderBuffer* buffer = audio_decoder->last_buffer();
455 EXPECT_TRUE(buffer->data()); 383 EXPECT_TRUE(buffer->data());
456 EXPECT_EQ(expected_frame_size, buffer->data_size()); 384 EXPECT_EQ(expected_frame_size, buffer->data_size());
457 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio. 385 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio.
458 EXPECT_FALSE(buffer->end_of_stream()); 386 EXPECT_FALSE(buffer->end_of_stream());
459 387
460 // No error must be reported to source callback. 388 // No error must be reported to source callback.
461 EXPECT_FALSE(source_callback->error()); 389 EXPECT_FALSE(source_callback->error());
462 390
463 CloseStream(stream); 391 stream->Close();
464 } 392 }
465 393
466 TEST_F(CastAudioOutputStreamTest, DeviceBusy) { 394 TEST_F(CastAudioOutputStreamTest, DeviceBusy) {
467 ::media::AudioOutputStream* stream = CreateStream(); 395 ::media::AudioOutputStream* stream = CreateStream();
468 ASSERT_TRUE(stream); 396 ASSERT_TRUE(stream);
469 EXPECT_TRUE(OpenStream(stream)); 397 EXPECT_TRUE(stream->Open());
470 398
471 FakeAudioDecoder* audio_decoder = GetAudio(); 399 FakeAudioDecoder* audio_decoder = GetAudio();
472 ASSERT_TRUE(audio_decoder); 400 ASSERT_TRUE(audio_decoder);
473 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY); 401 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY);
474 402
475 std::unique_ptr<FakeAudioSourceCallback> source_callback( 403 std::unique_ptr<FakeAudioSourceCallback> source_callback(
476 new FakeAudioSourceCallback); 404 new FakeAudioSourceCallback);
477 StartStream(stream, source_callback.get()); 405 stream->Start(source_callback.get());
478 406 RunMessageLoopFor(5);
479 // Make sure that one frame was pushed. 407 // Make sure that one frame was pushed.
480 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 408 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
481 // No error must be reported to source callback. 409 // No error must be reported to source callback.
482 EXPECT_FALSE(source_callback->error()); 410 EXPECT_FALSE(source_callback->error());
483 411
484 // Sleep for a few frames and verify that more frames were not pushed 412 // Sleep for a few frames and verify that more frames were not pushed
485 // because the backend device was busy. 413 // because the backend device was busy.
486 RunAudioLoopFor(5); 414 RunMessageLoopFor(5);
487 RunUntilIdle(backend_task_runner_.get());
488 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 415 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
489 416
490 // Unblock the pipeline and verify that PushFrame resumes. 417 // Unblock the pipeline and verify that PushFrame resumes.
491 // (have to post because this directly calls buffer complete) 418 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_OK);
492 backend_task_runner_->PostTask( 419 RunMessageLoopFor(5);
493 FROM_HERE,
494 base::Bind(&FakeAudioDecoder::set_pipeline_status,
495 base::Unretained(audio_decoder),
496 FakeAudioDecoder::PIPELINE_STATUS_OK));
497 RunAudioLoopFor(5);
498 RunUntilIdle(backend_task_runner_.get());
499 EXPECT_LT(1u, audio_decoder->pushed_buffer_count()); 420 EXPECT_LT(1u, audio_decoder->pushed_buffer_count());
500 EXPECT_FALSE(source_callback->error()); 421 EXPECT_FALSE(source_callback->error());
501 422
502 StopStream(stream); 423 stream->Stop();
503 CloseStream(stream); 424 stream->Close();
504 } 425 }
505 426
506 TEST_F(CastAudioOutputStreamTest, DeviceError) { 427 TEST_F(CastAudioOutputStreamTest, DeviceError) {
507 ::media::AudioOutputStream* stream = CreateStream(); 428 ::media::AudioOutputStream* stream = CreateStream();
508 ASSERT_TRUE(stream); 429 ASSERT_TRUE(stream);
509 EXPECT_TRUE(OpenStream(stream)); 430 EXPECT_TRUE(stream->Open());
510 431
511 FakeAudioDecoder* audio_decoder = GetAudio(); 432 FakeAudioDecoder* audio_decoder = GetAudio();
512 ASSERT_TRUE(audio_decoder); 433 ASSERT_TRUE(audio_decoder);
513 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR); 434 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR);
514 435
515 std::unique_ptr<FakeAudioSourceCallback> source_callback( 436 std::unique_ptr<FakeAudioSourceCallback> source_callback(
516 new FakeAudioSourceCallback); 437 new FakeAudioSourceCallback);
517 StartStream(stream, source_callback.get()); 438 stream->Start(source_callback.get());
518 RunAudioLoopFor(2); 439 RunMessageLoopFor(2);
519
520 // Make sure that AudioOutputStream attempted to push the initial frame. 440 // Make sure that AudioOutputStream attempted to push the initial frame.
521 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); 441 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
522 // AudioOutputStream must report error to source callback. 442 // AudioOutputStream must report error to source callback.
523 EXPECT_TRUE(source_callback->error()); 443 EXPECT_TRUE(source_callback->error());
524 444
525 StopStream(stream); 445 stream->Stop();
526 CloseStream(stream); 446 stream->Close();
527 } 447 }
528 448
529 TEST_F(CastAudioOutputStreamTest, DeviceAsyncError) { 449 TEST_F(CastAudioOutputStreamTest, DeviceAsyncError) {
530 ::media::AudioOutputStream* stream = CreateStream(); 450 ::media::AudioOutputStream* stream = CreateStream();
531 ASSERT_TRUE(stream); 451 ASSERT_TRUE(stream);
532 EXPECT_TRUE(OpenStream(stream)); 452 EXPECT_TRUE(stream->Open());
533 453
534 FakeAudioDecoder* audio_decoder = GetAudio(); 454 FakeAudioDecoder* audio_decoder = GetAudio();
535 ASSERT_TRUE(audio_decoder); 455 ASSERT_TRUE(audio_decoder);
536 audio_decoder->set_pipeline_status( 456 audio_decoder->set_pipeline_status(
537 FakeAudioDecoder::PIPELINE_STATUS_ASYNC_ERROR); 457 FakeAudioDecoder::PIPELINE_STATUS_ASYNC_ERROR);
538 458
539 std::unique_ptr<FakeAudioSourceCallback> source_callback( 459 std::unique_ptr<FakeAudioSourceCallback> source_callback(
540 new FakeAudioSourceCallback); 460 new FakeAudioSourceCallback);
541 StartStream(stream, source_callback.get()); 461 stream->Start(source_callback.get());
542 RunAudioLoopFor(5); 462 RunMessageLoopFor(5);
543 463
544 // Make sure that one frame was pushed. 464 // Make sure that one frame was pushed.
545 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 465 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
546
547 // Unblock the pipeline and verify that PushFrame resumes.
548 // (have to post because this directly calls buffer complete)
549 backend_task_runner_->PostTask(
550 FROM_HERE,
551 base::Bind(&FakeAudioDecoder::set_pipeline_status,
552 base::Unretained(audio_decoder),
553 FakeAudioDecoder::PIPELINE_STATUS_OK));
554
555 RunAudioLoopFor(5);
556 RunUntilIdle(backend_task_runner_.get());
557 // AudioOutputStream must report error to source callback. 466 // AudioOutputStream must report error to source callback.
558 EXPECT_TRUE(source_callback->error()); 467 EXPECT_TRUE(source_callback->error());
559 468
560 StopStream(stream); 469 stream->Stop();
561 CloseStream(stream); 470 stream->Close();
562 } 471 }
563 472
564 TEST_F(CastAudioOutputStreamTest, Volume) { 473 TEST_F(CastAudioOutputStreamTest, Volume) {
565 ::media::AudioOutputStream* stream = CreateStream(); 474 ::media::AudioOutputStream* stream = CreateStream();
566 ASSERT_TRUE(stream); 475 ASSERT_TRUE(stream);
567 ASSERT_TRUE(OpenStream(stream)); 476 ASSERT_TRUE(stream->Open());
568 FakeAudioDecoder* audio_decoder = GetAudio(); 477 FakeAudioDecoder* audio_decoder = GetAudio();
569 ASSERT_TRUE(audio_decoder); 478 ASSERT_TRUE(audio_decoder);
570 479
571 double volume = GetStreamVolume(stream); 480 double volume = 0.0;
481 stream->GetVolume(&volume);
572 EXPECT_EQ(1.0, volume); 482 EXPECT_EQ(1.0, volume);
573 EXPECT_EQ(1.0f, audio_decoder->volume()); 483 EXPECT_EQ(1.0f, audio_decoder->volume());
574 484
575 SetStreamVolume(stream, 0.5); 485 stream->SetVolume(0.5);
576 volume = GetStreamVolume(stream); 486 stream->GetVolume(&volume);
577 EXPECT_EQ(0.5, volume); 487 EXPECT_EQ(0.5, volume);
578 EXPECT_EQ(0.5f, audio_decoder->volume()); 488 EXPECT_EQ(0.5f, audio_decoder->volume());
579 489
580 CloseStream(stream); 490 stream->Close();
581 } 491 }
582 492
583 TEST_F(CastAudioOutputStreamTest, StartStopStart) { 493 TEST_F(CastAudioOutputStreamTest, StartStopStart) {
584 ::media::AudioOutputStream* stream = CreateStream(); 494 ::media::AudioOutputStream* stream = CreateStream();
585 ASSERT_TRUE(stream); 495 ASSERT_TRUE(stream);
586 ASSERT_TRUE(OpenStream(stream)); 496 ASSERT_TRUE(stream->Open());
587 497
588 std::unique_ptr<FakeAudioSourceCallback> source_callback( 498 std::unique_ptr<FakeAudioSourceCallback> source_callback(
589 new FakeAudioSourceCallback); 499 new FakeAudioSourceCallback);
590 stream->Start(source_callback.get()); 500 stream->Start(source_callback.get());
591 RunAudioLoopFor(2); 501 RunMessageLoopFor(2);
592 stream->Stop(); 502 stream->Stop();
593 stream->Start(source_callback.get()); 503 stream->Start(source_callback.get());
594 RunAudioLoopFor(2); 504 RunMessageLoopFor(2);
595 RunUntilIdle(backend_task_runner_.get());
596 505
597 FakeAudioDecoder* audio_device = GetAudio(); 506 FakeAudioDecoder* audio_device = GetAudio();
598 EXPECT_TRUE(audio_device); 507 EXPECT_TRUE(audio_device);
599 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state()); 508 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state());
600 509
601 CloseStream(stream); 510 stream->Close();
602 } 511 }
603 512
604 TEST_F(CastAudioOutputStreamTest, CloseWithoutStart) { 513 TEST_F(CastAudioOutputStreamTest, CloseWithoutStart) {
605 ::media::AudioOutputStream* stream = CreateStream(); 514 ::media::AudioOutputStream* stream = CreateStream();
606 ASSERT_TRUE(stream); 515 ASSERT_TRUE(stream);
607 ASSERT_TRUE(OpenStream(stream)); 516 ASSERT_TRUE(stream->Open());
608 CloseStream(stream); 517 stream->Close();
609 } 518 }
610 519
611 } // namespace 520 } // namespace
612 } // namespace media 521 } // namespace media
613 } // namespace chromecast 522 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/audio/cast_audio_output_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698