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

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

Issue 1372393007: [Chromecast] Upgrade to new CMA backend API (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Address alokp@ comments Created 5 years, 2 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 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/synchronization/waitable_event.h" 6 #include "base/synchronization/waitable_event.h"
7 #include "chromecast/base/metrics/cast_metrics_test_helper.h" 7 #include "chromecast/base/metrics/cast_metrics_test_helper.h"
8 #include "chromecast/media/audio/cast_audio_manager.h" 8 #include "chromecast/media/audio/cast_audio_manager.h"
9 #include "chromecast/media/audio/cast_audio_output_stream.h" 9 #include "chromecast/media/audio/cast_audio_output_stream.h"
10 #include "chromecast/media/base/media_message_loop.h" 10 #include "chromecast/media/base/media_message_loop.h"
11 #include "chromecast/public/media/audio_pipeline_device.h" 11 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h"
12 #include "chromecast/public/media/cast_decoder_buffer.h" 12 #include "chromecast/public/media/cast_decoder_buffer.h"
13 #include "chromecast/public/media/decoder_config.h" 13 #include "chromecast/public/media/decoder_config.h"
14 #include "chromecast/public/media/decrypt_context.h" 14 #include "chromecast/public/media/decrypt_context.h"
15 #include "chromecast/public/media/media_clock_device.h"
16 #include "chromecast/public/media/media_pipeline_backend.h" 15 #include "chromecast/public/media/media_pipeline_backend.h"
17 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
18 17
19 namespace chromecast { 18 namespace chromecast {
20 namespace media { 19 namespace media {
21 namespace { 20 namespace {
22 const char kDefaultDeviceId[] = ""; 21 const char kDefaultDeviceId[] = "";
23 22
24 void RunUntilIdle(base::TaskRunner* task_runner) { 23 void RunUntilIdle(base::TaskRunner* task_runner) {
25 base::WaitableEvent completion_event(false, false); 24 base::WaitableEvent completion_event(false, false);
26 task_runner->PostTask(FROM_HERE, 25 task_runner->PostTask(FROM_HERE,
27 base::Bind(&base::WaitableEvent::Signal, 26 base::Bind(&base::WaitableEvent::Signal,
28 base::Unretained(&completion_event))); 27 base::Unretained(&completion_event)));
29 completion_event.Wait(); 28 completion_event.Wait();
30 } 29 }
31 30
32 class FakeClockDevice : public MediaClockDevice { 31 class FakeAudioDecoder : public MediaPipelineBackend::AudioDecoder {
33 public:
34 FakeClockDevice() : state_(kStateUninitialized), rate_(0.f) {}
35 ~FakeClockDevice() override {}
36
37 State GetState() const override { return state_; }
38 bool SetState(State new_state) override {
39 state_ = new_state;
40 return true;
41 }
42 bool ResetTimeline(int64_t time_microseconds) override { return true; }
43 bool SetRate(float rate) override {
44 rate_ = rate;
45 return true;
46 }
47 int64_t GetTimeMicroseconds() override { return 0; }
48
49 float rate() const { return rate_; }
50
51 private:
52 State state_;
53 float rate_;
54 };
55
56 class FakeAudioPipelineDevice : public AudioPipelineDevice {
57 public: 32 public:
58 enum PipelineStatus { 33 enum PipelineStatus {
59 PIPELINE_STATUS_OK, 34 PIPELINE_STATUS_OK,
60 PIPELINE_STATUS_BUSY, 35 PIPELINE_STATUS_BUSY,
61 PIPELINE_STATUS_ERROR 36 PIPELINE_STATUS_ERROR
62 }; 37 };
63 38
64 FakeAudioPipelineDevice() 39 FakeAudioDecoder()
65 : state_(kStateUninitialized), 40 : volume_(1.0f),
66 volume_multiplier_(1.0f),
67 pipeline_status_(PIPELINE_STATUS_OK), 41 pipeline_status_(PIPELINE_STATUS_OK),
68 pushed_frame_count_(0) {} 42 pending_push_(false),
69 ~FakeAudioPipelineDevice() override {} 43 pushed_buffer_count_(0),
44 last_decrypt_context_(nullptr),
45 last_buffer_(nullptr),
46 delegate_(nullptr) {}
47 ~FakeAudioDecoder() override {}
70 48
71 // AudioPipelineDevice overrides. 49 // MediaPipelineBackend::AudioDecoder overrides.
72 void SetClient(Client* client) override {} 50 BufferStatus PushBuffer(DecryptContext* decrypt_context,
73 bool SetState(State new_state) override { 51 CastDecoderBuffer* buffer) override {
74 state_ = new_state; 52 last_decrypt_context_ = decrypt_context;
75 return true; 53 last_buffer_ = buffer;
76 } 54 ++pushed_buffer_count_;
77 State GetState() const override { return state_; }
78 bool SetStartPts(int64_t microseconds) override { return false; }
79 FrameStatus PushFrame(DecryptContext* decrypt_context,
80 CastDecoderBuffer* buffer,
81 FrameStatusCB* completion_cb) override {
82 last_frame_decrypt_context_.reset(decrypt_context);
83 last_frame_buffer_.reset(buffer);
84 last_frame_completion_cb_.reset(completion_cb);
85 ++pushed_frame_count_;
86 55
87 switch (pipeline_status_) { 56 switch (pipeline_status_) {
88 case PIPELINE_STATUS_OK: 57 case PIPELINE_STATUS_OK:
89 return kFrameSuccess; 58 return MediaPipelineBackend::kBufferSuccess;
90 case PIPELINE_STATUS_BUSY: 59 case PIPELINE_STATUS_BUSY:
91 return kFramePending; 60 pending_push_ = true;
61 return MediaPipelineBackend::kBufferPending;
92 case PIPELINE_STATUS_ERROR: 62 case PIPELINE_STATUS_ERROR:
93 return kFrameFailed; 63 return MediaPipelineBackend::kBufferFailed;
94 default: 64 default:
95 NOTREACHED(); 65 NOTREACHED();
66 return MediaPipelineBackend::kBufferFailed;
96 } 67 }
97
98 // This will never be reached but is necessary for compiler warnings.
99 return kFrameFailed;
100 } 68 }
101 RenderingDelay GetRenderingDelay() const override { return RenderingDelay(); } 69 void GetStatistics(Statistics* statistics) override {}
102 bool GetStatistics(Statistics* stats) const override { return false; }
103 bool SetConfig(const AudioConfig& config) override { 70 bool SetConfig(const AudioConfig& config) override {
104 config_ = config; 71 config_ = config;
105 return true; 72 return true;
106 } 73 }
107 void SetStreamVolumeMultiplier(float multiplier) override { 74 bool SetVolume(float volume) override {
108 volume_multiplier_ = multiplier; 75 volume_ = volume;
76 return true;
109 } 77 }
78 RenderingDelay GetRenderingDelay() override { return RenderingDelay(); }
110 79
111 const AudioConfig& config() const { return config_; } 80 const AudioConfig& config() const { return config_; }
112 float volume_multiplier() const { return volume_multiplier_; } 81 float volume() const { return volume_; }
113 void set_pipeline_status(PipelineStatus status) { pipeline_status_ = status; } 82 void set_pipeline_status(PipelineStatus status) {
114 unsigned pushed_frame_count() const { return pushed_frame_count_; } 83 if (pipeline_status_ == PIPELINE_STATUS_BUSY &&
115 DecryptContext* last_frame_decrypt_context() { 84 status == PIPELINE_STATUS_OK && pending_push_) {
116 return last_frame_decrypt_context_.get(); 85 pending_push_ = false;
86 delegate_->OnPushBufferComplete(this,
87 MediaPipelineBackend::kBufferSuccess);
88 }
89 pipeline_status_ = status;
117 } 90 }
118 CastDecoderBuffer* last_frame_buffer() { return last_frame_buffer_.get(); } 91 unsigned pushed_buffer_count() const { return pushed_buffer_count_; }
119 FrameStatusCB* last_frame_completion_cb() { 92 DecryptContext* last_decrypt_context() { return last_decrypt_context_; }
120 return last_frame_completion_cb_.get(); 93 CastDecoderBuffer* last_buffer() { return last_buffer_; }
94 void set_delegate(MediaPipelineBackend::Delegate* delegate) {
95 delegate_ = delegate;
121 } 96 }
122 97
123 private: 98 private:
124 State state_;
125 AudioConfig config_; 99 AudioConfig config_;
126 float volume_multiplier_; 100 float volume_;
127 101
128 PipelineStatus pipeline_status_; 102 PipelineStatus pipeline_status_;
129 unsigned pushed_frame_count_; 103 bool pending_push_;
130 scoped_ptr<DecryptContext> last_frame_decrypt_context_; 104 int pushed_buffer_count_;
131 scoped_ptr<CastDecoderBuffer> last_frame_buffer_; 105 DecryptContext* last_decrypt_context_;
132 scoped_ptr<FrameStatusCB> last_frame_completion_cb_; 106 CastDecoderBuffer* last_buffer_;
107 MediaPipelineBackend::Delegate* delegate_;
133 }; 108 };
134 109
135 class FakeMediaPipelineBackend : public MediaPipelineBackend { 110 class FakeMediaPipelineBackend : public MediaPipelineBackend {
136 public: 111 public:
112 enum State { kStateStopped, kStateRunning, kStatePaused };
113
114 FakeMediaPipelineBackend() : state_(kStateStopped), audio_decoder_(nullptr) {}
137 ~FakeMediaPipelineBackend() override {} 115 ~FakeMediaPipelineBackend() override {}
138 116
139 MediaClockDevice* GetClock() override { 117 // MediaPipelineBackend implementation:
140 if (!clock_device_) 118 AudioDecoder* CreateAudioDecoder() override {
141 clock_device_.reset(new FakeClockDevice); 119 DCHECK(!audio_decoder_);
142 return clock_device_.get(); 120 audio_decoder_ = new FakeAudioDecoder();
121 return audio_decoder_;
143 } 122 }
144 AudioPipelineDevice* GetAudio() override { 123 VideoDecoder* CreateVideoDecoder() override {
145 if (!audio_device_)
146 audio_device_.reset(new FakeAudioPipelineDevice);
147 return audio_device_.get();
148 }
149 VideoPipelineDevice* GetVideo() override {
150 NOTREACHED(); 124 NOTREACHED();
151 return nullptr; 125 return nullptr;
152 } 126 }
153 127
128 bool Initialize(Delegate* delegate) override {
129 audio_decoder_->set_delegate(delegate);
130 return true;
131 }
132 bool Start(int64_t start_pts) override {
133 DCHECK(state_ == kStateStopped);
134 state_ = kStateRunning;
135 return true;
136 }
137 bool Stop() override {
138 state_ = kStateStopped;
139 return true;
140 }
141 bool Pause() override {
142 DCHECK(state_ == kStateRunning);
143 state_ = kStatePaused;
144 return true;
145 }
146 bool Resume() override {
147 DCHECK(state_ == kStatePaused);
148 state_ = kStateRunning;
149 return true;
150 }
151 int64_t GetCurrentPts() override { return 0; }
152 bool SetPlaybackRate(float rate) override { return true; }
153
154 State state() const { return state_; }
155 FakeAudioDecoder* decoder() const { return audio_decoder_; }
156
154 private: 157 private:
155 scoped_ptr<FakeClockDevice> clock_device_; 158 State state_;
156 scoped_ptr<FakeAudioPipelineDevice> audio_device_; 159 FakeAudioDecoder* audio_decoder_;
157 }; 160 };
158 161
159 class FakeAudioSourceCallback 162 class FakeAudioSourceCallback
160 : public ::media::AudioOutputStream::AudioSourceCallback { 163 : public ::media::AudioOutputStream::AudioSourceCallback {
161 public: 164 public:
162 FakeAudioSourceCallback() : error_(false) {} 165 FakeAudioSourceCallback() : error_(false) {}
163 166
164 bool error() const { return error_; } 167 bool error() const { return error_; }
165 168
166 // ::media::AudioOutputStream::AudioSourceCallback overrides. 169 // ::media::AudioOutputStream::AudioSourceCallback overrides.
(...skipping 13 matching lines...) Expand all
180 FakeAudioManager() 183 FakeAudioManager()
181 : CastAudioManager(nullptr), media_pipeline_backend_(nullptr) {} 184 : CastAudioManager(nullptr), media_pipeline_backend_(nullptr) {}
182 ~FakeAudioManager() override {} 185 ~FakeAudioManager() override {}
183 186
184 // CastAudioManager overrides. 187 // CastAudioManager overrides.
185 scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend( 188 scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
186 const MediaPipelineDeviceParams& params) override { 189 const MediaPipelineDeviceParams& params) override {
187 DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread()); 190 DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
188 DCHECK(!media_pipeline_backend_); 191 DCHECK(!media_pipeline_backend_);
189 192
190 scoped_ptr<FakeMediaPipelineBackend> backend(new FakeMediaPipelineBackend); 193 scoped_ptr<FakeMediaPipelineBackend> backend(
194 new FakeMediaPipelineBackend());
191 // Cache the backend locally to be used by tests. 195 // Cache the backend locally to be used by tests.
192 media_pipeline_backend_ = backend.get(); 196 media_pipeline_backend_ = backend.get();
193 return backend.Pass(); 197 return backend.Pass();
194 } 198 }
195 void ReleaseOutputStream(::media::AudioOutputStream* stream) override { 199 void ReleaseOutputStream(::media::AudioOutputStream* stream) override {
196 DCHECK(media_pipeline_backend_); 200 DCHECK(media_pipeline_backend_);
197 media_pipeline_backend_ = nullptr; 201 media_pipeline_backend_ = nullptr;
198 CastAudioManager::ReleaseOutputStream(stream); 202 CastAudioManager::ReleaseOutputStream(stream);
199 } 203 }
200 204
(...skipping 28 matching lines...) Expand all
229 } 233 }
230 234
231 void TearDown() override { 235 void TearDown() override {
232 audio_manager_.reset(); 236 audio_manager_.reset();
233 } 237 }
234 238
235 ::media::AudioParameters GetAudioParams() { 239 ::media::AudioParameters GetAudioParams() {
236 return ::media::AudioParameters(format_, channel_layout_, sample_rate_, 240 return ::media::AudioParameters(format_, channel_layout_, sample_rate_,
237 bits_per_sample_, frames_per_buffer_); 241 bits_per_sample_, frames_per_buffer_);
238 } 242 }
239 FakeClockDevice* GetClock() { 243
240 MediaPipelineBackend* backend = audio_manager_->media_pipeline_backend(); 244 FakeMediaPipelineBackend* GetBackend() {
241 return backend ? static_cast<FakeClockDevice*>(backend->GetClock()) 245 return audio_manager_->media_pipeline_backend();
242 : nullptr;
243 } 246 }
244 FakeAudioPipelineDevice* GetAudio() { 247
245 MediaPipelineBackend* backend = audio_manager_->media_pipeline_backend(); 248 FakeAudioDecoder* GetAudio() {
246 return backend ? static_cast<FakeAudioPipelineDevice*>(backend->GetAudio()) 249 FakeMediaPipelineBackend* backend = GetBackend();
247 : nullptr; 250 return (backend ? backend->decoder() : nullptr);
248 } 251 }
249 252
250 // Synchronous utility functions. 253 // Synchronous utility functions.
251 ::media::AudioOutputStream* CreateStream() { 254 ::media::AudioOutputStream* CreateStream() {
252 ::media::AudioOutputStream* stream = nullptr; 255 ::media::AudioOutputStream* stream = nullptr;
253 256
254 base::WaitableEvent completion_event(false, false); 257 base::WaitableEvent completion_event(false, false);
255 audio_task_runner_->PostTask( 258 audio_task_runner_->PostTask(
256 FROM_HERE, 259 FROM_HERE,
257 base::Bind(&CastAudioOutputStreamTest::CreateStreamOnAudioThread, 260 base::Bind(&CastAudioOutputStreamTest::CreateStreamOnAudioThread,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 TEST_F(CastAudioOutputStreamTest, Format) { 369 TEST_F(CastAudioOutputStreamTest, Format) {
367 ::media::AudioParameters::Format format[] = { 370 ::media::AudioParameters::Format format[] = {
368 //::media::AudioParameters::AUDIO_PCM_LINEAR, 371 //::media::AudioParameters::AUDIO_PCM_LINEAR,
369 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY}; 372 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY};
370 for (size_t i = 0; i < arraysize(format); ++i) { 373 for (size_t i = 0; i < arraysize(format); ++i) {
371 format_ = format[i]; 374 format_ = format[i];
372 ::media::AudioOutputStream* stream = CreateStream(); 375 ::media::AudioOutputStream* stream = CreateStream();
373 ASSERT_TRUE(stream); 376 ASSERT_TRUE(stream);
374 EXPECT_TRUE(OpenStream(stream)); 377 EXPECT_TRUE(OpenStream(stream));
375 378
376 FakeAudioPipelineDevice* audio_device = GetAudio(); 379 FakeAudioDecoder* audio_decoder = GetAudio();
377 ASSERT_TRUE(audio_device); 380 ASSERT_TRUE(audio_decoder);
378 const AudioConfig& audio_config = audio_device->config(); 381 const AudioConfig& audio_config = audio_decoder->config();
379 EXPECT_EQ(kCodecPCM, audio_config.codec); 382 EXPECT_EQ(kCodecPCM, audio_config.codec);
380 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format); 383 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format);
381 EXPECT_FALSE(audio_config.is_encrypted); 384 EXPECT_FALSE(audio_config.is_encrypted);
382 385
383 CloseStream(stream); 386 CloseStream(stream);
384 } 387 }
385 } 388 }
386 389
387 TEST_F(CastAudioOutputStreamTest, ChannelLayout) { 390 TEST_F(CastAudioOutputStreamTest, ChannelLayout) {
388 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO, 391 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO,
389 ::media::CHANNEL_LAYOUT_STEREO}; 392 ::media::CHANNEL_LAYOUT_STEREO};
390 for (size_t i = 0; i < arraysize(layout); ++i) { 393 for (size_t i = 0; i < arraysize(layout); ++i) {
391 channel_layout_ = layout[i]; 394 channel_layout_ = layout[i];
392 ::media::AudioOutputStream* stream = CreateStream(); 395 ::media::AudioOutputStream* stream = CreateStream();
393 ASSERT_TRUE(stream); 396 ASSERT_TRUE(stream);
394 EXPECT_TRUE(OpenStream(stream)); 397 EXPECT_TRUE(OpenStream(stream));
395 398
396 FakeAudioPipelineDevice* audio_device = GetAudio(); 399 FakeAudioDecoder* audio_decoder = GetAudio();
397 ASSERT_TRUE(audio_device); 400 ASSERT_TRUE(audio_decoder);
398 const AudioConfig& audio_config = audio_device->config(); 401 const AudioConfig& audio_config = audio_decoder->config();
399 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_), 402 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_),
400 audio_config.channel_number); 403 audio_config.channel_number);
401 404
402 CloseStream(stream); 405 CloseStream(stream);
403 } 406 }
404 } 407 }
405 408
406 TEST_F(CastAudioOutputStreamTest, SampleRate) { 409 TEST_F(CastAudioOutputStreamTest, SampleRate) {
407 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate; 410 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate;
408 ::media::AudioOutputStream* stream = CreateStream(); 411 ::media::AudioOutputStream* stream = CreateStream();
409 ASSERT_TRUE(stream); 412 ASSERT_TRUE(stream);
410 EXPECT_TRUE(OpenStream(stream)); 413 EXPECT_TRUE(OpenStream(stream));
411 414
412 FakeAudioPipelineDevice* audio_device = GetAudio(); 415 FakeAudioDecoder* audio_decoder = GetAudio();
413 ASSERT_TRUE(audio_device); 416 ASSERT_TRUE(audio_decoder);
414 const AudioConfig& audio_config = audio_device->config(); 417 const AudioConfig& audio_config = audio_decoder->config();
415 EXPECT_EQ(sample_rate_, audio_config.samples_per_second); 418 EXPECT_EQ(sample_rate_, audio_config.samples_per_second);
416 419
417 CloseStream(stream); 420 CloseStream(stream);
418 } 421 }
419 422
420 TEST_F(CastAudioOutputStreamTest, BitsPerSample) { 423 TEST_F(CastAudioOutputStreamTest, BitsPerSample) {
421 bits_per_sample_ = 16; 424 bits_per_sample_ = 16;
422 ::media::AudioOutputStream* stream = CreateStream(); 425 ::media::AudioOutputStream* stream = CreateStream();
423 ASSERT_TRUE(stream); 426 ASSERT_TRUE(stream);
424 EXPECT_TRUE(OpenStream(stream)); 427 EXPECT_TRUE(OpenStream(stream));
425 428
426 FakeAudioPipelineDevice* audio_device = GetAudio(); 429 FakeAudioDecoder* audio_decoder = GetAudio();
427 ASSERT_TRUE(audio_device); 430 ASSERT_TRUE(audio_decoder);
428 const AudioConfig& audio_config = audio_device->config(); 431 const AudioConfig& audio_config = audio_decoder->config();
429 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel); 432 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel);
430 433
431 CloseStream(stream); 434 CloseStream(stream);
432 } 435 }
433 436
434 TEST_F(CastAudioOutputStreamTest, DeviceState) { 437 TEST_F(CastAudioOutputStreamTest, DeviceState) {
435 ::media::AudioOutputStream* stream = CreateStream(); 438 ::media::AudioOutputStream* stream = CreateStream();
436 ASSERT_TRUE(stream); 439 ASSERT_TRUE(stream);
437 EXPECT_FALSE(GetAudio()); 440 EXPECT_FALSE(GetAudio());
438 441
439 EXPECT_TRUE(OpenStream(stream)); 442 EXPECT_TRUE(OpenStream(stream));
440 AudioPipelineDevice* audio_device = GetAudio(); 443 FakeAudioDecoder* audio_decoder = GetAudio();
441 ASSERT_TRUE(audio_device); 444 ASSERT_TRUE(audio_decoder);
442 FakeClockDevice* clock_device = GetClock(); 445 FakeMediaPipelineBackend* backend = GetBackend();
443 ASSERT_TRUE(clock_device); 446 ASSERT_TRUE(backend);
444 EXPECT_EQ(AudioPipelineDevice::kStateIdle, audio_device->GetState()); 447 EXPECT_EQ(FakeMediaPipelineBackend::kStateStopped, backend->state());
445 EXPECT_EQ(MediaClockDevice::kStateIdle, clock_device->GetState());
446 EXPECT_EQ(1.f, clock_device->rate());
447 448
448 scoped_ptr<FakeAudioSourceCallback> source_callback( 449 scoped_ptr<FakeAudioSourceCallback> source_callback(
449 new FakeAudioSourceCallback); 450 new FakeAudioSourceCallback);
450 StartStream(stream, source_callback.get()); 451 StartStream(stream, source_callback.get());
451 EXPECT_EQ(AudioPipelineDevice::kStateRunning, audio_device->GetState()); 452 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, backend->state());
452 EXPECT_EQ(MediaClockDevice::kStateRunning, clock_device->GetState());
453 EXPECT_EQ(1.f, clock_device->rate());
454 453
455 StopStream(stream); 454 StopStream(stream);
456 EXPECT_EQ(AudioPipelineDevice::kStateRunning, audio_device->GetState()); 455 EXPECT_EQ(FakeMediaPipelineBackend::kStatePaused, backend->state());
457 EXPECT_EQ(MediaClockDevice::kStateRunning, clock_device->GetState());
458 EXPECT_EQ(0.f, clock_device->rate());
459 456
460 CloseStream(stream); 457 CloseStream(stream);
461 EXPECT_FALSE(GetAudio()); 458 EXPECT_FALSE(GetAudio());
462 } 459 }
463 460
464 TEST_F(CastAudioOutputStreamTest, PushFrame) { 461 TEST_F(CastAudioOutputStreamTest, PushFrame) {
465 ::media::AudioOutputStream* stream = CreateStream(); 462 ::media::AudioOutputStream* stream = CreateStream();
466 ASSERT_TRUE(stream); 463 ASSERT_TRUE(stream);
467 EXPECT_TRUE(OpenStream(stream)); 464 EXPECT_TRUE(OpenStream(stream));
468 465
469 FakeAudioPipelineDevice* audio_device = GetAudio(); 466 FakeAudioDecoder* audio_decoder = GetAudio();
470 ASSERT_TRUE(audio_device); 467 ASSERT_TRUE(audio_decoder);
471 // Verify initial state. 468 // Verify initial state.
472 EXPECT_EQ(0u, audio_device->pushed_frame_count()); 469 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count());
473 EXPECT_FALSE(audio_device->last_frame_decrypt_context()); 470 EXPECT_FALSE(audio_decoder->last_decrypt_context());
474 EXPECT_FALSE(audio_device->last_frame_buffer()); 471 EXPECT_FALSE(audio_decoder->last_buffer());
475 EXPECT_FALSE(audio_device->last_frame_completion_cb());
476 472
477 scoped_ptr<FakeAudioSourceCallback> source_callback( 473 scoped_ptr<FakeAudioSourceCallback> source_callback(
478 new FakeAudioSourceCallback); 474 new FakeAudioSourceCallback);
479 StartStream(stream, source_callback.get()); 475 StartStream(stream, source_callback.get());
480 StopStream(stream); 476 StopStream(stream);
481 477
482 // Verify that the stream pushed frames to the backend. 478 // Verify that the stream pushed frames to the backend.
483 EXPECT_LT(0u, audio_device->pushed_frame_count()); 479 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
484 // DecryptContext is always NULL becuase of "raw" audio. 480 // DecryptContext is always NULL becuase of "raw" audio.
485 EXPECT_FALSE(audio_device->last_frame_decrypt_context()); 481 EXPECT_FALSE(audio_decoder->last_decrypt_context());
486 EXPECT_TRUE(audio_device->last_frame_buffer()); 482 EXPECT_TRUE(audio_decoder->last_buffer());
487 EXPECT_TRUE(audio_device->last_frame_completion_cb());
488 483
489 // Verify decoder buffer. 484 // Verify decoder buffer.
490 ::media::AudioParameters audio_params = GetAudioParams(); 485 ::media::AudioParameters audio_params = GetAudioParams();
491 const size_t expected_frame_size = 486 const size_t expected_frame_size =
492 static_cast<size_t>(audio_params.GetBytesPerBuffer()); 487 static_cast<size_t>(audio_params.GetBytesPerBuffer());
493 const CastDecoderBuffer* buffer = audio_device->last_frame_buffer(); 488 const CastDecoderBuffer* buffer = audio_decoder->last_buffer();
494 EXPECT_TRUE(buffer->data()); 489 EXPECT_TRUE(buffer->data());
495 EXPECT_EQ(expected_frame_size, buffer->data_size()); 490 EXPECT_EQ(expected_frame_size, buffer->data_size());
496 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio. 491 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio.
497 EXPECT_FALSE(buffer->end_of_stream()); 492 EXPECT_FALSE(buffer->end_of_stream());
498 493
499 // No error must be reported to source callback. 494 // No error must be reported to source callback.
500 EXPECT_FALSE(source_callback->error()); 495 EXPECT_FALSE(source_callback->error());
501 496
502 CloseStream(stream); 497 CloseStream(stream);
503 } 498 }
504 499
505 TEST_F(CastAudioOutputStreamTest, DeviceBusy) { 500 TEST_F(CastAudioOutputStreamTest, DeviceBusy) {
506 ::media::AudioOutputStream* stream = CreateStream(); 501 ::media::AudioOutputStream* stream = CreateStream();
507 ASSERT_TRUE(stream); 502 ASSERT_TRUE(stream);
508 EXPECT_TRUE(OpenStream(stream)); 503 EXPECT_TRUE(OpenStream(stream));
509 504
510 FakeAudioPipelineDevice* audio_device = GetAudio(); 505 FakeAudioDecoder* audio_decoder = GetAudio();
511 ASSERT_TRUE(audio_device); 506 ASSERT_TRUE(audio_decoder);
512 audio_device->set_pipeline_status( 507 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY);
513 FakeAudioPipelineDevice::PIPELINE_STATUS_BUSY);
514 508
515 scoped_ptr<FakeAudioSourceCallback> source_callback( 509 scoped_ptr<FakeAudioSourceCallback> source_callback(
516 new FakeAudioSourceCallback); 510 new FakeAudioSourceCallback);
517 StartStream(stream, source_callback.get()); 511 StartStream(stream, source_callback.get());
518 512
519 // Make sure that one frame was pushed. 513 // Make sure that one frame was pushed.
520 EXPECT_EQ(1u, audio_device->pushed_frame_count()); 514 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
521 // No error must be reported to source callback. 515 // No error must be reported to source callback.
522 EXPECT_FALSE(source_callback->error()); 516 EXPECT_FALSE(source_callback->error());
523 517
524 // Sleep for a few frames and verify that more frames were not pushed 518 // Sleep for a few frames and verify that more frames were not pushed
525 // because the backend device was busy. 519 // because the backend device was busy.
526 ::media::AudioParameters audio_params = GetAudioParams(); 520 ::media::AudioParameters audio_params = GetAudioParams();
527 base::TimeDelta pause = audio_params.GetBufferDuration() * 5; 521 base::TimeDelta pause = audio_params.GetBufferDuration() * 5;
528 base::PlatformThread::Sleep(pause); 522 base::PlatformThread::Sleep(pause);
529 RunUntilIdle(audio_task_runner_.get()); 523 RunUntilIdle(audio_task_runner_.get());
530 RunUntilIdle(backend_task_runner_.get()); 524 RunUntilIdle(backend_task_runner_.get());
531 EXPECT_EQ(1u, audio_device->pushed_frame_count()); 525 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
532 526
533 // Unblock the pipeline and verify that PushFrame resumes. 527 // Unblock the pipeline and verify that PushFrame resumes.
534 audio_device->set_pipeline_status( 528 // (have to post because this directly calls buffer complete)
535 FakeAudioPipelineDevice::PIPELINE_STATUS_OK); 529 backend_task_runner_->PostTask(
536 audio_device->last_frame_completion_cb()->Run( 530 FROM_HERE,
537 MediaComponentDevice::kFrameSuccess); 531 base::Bind(&FakeAudioDecoder::set_pipeline_status,
532 base::Unretained(audio_decoder),
533 FakeAudioDecoder::PIPELINE_STATUS_OK));
534
538 base::PlatformThread::Sleep(pause); 535 base::PlatformThread::Sleep(pause);
539 RunUntilIdle(audio_task_runner_.get()); 536 RunUntilIdle(audio_task_runner_.get());
540 RunUntilIdle(backend_task_runner_.get()); 537 RunUntilIdle(backend_task_runner_.get());
541 EXPECT_LT(1u, audio_device->pushed_frame_count()); 538 EXPECT_LT(1u, audio_decoder->pushed_buffer_count());
542 EXPECT_FALSE(source_callback->error()); 539 EXPECT_FALSE(source_callback->error());
543 540
544 StopStream(stream); 541 StopStream(stream);
545 CloseStream(stream); 542 CloseStream(stream);
546 } 543 }
547 544
548 TEST_F(CastAudioOutputStreamTest, DeviceError) { 545 TEST_F(CastAudioOutputStreamTest, DeviceError) {
549 ::media::AudioOutputStream* stream = CreateStream(); 546 ::media::AudioOutputStream* stream = CreateStream();
550 ASSERT_TRUE(stream); 547 ASSERT_TRUE(stream);
551 EXPECT_TRUE(OpenStream(stream)); 548 EXPECT_TRUE(OpenStream(stream));
552 549
553 FakeAudioPipelineDevice* audio_device = GetAudio(); 550 FakeAudioDecoder* audio_decoder = GetAudio();
554 ASSERT_TRUE(audio_device); 551 ASSERT_TRUE(audio_decoder);
555 audio_device->set_pipeline_status( 552 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR);
556 FakeAudioPipelineDevice::PIPELINE_STATUS_ERROR);
557 553
558 scoped_ptr<FakeAudioSourceCallback> source_callback( 554 scoped_ptr<FakeAudioSourceCallback> source_callback(
559 new FakeAudioSourceCallback); 555 new FakeAudioSourceCallback);
560 StartStream(stream, source_callback.get()); 556 StartStream(stream, source_callback.get());
561 557
562 // Make sure that AudioOutputStream attempted to push the initial frame. 558 // Make sure that AudioOutputStream attempted to push the initial frame.
563 EXPECT_LT(0u, audio_device->pushed_frame_count()); 559 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
564 // AudioOutputStream must report error to source callback. 560 // AudioOutputStream must report error to source callback.
565 EXPECT_TRUE(source_callback->error()); 561 EXPECT_TRUE(source_callback->error());
566 562
567 StopStream(stream); 563 StopStream(stream);
568 CloseStream(stream); 564 CloseStream(stream);
569 } 565 }
570 566
571 TEST_F(CastAudioOutputStreamTest, Volume) { 567 TEST_F(CastAudioOutputStreamTest, Volume) {
572 ::media::AudioOutputStream* stream = CreateStream(); 568 ::media::AudioOutputStream* stream = CreateStream();
573 ASSERT_TRUE(stream); 569 ASSERT_TRUE(stream);
574 ASSERT_TRUE(OpenStream(stream)); 570 ASSERT_TRUE(OpenStream(stream));
575 FakeAudioPipelineDevice* audio_device = GetAudio(); 571 FakeAudioDecoder* audio_decoder = GetAudio();
576 ASSERT_TRUE(audio_device); 572 ASSERT_TRUE(audio_decoder);
577 573
578 double volume = GetStreamVolume(stream); 574 double volume = GetStreamVolume(stream);
579 EXPECT_EQ(1.0, volume); 575 EXPECT_EQ(1.0, volume);
580 EXPECT_EQ(1.0f, audio_device->volume_multiplier()); 576 EXPECT_EQ(1.0f, audio_decoder->volume());
581 577
582 SetStreamVolume(stream, 0.5); 578 SetStreamVolume(stream, 0.5);
583 volume = GetStreamVolume(stream); 579 volume = GetStreamVolume(stream);
584 EXPECT_EQ(0.5, volume); 580 EXPECT_EQ(0.5, volume);
585 EXPECT_EQ(0.5f, audio_device->volume_multiplier()); 581 EXPECT_EQ(0.5f, audio_decoder->volume());
586 582
587 CloseStream(stream); 583 CloseStream(stream);
588 } 584 }
589 585
590 TEST_F(CastAudioOutputStreamTest, StartStopStart) { 586 TEST_F(CastAudioOutputStreamTest, StartStopStart) {
591 ::media::AudioOutputStream* stream = CreateStream(); 587 ::media::AudioOutputStream* stream = CreateStream();
592 ASSERT_TRUE(stream); 588 ASSERT_TRUE(stream);
593 ASSERT_TRUE(OpenStream(stream)); 589 ASSERT_TRUE(OpenStream(stream));
594 590
595 scoped_ptr<FakeAudioSourceCallback> source_callback( 591 scoped_ptr<FakeAudioSourceCallback> source_callback(
596 new FakeAudioSourceCallback); 592 new FakeAudioSourceCallback);
597 audio_task_runner_->PostTask( 593 audio_task_runner_->PostTask(
598 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, 594 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start,
599 base::Unretained(stream), source_callback.get())); 595 base::Unretained(stream), source_callback.get()));
600 audio_task_runner_->PostTask( 596 audio_task_runner_->PostTask(
601 FROM_HERE, 597 FROM_HERE,
602 base::Bind(&::media::AudioOutputStream::Stop, base::Unretained(stream))); 598 base::Bind(&::media::AudioOutputStream::Stop, base::Unretained(stream)));
603 audio_task_runner_->PostTask( 599 audio_task_runner_->PostTask(
604 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, 600 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start,
605 base::Unretained(stream), source_callback.get())); 601 base::Unretained(stream), source_callback.get()));
606 RunUntilIdle(audio_task_runner_.get()); 602 RunUntilIdle(audio_task_runner_.get());
607 RunUntilIdle(backend_task_runner_.get()); 603 RunUntilIdle(backend_task_runner_.get());
608 604
609 AudioPipelineDevice* audio_device = GetAudio(); 605 FakeAudioDecoder* audio_device = GetAudio();
610 FakeClockDevice* clock_device = GetClock(); 606 EXPECT_TRUE(audio_device);
611 ASSERT_TRUE(audio_device && clock_device); 607 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state());
612 EXPECT_EQ(AudioPipelineDevice::kStateRunning, audio_device->GetState());
613 EXPECT_EQ(MediaClockDevice::kStateRunning, clock_device->GetState());
614 EXPECT_EQ(1.f, clock_device->rate());
615 608
616 CloseStream(stream); 609 CloseStream(stream);
617 } 610 }
618 611
619 } // namespace 612 } // namespace
620 } // namespace media 613 } // namespace media
621 } // namespace chromecast 614 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/audio/cast_audio_output_stream.cc ('k') | chromecast/media/base/cast_media_default.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698