| 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, |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |