OLD | NEW |
---|---|
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, |
alokp
2015/10/14 23:16:52
this is not the right place to call the delegate.
kmackay
2015/10/15 00:35:54
It seems reasonable to me. Setting the pipeline st
| |
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_; |
halliwell
2015/10/14 15:02:37
nit: just use int (see https://google-styleguide.g
kmackay
2015/10/14 21:27:26
Done.
| |
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; } |
alokp
2015/10/14 23:16:52
add NOTREACHED
kmackay
2015/10/15 00:35:53
Done.
| |
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 13 matching lines...) Expand all Loading... | |
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( | 181 scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend( |
186 const MediaPipelineDeviceParams& params) override { | 182 const MediaPipelineDeviceParams& params) override { |
187 DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread()); | 183 DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread()); |
188 DCHECK(!media_pipeline_backend_); | 184 DCHECK(!media_pipeline_backend_); |
189 | 185 |
190 scoped_ptr<FakeMediaPipelineBackend> backend(new FakeMediaPipelineBackend); | 186 scoped_ptr<FakeMediaPipelineBackend> backend( |
187 new FakeMediaPipelineBackend()); | |
191 // Cache the backend locally to be used by tests. | 188 // Cache the backend locally to be used by tests. |
192 media_pipeline_backend_ = backend.get(); | 189 media_pipeline_backend_ = backend.get(); |
193 return backend.Pass(); | 190 return backend.Pass(); |
194 } | 191 } |
195 void ReleaseOutputStream(::media::AudioOutputStream* stream) override { | 192 void ReleaseOutputStream(::media::AudioOutputStream* stream) override { |
196 DCHECK(media_pipeline_backend_); | 193 DCHECK(media_pipeline_backend_); |
197 media_pipeline_backend_ = nullptr; | 194 media_pipeline_backend_ = nullptr; |
198 CastAudioManager::ReleaseOutputStream(stream); | 195 CastAudioManager::ReleaseOutputStream(stream); |
199 } | 196 } |
200 | 197 |
(...skipping 28 matching lines...) Expand all Loading... | |
229 } | 226 } |
230 | 227 |
231 void TearDown() override { | 228 void TearDown() override { |
232 audio_manager_.reset(); | 229 audio_manager_.reset(); |
233 } | 230 } |
234 | 231 |
235 ::media::AudioParameters GetAudioParams() { | 232 ::media::AudioParameters GetAudioParams() { |
236 return ::media::AudioParameters(format_, channel_layout_, sample_rate_, | 233 return ::media::AudioParameters(format_, channel_layout_, sample_rate_, |
237 bits_per_sample_, frames_per_buffer_); | 234 bits_per_sample_, frames_per_buffer_); |
238 } | 235 } |
239 FakeClockDevice* GetClock() { | 236 |
240 MediaPipelineBackend* backend = audio_manager_->media_pipeline_backend(); | 237 FakeMediaPipelineBackend* GetBackend() { |
241 return backend ? static_cast<FakeClockDevice*>(backend->GetClock()) | 238 return audio_manager_->media_pipeline_backend(); |
242 : nullptr; | |
243 } | 239 } |
244 FakeAudioPipelineDevice* GetAudio() { | 240 FakeAudioDecoder* GetAudio() { |
245 MediaPipelineBackend* backend = audio_manager_->media_pipeline_backend(); | 241 FakeMediaPipelineBackend* backend = GetBackend(); |
246 return backend ? static_cast<FakeAudioPipelineDevice*>(backend->GetAudio()) | 242 if (!backend) |
alokp
2015/10/14 23:16:52
nit: return backend ? backend->decoder() : nullptr
kmackay
2015/10/15 00:35:54
Done.
| |
247 : nullptr; | 243 return nullptr; |
244 return backend->decoder(); | |
248 } | 245 } |
249 | 246 |
250 // Synchronous utility functions. | 247 // Synchronous utility functions. |
251 ::media::AudioOutputStream* CreateStream() { | 248 ::media::AudioOutputStream* CreateStream() { |
252 ::media::AudioOutputStream* stream = nullptr; | 249 ::media::AudioOutputStream* stream = nullptr; |
253 | 250 |
254 base::WaitableEvent completion_event(false, false); | 251 base::WaitableEvent completion_event(false, false); |
255 audio_task_runner_->PostTask( | 252 audio_task_runner_->PostTask( |
256 FROM_HERE, | 253 FROM_HERE, |
257 base::Bind(&CastAudioOutputStreamTest::CreateStreamOnAudioThread, | 254 base::Bind(&CastAudioOutputStreamTest::CreateStreamOnAudioThread, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
366 TEST_F(CastAudioOutputStreamTest, Format) { | 363 TEST_F(CastAudioOutputStreamTest, Format) { |
367 ::media::AudioParameters::Format format[] = { | 364 ::media::AudioParameters::Format format[] = { |
368 //::media::AudioParameters::AUDIO_PCM_LINEAR, | 365 //::media::AudioParameters::AUDIO_PCM_LINEAR, |
369 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY}; | 366 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY}; |
370 for (size_t i = 0; i < arraysize(format); ++i) { | 367 for (size_t i = 0; i < arraysize(format); ++i) { |
371 format_ = format[i]; | 368 format_ = format[i]; |
372 ::media::AudioOutputStream* stream = CreateStream(); | 369 ::media::AudioOutputStream* stream = CreateStream(); |
373 ASSERT_TRUE(stream); | 370 ASSERT_TRUE(stream); |
374 EXPECT_TRUE(OpenStream(stream)); | 371 EXPECT_TRUE(OpenStream(stream)); |
375 | 372 |
376 FakeAudioPipelineDevice* audio_device = GetAudio(); | 373 FakeAudioDecoder* audio_decoder = GetAudio(); |
377 ASSERT_TRUE(audio_device); | 374 ASSERT_TRUE(audio_decoder); |
378 const AudioConfig& audio_config = audio_device->config(); | 375 const AudioConfig& audio_config = audio_decoder->config(); |
379 EXPECT_EQ(kCodecPCM, audio_config.codec); | 376 EXPECT_EQ(kCodecPCM, audio_config.codec); |
380 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format); | 377 EXPECT_EQ(kSampleFormatS16, audio_config.sample_format); |
381 EXPECT_FALSE(audio_config.is_encrypted); | 378 EXPECT_FALSE(audio_config.is_encrypted); |
382 | 379 |
383 CloseStream(stream); | 380 CloseStream(stream); |
384 } | 381 } |
385 } | 382 } |
386 | 383 |
387 TEST_F(CastAudioOutputStreamTest, ChannelLayout) { | 384 TEST_F(CastAudioOutputStreamTest, ChannelLayout) { |
388 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO, | 385 ::media::ChannelLayout layout[] = {::media::CHANNEL_LAYOUT_MONO, |
389 ::media::CHANNEL_LAYOUT_STEREO}; | 386 ::media::CHANNEL_LAYOUT_STEREO}; |
390 for (size_t i = 0; i < arraysize(layout); ++i) { | 387 for (size_t i = 0; i < arraysize(layout); ++i) { |
391 channel_layout_ = layout[i]; | 388 channel_layout_ = layout[i]; |
392 ::media::AudioOutputStream* stream = CreateStream(); | 389 ::media::AudioOutputStream* stream = CreateStream(); |
393 ASSERT_TRUE(stream); | 390 ASSERT_TRUE(stream); |
394 EXPECT_TRUE(OpenStream(stream)); | 391 EXPECT_TRUE(OpenStream(stream)); |
395 | 392 |
396 FakeAudioPipelineDevice* audio_device = GetAudio(); | 393 FakeAudioDecoder* audio_decoder = GetAudio(); |
397 ASSERT_TRUE(audio_device); | 394 ASSERT_TRUE(audio_decoder); |
398 const AudioConfig& audio_config = audio_device->config(); | 395 const AudioConfig& audio_config = audio_decoder->config(); |
399 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_), | 396 EXPECT_EQ(::media::ChannelLayoutToChannelCount(channel_layout_), |
400 audio_config.channel_number); | 397 audio_config.channel_number); |
401 | 398 |
402 CloseStream(stream); | 399 CloseStream(stream); |
403 } | 400 } |
404 } | 401 } |
405 | 402 |
406 TEST_F(CastAudioOutputStreamTest, SampleRate) { | 403 TEST_F(CastAudioOutputStreamTest, SampleRate) { |
407 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate; | 404 sample_rate_ = ::media::AudioParameters::kAudioCDSampleRate; |
408 ::media::AudioOutputStream* stream = CreateStream(); | 405 ::media::AudioOutputStream* stream = CreateStream(); |
409 ASSERT_TRUE(stream); | 406 ASSERT_TRUE(stream); |
410 EXPECT_TRUE(OpenStream(stream)); | 407 EXPECT_TRUE(OpenStream(stream)); |
411 | 408 |
412 FakeAudioPipelineDevice* audio_device = GetAudio(); | 409 FakeAudioDecoder* audio_decoder = GetAudio(); |
413 ASSERT_TRUE(audio_device); | 410 ASSERT_TRUE(audio_decoder); |
414 const AudioConfig& audio_config = audio_device->config(); | 411 const AudioConfig& audio_config = audio_decoder->config(); |
415 EXPECT_EQ(sample_rate_, audio_config.samples_per_second); | 412 EXPECT_EQ(sample_rate_, audio_config.samples_per_second); |
416 | 413 |
417 CloseStream(stream); | 414 CloseStream(stream); |
418 } | 415 } |
419 | 416 |
420 TEST_F(CastAudioOutputStreamTest, BitsPerSample) { | 417 TEST_F(CastAudioOutputStreamTest, BitsPerSample) { |
421 bits_per_sample_ = 16; | 418 bits_per_sample_ = 16; |
422 ::media::AudioOutputStream* stream = CreateStream(); | 419 ::media::AudioOutputStream* stream = CreateStream(); |
423 ASSERT_TRUE(stream); | 420 ASSERT_TRUE(stream); |
424 EXPECT_TRUE(OpenStream(stream)); | 421 EXPECT_TRUE(OpenStream(stream)); |
425 | 422 |
426 FakeAudioPipelineDevice* audio_device = GetAudio(); | 423 FakeAudioDecoder* audio_decoder = GetAudio(); |
427 ASSERT_TRUE(audio_device); | 424 ASSERT_TRUE(audio_decoder); |
428 const AudioConfig& audio_config = audio_device->config(); | 425 const AudioConfig& audio_config = audio_decoder->config(); |
429 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel); | 426 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel); |
430 | 427 |
431 CloseStream(stream); | 428 CloseStream(stream); |
432 } | 429 } |
433 | 430 |
434 TEST_F(CastAudioOutputStreamTest, DeviceState) { | 431 TEST_F(CastAudioOutputStreamTest, DeviceState) { |
435 ::media::AudioOutputStream* stream = CreateStream(); | 432 ::media::AudioOutputStream* stream = CreateStream(); |
436 ASSERT_TRUE(stream); | 433 ASSERT_TRUE(stream); |
437 EXPECT_FALSE(GetAudio()); | 434 EXPECT_FALSE(GetAudio()); |
438 | 435 |
439 EXPECT_TRUE(OpenStream(stream)); | 436 EXPECT_TRUE(OpenStream(stream)); |
440 AudioPipelineDevice* audio_device = GetAudio(); | 437 FakeAudioDecoder* audio_decoder = GetAudio(); |
441 ASSERT_TRUE(audio_device); | 438 ASSERT_TRUE(audio_decoder); |
442 FakeClockDevice* clock_device = GetClock(); | 439 FakeMediaPipelineBackend* backend = GetBackend(); |
443 ASSERT_TRUE(clock_device); | 440 ASSERT_TRUE(backend); |
444 EXPECT_EQ(AudioPipelineDevice::kStateIdle, audio_device->GetState()); | 441 EXPECT_EQ(backend->state(), FakeMediaPipelineBackend::kStateStopped); |
alokp
2015/10/14 23:16:52
This should be EXPECT_EQ(expectation, actual_value
kmackay
2015/10/15 00:35:54
Done.
| |
445 EXPECT_EQ(MediaClockDevice::kStateIdle, clock_device->GetState()); | |
446 EXPECT_EQ(1.f, clock_device->rate()); | |
447 | 442 |
448 scoped_ptr<FakeAudioSourceCallback> source_callback( | 443 scoped_ptr<FakeAudioSourceCallback> source_callback( |
449 new FakeAudioSourceCallback); | 444 new FakeAudioSourceCallback); |
450 StartStream(stream, source_callback.get()); | 445 StartStream(stream, source_callback.get()); |
451 EXPECT_EQ(AudioPipelineDevice::kStateRunning, audio_device->GetState()); | 446 EXPECT_EQ(backend->state(), FakeMediaPipelineBackend::kStateRunning); |
452 EXPECT_EQ(MediaClockDevice::kStateRunning, clock_device->GetState()); | |
453 EXPECT_EQ(1.f, clock_device->rate()); | |
454 | 447 |
455 StopStream(stream); | 448 StopStream(stream); |
456 EXPECT_EQ(AudioPipelineDevice::kStateRunning, audio_device->GetState()); | 449 EXPECT_EQ(backend->state(), FakeMediaPipelineBackend::kStatePaused); |
457 EXPECT_EQ(MediaClockDevice::kStateRunning, clock_device->GetState()); | |
458 EXPECT_EQ(0.f, clock_device->rate()); | |
459 | 450 |
460 CloseStream(stream); | 451 CloseStream(stream); |
461 EXPECT_FALSE(GetAudio()); | 452 EXPECT_FALSE(GetAudio()); |
462 } | 453 } |
463 | 454 |
464 TEST_F(CastAudioOutputStreamTest, PushFrame) { | 455 TEST_F(CastAudioOutputStreamTest, PushFrame) { |
465 ::media::AudioOutputStream* stream = CreateStream(); | 456 ::media::AudioOutputStream* stream = CreateStream(); |
466 ASSERT_TRUE(stream); | 457 ASSERT_TRUE(stream); |
467 EXPECT_TRUE(OpenStream(stream)); | 458 EXPECT_TRUE(OpenStream(stream)); |
468 | 459 |
469 FakeAudioPipelineDevice* audio_device = GetAudio(); | 460 FakeAudioDecoder* audio_decoder = GetAudio(); |
470 ASSERT_TRUE(audio_device); | 461 ASSERT_TRUE(audio_decoder); |
471 // Verify initial state. | 462 // Verify initial state. |
472 EXPECT_EQ(0u, audio_device->pushed_frame_count()); | 463 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count()); |
473 EXPECT_FALSE(audio_device->last_frame_decrypt_context()); | 464 EXPECT_FALSE(audio_decoder->last_decrypt_context()); |
474 EXPECT_FALSE(audio_device->last_frame_buffer()); | 465 EXPECT_FALSE(audio_decoder->last_buffer()); |
475 EXPECT_FALSE(audio_device->last_frame_completion_cb()); | |
476 | 466 |
477 scoped_ptr<FakeAudioSourceCallback> source_callback( | 467 scoped_ptr<FakeAudioSourceCallback> source_callback( |
478 new FakeAudioSourceCallback); | 468 new FakeAudioSourceCallback); |
479 StartStream(stream, source_callback.get()); | 469 StartStream(stream, source_callback.get()); |
480 StopStream(stream); | 470 StopStream(stream); |
481 | 471 |
482 // Verify that the stream pushed frames to the backend. | 472 // Verify that the stream pushed frames to the backend. |
483 EXPECT_LT(0u, audio_device->pushed_frame_count()); | 473 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); |
484 // DecryptContext is always NULL becuase of "raw" audio. | 474 // DecryptContext is always NULL becuase of "raw" audio. |
485 EXPECT_FALSE(audio_device->last_frame_decrypt_context()); | 475 EXPECT_FALSE(audio_decoder->last_decrypt_context()); |
486 EXPECT_TRUE(audio_device->last_frame_buffer()); | 476 EXPECT_TRUE(audio_decoder->last_buffer()); |
487 EXPECT_TRUE(audio_device->last_frame_completion_cb()); | |
488 | 477 |
489 // Verify decoder buffer. | 478 // Verify decoder buffer. |
490 ::media::AudioParameters audio_params = GetAudioParams(); | 479 ::media::AudioParameters audio_params = GetAudioParams(); |
491 const size_t expected_frame_size = | 480 const size_t expected_frame_size = |
492 static_cast<size_t>(audio_params.GetBytesPerBuffer()); | 481 static_cast<size_t>(audio_params.GetBytesPerBuffer()); |
493 const CastDecoderBuffer* buffer = audio_device->last_frame_buffer(); | 482 const CastDecoderBuffer* buffer = audio_decoder->last_buffer(); |
494 EXPECT_TRUE(buffer->data()); | 483 EXPECT_TRUE(buffer->data()); |
495 EXPECT_EQ(expected_frame_size, buffer->data_size()); | 484 EXPECT_EQ(expected_frame_size, buffer->data_size()); |
496 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio. | 485 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio. |
497 EXPECT_FALSE(buffer->end_of_stream()); | 486 EXPECT_FALSE(buffer->end_of_stream()); |
498 | 487 |
499 // No error must be reported to source callback. | 488 // No error must be reported to source callback. |
500 EXPECT_FALSE(source_callback->error()); | 489 EXPECT_FALSE(source_callback->error()); |
501 | 490 |
502 CloseStream(stream); | 491 CloseStream(stream); |
503 } | 492 } |
504 | 493 |
505 TEST_F(CastAudioOutputStreamTest, DeviceBusy) { | 494 TEST_F(CastAudioOutputStreamTest, DeviceBusy) { |
506 ::media::AudioOutputStream* stream = CreateStream(); | 495 ::media::AudioOutputStream* stream = CreateStream(); |
507 ASSERT_TRUE(stream); | 496 ASSERT_TRUE(stream); |
508 EXPECT_TRUE(OpenStream(stream)); | 497 EXPECT_TRUE(OpenStream(stream)); |
509 | 498 |
510 FakeAudioPipelineDevice* audio_device = GetAudio(); | 499 FakeAudioDecoder* audio_decoder = GetAudio(); |
511 ASSERT_TRUE(audio_device); | 500 ASSERT_TRUE(audio_decoder); |
512 audio_device->set_pipeline_status( | 501 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY); |
513 FakeAudioPipelineDevice::PIPELINE_STATUS_BUSY); | |
514 | 502 |
515 scoped_ptr<FakeAudioSourceCallback> source_callback( | 503 scoped_ptr<FakeAudioSourceCallback> source_callback( |
516 new FakeAudioSourceCallback); | 504 new FakeAudioSourceCallback); |
517 StartStream(stream, source_callback.get()); | 505 StartStream(stream, source_callback.get()); |
518 | 506 |
519 // Make sure that one frame was pushed. | 507 // Make sure that one frame was pushed. |
520 EXPECT_EQ(1u, audio_device->pushed_frame_count()); | 508 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); |
521 // No error must be reported to source callback. | 509 // No error must be reported to source callback. |
522 EXPECT_FALSE(source_callback->error()); | 510 EXPECT_FALSE(source_callback->error()); |
523 | 511 |
524 // Sleep for a few frames and verify that more frames were not pushed | 512 // Sleep for a few frames and verify that more frames were not pushed |
525 // because the backend device was busy. | 513 // because the backend device was busy. |
526 ::media::AudioParameters audio_params = GetAudioParams(); | 514 ::media::AudioParameters audio_params = GetAudioParams(); |
527 base::TimeDelta pause = audio_params.GetBufferDuration() * 5; | 515 base::TimeDelta pause = audio_params.GetBufferDuration() * 5; |
528 base::PlatformThread::Sleep(pause); | 516 base::PlatformThread::Sleep(pause); |
529 RunUntilIdle(audio_task_runner_.get()); | 517 RunUntilIdle(audio_task_runner_.get()); |
530 RunUntilIdle(backend_task_runner_.get()); | 518 RunUntilIdle(backend_task_runner_.get()); |
531 EXPECT_EQ(1u, audio_device->pushed_frame_count()); | 519 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); |
532 | 520 |
533 // Unblock the pipeline and verify that PushFrame resumes. | 521 // Unblock the pipeline and verify that PushFrame resumes. |
534 audio_device->set_pipeline_status( | 522 // (have to post because this directly calls buffer complete) |
alokp
2015/10/14 23:16:52
yeah you probably should not call buffer complete.
kmackay
2015/10/15 00:35:54
see comment above.
| |
535 FakeAudioPipelineDevice::PIPELINE_STATUS_OK); | 523 backend_task_runner_->PostTask( |
536 audio_device->last_frame_completion_cb()->Run( | 524 FROM_HERE, |
537 MediaComponentDevice::kFrameSuccess); | 525 base::Bind(&FakeAudioDecoder::set_pipeline_status, |
526 base::Unretained(audio_decoder), | |
527 FakeAudioDecoder::PIPELINE_STATUS_OK)); | |
528 | |
538 base::PlatformThread::Sleep(pause); | 529 base::PlatformThread::Sleep(pause); |
539 RunUntilIdle(audio_task_runner_.get()); | 530 RunUntilIdle(audio_task_runner_.get()); |
540 RunUntilIdle(backend_task_runner_.get()); | 531 RunUntilIdle(backend_task_runner_.get()); |
541 EXPECT_LT(1u, audio_device->pushed_frame_count()); | 532 EXPECT_LT(1u, audio_decoder->pushed_buffer_count()); |
542 EXPECT_FALSE(source_callback->error()); | 533 EXPECT_FALSE(source_callback->error()); |
543 | 534 |
544 StopStream(stream); | 535 StopStream(stream); |
545 CloseStream(stream); | 536 CloseStream(stream); |
546 } | 537 } |
547 | 538 |
548 TEST_F(CastAudioOutputStreamTest, DeviceError) { | 539 TEST_F(CastAudioOutputStreamTest, DeviceError) { |
549 ::media::AudioOutputStream* stream = CreateStream(); | 540 ::media::AudioOutputStream* stream = CreateStream(); |
550 ASSERT_TRUE(stream); | 541 ASSERT_TRUE(stream); |
551 EXPECT_TRUE(OpenStream(stream)); | 542 EXPECT_TRUE(OpenStream(stream)); |
552 | 543 |
553 FakeAudioPipelineDevice* audio_device = GetAudio(); | 544 FakeAudioDecoder* audio_decoder = GetAudio(); |
554 ASSERT_TRUE(audio_device); | 545 ASSERT_TRUE(audio_decoder); |
555 audio_device->set_pipeline_status( | 546 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR); |
556 FakeAudioPipelineDevice::PIPELINE_STATUS_ERROR); | |
557 | 547 |
558 scoped_ptr<FakeAudioSourceCallback> source_callback( | 548 scoped_ptr<FakeAudioSourceCallback> source_callback( |
559 new FakeAudioSourceCallback); | 549 new FakeAudioSourceCallback); |
560 StartStream(stream, source_callback.get()); | 550 StartStream(stream, source_callback.get()); |
561 | 551 |
562 // Make sure that AudioOutputStream attempted to push the initial frame. | 552 // Make sure that AudioOutputStream attempted to push the initial frame. |
563 EXPECT_LT(0u, audio_device->pushed_frame_count()); | 553 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); |
564 // AudioOutputStream must report error to source callback. | 554 // AudioOutputStream must report error to source callback. |
565 EXPECT_TRUE(source_callback->error()); | 555 EXPECT_TRUE(source_callback->error()); |
566 | 556 |
567 StopStream(stream); | 557 StopStream(stream); |
568 CloseStream(stream); | 558 CloseStream(stream); |
569 } | 559 } |
570 | 560 |
571 TEST_F(CastAudioOutputStreamTest, Volume) { | 561 TEST_F(CastAudioOutputStreamTest, Volume) { |
572 ::media::AudioOutputStream* stream = CreateStream(); | 562 ::media::AudioOutputStream* stream = CreateStream(); |
573 ASSERT_TRUE(stream); | 563 ASSERT_TRUE(stream); |
574 ASSERT_TRUE(OpenStream(stream)); | 564 ASSERT_TRUE(OpenStream(stream)); |
575 FakeAudioPipelineDevice* audio_device = GetAudio(); | 565 FakeAudioDecoder* audio_decoder = GetAudio(); |
576 ASSERT_TRUE(audio_device); | 566 ASSERT_TRUE(audio_decoder); |
577 | 567 |
578 double volume = GetStreamVolume(stream); | 568 double volume = GetStreamVolume(stream); |
579 EXPECT_EQ(1.0, volume); | 569 EXPECT_EQ(1.0, volume); |
580 EXPECT_EQ(1.0f, audio_device->volume_multiplier()); | 570 EXPECT_EQ(1.0f, audio_decoder->volume()); |
581 | 571 |
582 SetStreamVolume(stream, 0.5); | 572 SetStreamVolume(stream, 0.5); |
583 volume = GetStreamVolume(stream); | 573 volume = GetStreamVolume(stream); |
584 EXPECT_EQ(0.5, volume); | 574 EXPECT_EQ(0.5, volume); |
585 EXPECT_EQ(0.5f, audio_device->volume_multiplier()); | 575 EXPECT_EQ(0.5f, audio_decoder->volume()); |
586 | 576 |
587 CloseStream(stream); | 577 CloseStream(stream); |
588 } | 578 } |
589 | 579 |
590 TEST_F(CastAudioOutputStreamTest, StartStopStart) { | 580 TEST_F(CastAudioOutputStreamTest, StartStopStart) { |
591 ::media::AudioOutputStream* stream = CreateStream(); | 581 ::media::AudioOutputStream* stream = CreateStream(); |
592 ASSERT_TRUE(stream); | 582 ASSERT_TRUE(stream); |
593 ASSERT_TRUE(OpenStream(stream)); | 583 ASSERT_TRUE(OpenStream(stream)); |
594 | 584 |
595 scoped_ptr<FakeAudioSourceCallback> source_callback( | 585 scoped_ptr<FakeAudioSourceCallback> source_callback( |
596 new FakeAudioSourceCallback); | 586 new FakeAudioSourceCallback); |
597 audio_task_runner_->PostTask( | 587 audio_task_runner_->PostTask( |
598 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, | 588 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, |
599 base::Unretained(stream), source_callback.get())); | 589 base::Unretained(stream), source_callback.get())); |
600 audio_task_runner_->PostTask( | 590 audio_task_runner_->PostTask( |
601 FROM_HERE, | 591 FROM_HERE, |
602 base::Bind(&::media::AudioOutputStream::Stop, base::Unretained(stream))); | 592 base::Bind(&::media::AudioOutputStream::Stop, base::Unretained(stream))); |
603 audio_task_runner_->PostTask( | 593 audio_task_runner_->PostTask( |
604 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, | 594 FROM_HERE, base::Bind(&::media::AudioOutputStream::Start, |
605 base::Unretained(stream), source_callback.get())); | 595 base::Unretained(stream), source_callback.get())); |
606 RunUntilIdle(audio_task_runner_.get()); | 596 RunUntilIdle(audio_task_runner_.get()); |
607 RunUntilIdle(backend_task_runner_.get()); | 597 RunUntilIdle(backend_task_runner_.get()); |
608 | 598 |
609 AudioPipelineDevice* audio_device = GetAudio(); | 599 FakeAudioDecoder* audio_device = GetAudio(); |
610 FakeClockDevice* clock_device = GetClock(); | 600 EXPECT_TRUE(audio_device); |
alokp
2015/10/14 23:16:52
can we also check the state?
kmackay
2015/10/15 00:35:54
Done.
| |
611 ASSERT_TRUE(audio_device && clock_device); | |
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 | 601 |
616 CloseStream(stream); | 602 CloseStream(stream); |
617 } | 603 } |
618 | 604 |
619 } // namespace | 605 } // namespace |
620 } // namespace media | 606 } // namespace media |
621 } // namespace chromecast | 607 } // namespace chromecast |
OLD | NEW |