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

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

Powered by Google App Engine
This is Rietveld 408576698