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

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

Issue 2879703003: [chromecast] Moves CastAudioOutputStream::Backend to CMA thread. (Closed)
Patch Set: addressed comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chromecast/media/audio/cast_audio_output_stream.cc ('k') | chromecast/media/cma/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/audio/cast_audio_output_stream.h" 5 #include "chromecast/media/audio/cast_audio_output_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "chromecast/base/metrics/cast_metrics_test_helper.h" 16 #include "chromecast/base/metrics/cast_metrics_test_helper.h"
17 #include "chromecast/media/audio/cast_audio_manager.h" 17 #include "chromecast/media/audio/cast_audio_manager.h"
18 #include "chromecast/media/audio/cast_audio_mixer.h"
19 #include "chromecast/media/cma/test/mock_media_pipeline_backend_factory.h"
18 #include "chromecast/public/media/cast_decoder_buffer.h" 20 #include "chromecast/public/media/cast_decoder_buffer.h"
19 #include "chromecast/public/media/media_pipeline_backend.h" 21 #include "chromecast/public/media/media_pipeline_backend.h"
22 #include "chromecast/public/task_runner.h"
23 #include "media/audio/mock_audio_source_callback.h"
20 #include "media/audio/test_audio_thread.h" 24 #include "media/audio/test_audio_thread.h"
21 #include "testing/gmock/include/gmock/gmock.h" 25 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
23 27
24 using ::testing::Invoke; 28 using testing::_;
25 using ::testing::_; 29 using testing::Invoke;
30 using testing::NiceMock;
26 31
27 namespace chromecast { 32 namespace chromecast {
28 namespace media { 33 namespace media {
29 namespace { 34 namespace {
30 const char kDefaultDeviceId[] = ""; 35 const char kDefaultDeviceId[] = "";
31 const int64_t kDelayUs = 123; 36 const int64_t kDelayUs = 123;
32 const int64_t kDelayTimestampUs = 123456789; 37 const int64_t kDelayTimestampUs = 123456789;
33 38
34 int OnMoreData(base::TimeDelta /* delay */, 39 int OnMoreData(base::TimeDelta /* delay */,
35 base::TimeTicks /* delay_timestamp */, 40 base::TimeTicks /* delay_timestamp */,
36 int /* prior_frames_skipped */, 41 int /* prior_frames_skipped */,
37 ::media::AudioBus* dest) { 42 ::media::AudioBus* dest) {
38 dest->Zero(); 43 dest->Zero();
39 return dest->frames(); 44 return dest->frames();
40 } 45 }
41 46
47 class NotifyPushBufferCompleteTask : public chromecast::TaskRunner::Task {
48 public:
49 NotifyPushBufferCompleteTask(
50 MediaPipelineBackend::Decoder::Delegate* delegate)
51 : delegate_(delegate) {}
52 ~NotifyPushBufferCompleteTask() override = default;
53 void Run() override {
54 delegate_->OnPushBufferComplete(MediaPipelineBackend::kBufferSuccess);
55 }
56
57 private:
58 MediaPipelineBackend::Decoder::Delegate* const delegate_;
59 };
60
42 class FakeAudioDecoder : public MediaPipelineBackend::AudioDecoder { 61 class FakeAudioDecoder : public MediaPipelineBackend::AudioDecoder {
43 public: 62 public:
44 enum PipelineStatus { 63 enum PipelineStatus {
45 PIPELINE_STATUS_OK, 64 PIPELINE_STATUS_OK,
46 PIPELINE_STATUS_BUSY, 65 PIPELINE_STATUS_BUSY,
47 PIPELINE_STATUS_ERROR, 66 PIPELINE_STATUS_ERROR,
48 PIPELINE_STATUS_ASYNC_ERROR, 67 PIPELINE_STATUS_ASYNC_ERROR,
49 }; 68 };
50 69
51 FakeAudioDecoder() 70 FakeAudioDecoder(const MediaPipelineDeviceParams& params)
52 : volume_(1.0f), 71 : params_(params),
72 volume_(1.0f),
53 pipeline_status_(PIPELINE_STATUS_OK), 73 pipeline_status_(PIPELINE_STATUS_OK),
54 pending_push_(false), 74 pending_push_(false),
55 pushed_buffer_count_(0), 75 pushed_buffer_count_(0),
56 last_buffer_(nullptr), 76 last_buffer_(nullptr),
57 delegate_(nullptr) {} 77 delegate_(nullptr) {}
58 ~FakeAudioDecoder() override {} 78 ~FakeAudioDecoder() override {}
59 79
60 // MediaPipelineBackend::AudioDecoder implementation: 80 // MediaPipelineBackend::AudioDecoder implementation:
61 void SetDelegate(Delegate* delegate) override { 81 void SetDelegate(Delegate* delegate) override {
62 DCHECK(delegate); 82 DCHECK(delegate);
(...skipping 29 matching lines...) Expand all
92 volume_ = volume; 112 volume_ = volume;
93 return true; 113 return true;
94 } 114 }
95 RenderingDelay GetRenderingDelay() override { return rendering_delay_; } 115 RenderingDelay GetRenderingDelay() override { return rendering_delay_; }
96 116
97 const AudioConfig& config() const { return config_; } 117 const AudioConfig& config() const { return config_; }
98 float volume() const { return volume_; } 118 float volume() const { return volume_; }
99 void set_pipeline_status(PipelineStatus status) { 119 void set_pipeline_status(PipelineStatus status) {
100 if (status == PIPELINE_STATUS_OK && pending_push_) { 120 if (status == PIPELINE_STATUS_OK && pending_push_) {
101 pending_push_ = false; 121 pending_push_ = false;
102 delegate_->OnPushBufferComplete(MediaPipelineBackend::kBufferSuccess); 122 params_.task_runner->PostTask(new NotifyPushBufferCompleteTask(delegate_),
123 0);
103 } 124 }
104 pipeline_status_ = status; 125 pipeline_status_ = status;
105 } 126 }
106 void set_rendering_delay(RenderingDelay rendering_delay) { 127 void set_rendering_delay(RenderingDelay rendering_delay) {
107 rendering_delay_ = rendering_delay; 128 rendering_delay_ = rendering_delay;
108 } 129 }
109 unsigned pushed_buffer_count() const { return pushed_buffer_count_; } 130 unsigned pushed_buffer_count() const { return pushed_buffer_count_; }
110 CastDecoderBuffer* last_buffer() { return last_buffer_; } 131 CastDecoderBuffer* last_buffer() { return last_buffer_; }
111 132
112 private: 133 private:
134 const MediaPipelineDeviceParams params_;
113 AudioConfig config_; 135 AudioConfig config_;
114 float volume_; 136 float volume_;
115 137
116 PipelineStatus pipeline_status_; 138 PipelineStatus pipeline_status_;
117 bool pending_push_; 139 bool pending_push_;
118 int pushed_buffer_count_; 140 int pushed_buffer_count_;
119 CastDecoderBuffer* last_buffer_; 141 CastDecoderBuffer* last_buffer_;
120 Delegate* delegate_; 142 Delegate* delegate_;
121 RenderingDelay rendering_delay_; 143 RenderingDelay rendering_delay_;
122 }; 144 };
123 145
124 class FakeMediaPipelineBackend : public MediaPipelineBackend { 146 class FakeMediaPipelineBackend : public MediaPipelineBackend {
125 public: 147 public:
126 enum State { kStateStopped, kStateRunning, kStatePaused }; 148 enum State { kStateStopped, kStateRunning, kStatePaused };
127 149
128 FakeMediaPipelineBackend() : state_(kStateStopped), audio_decoder_(nullptr) {} 150 FakeMediaPipelineBackend(const MediaPipelineDeviceParams& params)
151 : params_(params), state_(kStateStopped), audio_decoder_(nullptr) {}
129 ~FakeMediaPipelineBackend() override {} 152 ~FakeMediaPipelineBackend() override {}
130 153
131 // MediaPipelineBackend implementation: 154 // MediaPipelineBackend implementation:
132 AudioDecoder* CreateAudioDecoder() override { 155 AudioDecoder* CreateAudioDecoder() override {
133 DCHECK(!audio_decoder_); 156 DCHECK(!audio_decoder_);
134 audio_decoder_ = base::MakeUnique<FakeAudioDecoder>(); 157 audio_decoder_ = base::MakeUnique<FakeAudioDecoder>(params_);
135 return audio_decoder_.get(); 158 return audio_decoder_.get();
136 } 159 }
137 VideoDecoder* CreateVideoDecoder() override { 160 VideoDecoder* CreateVideoDecoder() override {
138 NOTREACHED(); 161 NOTREACHED();
139 return nullptr; 162 return nullptr;
140 } 163 }
141 164
142 bool Initialize() override { return true; } 165 bool Initialize() override { return true; }
143 bool Start(int64_t start_pts) override { 166 bool Start(int64_t start_pts) override {
144 EXPECT_EQ(kStateStopped, state_); 167 EXPECT_EQ(kStateStopped, state_);
(...skipping 14 matching lines...) Expand all
159 state_ = kStateRunning; 182 state_ = kStateRunning;
160 return true; 183 return true;
161 } 184 }
162 int64_t GetCurrentPts() override { return 0; } 185 int64_t GetCurrentPts() override { return 0; }
163 bool SetPlaybackRate(float rate) override { return true; } 186 bool SetPlaybackRate(float rate) override { return true; }
164 187
165 State state() const { return state_; } 188 State state() const { return state_; }
166 FakeAudioDecoder* decoder() const { return audio_decoder_.get(); } 189 FakeAudioDecoder* decoder() const { return audio_decoder_.get(); }
167 190
168 private: 191 private:
192 const MediaPipelineDeviceParams params_;
169 State state_; 193 State state_;
170 std::unique_ptr<FakeAudioDecoder> audio_decoder_; 194 std::unique_ptr<FakeAudioDecoder> audio_decoder_;
171 }; 195 };
172 196
173 class MockAudioSourceCallback
174 : public ::media::AudioOutputStream::AudioSourceCallback {
175 public:
176 // ::media::AudioOutputStream::AudioSourceCallback overrides.
177 MOCK_METHOD4(OnMoreData,
178 int(base::TimeDelta, base::TimeTicks, int, ::media::AudioBus*));
179 MOCK_METHOD0(OnError, void());
180 };
181
182 class FakeAudioManager : public CastAudioManager {
183 public:
184 FakeAudioManager()
185 : CastAudioManager(base::MakeUnique<::media::TestAudioThread>(),
186 nullptr,
187 nullptr,
188 nullptr),
189 media_pipeline_backend_(nullptr) {}
190 ~FakeAudioManager() override {}
191
192 // CastAudioManager overrides.
193 std::unique_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
194 const MediaPipelineDeviceParams& params) override {
195 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
196 DCHECK(!media_pipeline_backend_);
197
198 std::unique_ptr<FakeMediaPipelineBackend> backend(
199 new FakeMediaPipelineBackend());
200 // Cache the backend locally to be used by tests.
201 media_pipeline_backend_ = backend.get();
202 return std::move(backend);
203 }
204 void ReleaseOutputStream(::media::AudioOutputStream* stream) override {
205 DCHECK(media_pipeline_backend_);
206 media_pipeline_backend_ = nullptr;
207 CastAudioManager::ReleaseOutputStream(stream);
208 }
209
210 // Returns the MediaPipelineBackend being used by the AudioOutputStream.
211 // Note: here is a valid MediaPipelineBackend only while the stream is open.
212 // Returns NULL at all other times.
213 FakeMediaPipelineBackend* media_pipeline_backend() {
214 return media_pipeline_backend_;
215 }
216
217 private:
218 FakeMediaPipelineBackend* media_pipeline_backend_;
219 };
220
221 class CastAudioOutputStreamTest : public ::testing::Test { 197 class CastAudioOutputStreamTest : public ::testing::Test {
222 public: 198 public:
223 CastAudioOutputStreamTest() 199 CastAudioOutputStreamTest()
224 : format_(::media::AudioParameters::AUDIO_PCM_LINEAR), 200 : media_thread_("CastMediaThread"),
201 media_pipeline_backend_(nullptr),
202 format_(::media::AudioParameters::AUDIO_PCM_LINEAR),
225 channel_layout_(::media::CHANNEL_LAYOUT_MONO), 203 channel_layout_(::media::CHANNEL_LAYOUT_MONO),
226 sample_rate_(::media::AudioParameters::kAudioCDSampleRate), 204 sample_rate_(::media::AudioParameters::kAudioCDSampleRate),
227 bits_per_sample_(16), 205 bits_per_sample_(16),
228 frames_per_buffer_(256) {} 206 frames_per_buffer_(256) {}
229 ~CastAudioOutputStreamTest() override {} 207 ~CastAudioOutputStreamTest() override {}
230 208
231 protected: 209 protected:
232 void SetUp() override { 210 void SetUp() override {
233 metrics::InitializeMetricsHelperForTesting(); 211 metrics::InitializeMetricsHelperForTesting();
234 audio_manager_ = base::MakeUnique<FakeAudioManager>(); 212
213 CHECK(media_thread_.Start());
214 auto backend_factory =
215 base::MakeUnique<NiceMock<MockMediaPipelineBackendFactory>>();
216 ON_CALL(*backend_factory, CreateBackend(_))
217 .WillByDefault(Invoke([this](const MediaPipelineDeviceParams& params) {
218 media_pipeline_backend_ = new FakeMediaPipelineBackend(params);
219 return base::WrapUnique(media_pipeline_backend_);
220 }));
221 audio_manager_ = base::MakeUnique<CastAudioManager>(
222 base::MakeUnique<::media::TestAudioThread>(), nullptr,
223 std::move(backend_factory), media_thread_.task_runner(), false);
235 } 224 }
236 225
237 void TearDown() override { audio_manager_->Shutdown(); } 226 void TearDown() override { audio_manager_->Shutdown(); }
238 227
239 ::media::AudioParameters GetAudioParams() { 228 ::media::AudioParameters GetAudioParams() {
240 return ::media::AudioParameters(format_, channel_layout_, sample_rate_, 229 return ::media::AudioParameters(format_, channel_layout_, sample_rate_,
241 bits_per_sample_, frames_per_buffer_); 230 bits_per_sample_, frames_per_buffer_);
242 } 231 }
243 232
244 FakeMediaPipelineBackend* GetBackend() { 233 FakeMediaPipelineBackend* GetBackend() { return media_pipeline_backend_; }
245 return audio_manager_->media_pipeline_backend();
246 }
247 234
248 FakeAudioDecoder* GetAudio() { 235 FakeAudioDecoder* GetAudio() {
249 FakeMediaPipelineBackend* backend = GetBackend(); 236 FakeMediaPipelineBackend* backend = GetBackend();
250 return (backend ? backend->decoder() : nullptr); 237 return (backend ? backend->decoder() : nullptr);
251 } 238 }
252 239
253 ::media::AudioOutputStream* CreateStream() { 240 ::media::AudioOutputStream* CreateStream() {
254 return audio_manager_->MakeAudioOutputStream( 241 return audio_manager_->MakeAudioOutputStream(
255 GetAudioParams(), kDefaultDeviceId, 242 GetAudioParams(), kDefaultDeviceId,
256 ::media::AudioManager::LogCallback()); 243 ::media::AudioManager::LogCallback());
257 } 244 }
258 245
259 // Runs the messsage loop for duration equivalent to the given number of 246 // Runs the messsage loop for duration equivalent to the given number of
260 // audio |frames|. 247 // audio |frames|.
261 void RunMessageLoopFor(int frames) { 248 void RunMessageLoopFor(int frames) {
262 ::media::AudioParameters audio_params = GetAudioParams(); 249 ::media::AudioParameters audio_params = GetAudioParams();
263 base::TimeDelta duration = audio_params.GetBufferDuration() * frames; 250 base::TimeDelta duration = audio_params.GetBufferDuration() * frames;
264 251
265 base::RunLoop run_loop; 252 base::RunLoop run_loop;
266 message_loop_.task_runner()->PostDelayedTask( 253 message_loop_.task_runner()->PostDelayedTask(
267 FROM_HERE, run_loop.QuitClosure(), duration); 254 FROM_HERE, run_loop.QuitClosure(), duration);
268 run_loop.Run(); 255 run_loop.Run();
269 } 256 }
270 257
271 base::MessageLoop message_loop_; 258 base::MessageLoop message_loop_;
272 std::unique_ptr<FakeAudioManager> audio_manager_; 259 base::Thread media_thread_;
260 std::unique_ptr<CastAudioManager> audio_manager_;
261 // MockMediaPipelineBackendFactory* backend_factory_;
262 FakeMediaPipelineBackend* media_pipeline_backend_;
273 // AudioParameters used to create AudioOutputStream. 263 // AudioParameters used to create AudioOutputStream.
274 // Tests can modify these parameters before calling CreateStream. 264 // Tests can modify these parameters before calling CreateStream.
275 ::media::AudioParameters::Format format_; 265 ::media::AudioParameters::Format format_;
276 ::media::ChannelLayout channel_layout_; 266 ::media::ChannelLayout channel_layout_;
277 int sample_rate_; 267 int sample_rate_;
278 int bits_per_sample_; 268 int bits_per_sample_;
279 int frames_per_buffer_; 269 int frames_per_buffer_;
280 }; 270 };
281 271
282 TEST_F(CastAudioOutputStreamTest, Format) { 272 TEST_F(CastAudioOutputStreamTest, Format) {
283 ::media::AudioParameters::Format format[] = { 273 ::media::AudioParameters::Format format[] = {
284 //::media::AudioParameters::AUDIO_PCM_LINEAR, 274 ::media::AudioParameters::AUDIO_PCM_LINEAR,
285 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY}; 275 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY};
286 for (size_t i = 0; i < arraysize(format); ++i) { 276 for (size_t i = 0; i < arraysize(format); ++i) {
287 format_ = format[i]; 277 format_ = format[i];
288 ::media::AudioOutputStream* stream = CreateStream(); 278 ::media::AudioOutputStream* stream = CreateStream();
289 ASSERT_TRUE(stream); 279 ASSERT_TRUE(stream);
290 EXPECT_TRUE(stream->Open()); 280 EXPECT_TRUE(stream->Open());
291 281
292 FakeAudioDecoder* audio_decoder = GetAudio(); 282 FakeAudioDecoder* audio_decoder = GetAudio();
293 ASSERT_TRUE(audio_decoder); 283 ASSERT_TRUE(audio_decoder);
294 const AudioConfig& audio_config = audio_decoder->config(); 284 const AudioConfig& audio_config = audio_decoder->config();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 ASSERT_TRUE(audio_decoder); 333 ASSERT_TRUE(audio_decoder);
344 const AudioConfig& audio_config = audio_decoder->config(); 334 const AudioConfig& audio_config = audio_decoder->config();
345 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel); 335 EXPECT_EQ(bits_per_sample_ / 8, audio_config.bytes_per_channel);
346 336
347 stream->Close(); 337 stream->Close();
348 } 338 }
349 339
350 TEST_F(CastAudioOutputStreamTest, DeviceState) { 340 TEST_F(CastAudioOutputStreamTest, DeviceState) {
351 ::media::AudioOutputStream* stream = CreateStream(); 341 ::media::AudioOutputStream* stream = CreateStream();
352 ASSERT_TRUE(stream); 342 ASSERT_TRUE(stream);
353 EXPECT_FALSE(GetAudio());
354 343
355 EXPECT_TRUE(stream->Open()); 344 EXPECT_TRUE(stream->Open());
356 FakeAudioDecoder* audio_decoder = GetAudio(); 345 FakeAudioDecoder* audio_decoder = GetAudio();
357 ASSERT_TRUE(audio_decoder); 346 ASSERT_TRUE(audio_decoder);
358 FakeMediaPipelineBackend* backend = GetBackend(); 347 FakeMediaPipelineBackend* backend = GetBackend();
359 ASSERT_TRUE(backend); 348 ASSERT_TRUE(backend);
360 EXPECT_EQ(FakeMediaPipelineBackend::kStateStopped, backend->state()); 349 EXPECT_EQ(FakeMediaPipelineBackend::kStateStopped, backend->state());
361 350
362 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 351 ::media::MockAudioSourceCallback source_callback;
363 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 352 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
364 .WillByDefault(Invoke(OnMoreData)); 353 .WillRepeatedly(Invoke(OnMoreData));
365 stream->Start(source_callback.get()); 354 stream->Start(&source_callback);
355 media_thread_.FlushForTesting();
366 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, backend->state()); 356 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, backend->state());
367 357
368 stream->Stop(); 358 stream->Stop();
359 media_thread_.FlushForTesting();
369 EXPECT_EQ(FakeMediaPipelineBackend::kStatePaused, backend->state()); 360 EXPECT_EQ(FakeMediaPipelineBackend::kStatePaused, backend->state());
370 361
371 stream->Close(); 362 stream->Close();
372 EXPECT_FALSE(GetAudio());
373 } 363 }
374 364
375 TEST_F(CastAudioOutputStreamTest, PushFrame) { 365 TEST_F(CastAudioOutputStreamTest, PushFrame) {
376 ::media::AudioOutputStream* stream = CreateStream(); 366 ::media::AudioOutputStream* stream = CreateStream();
377 ASSERT_TRUE(stream); 367 ASSERT_TRUE(stream);
378 EXPECT_TRUE(stream->Open()); 368 EXPECT_TRUE(stream->Open());
379 369
380 FakeAudioDecoder* audio_decoder = GetAudio(); 370 FakeAudioDecoder* audio_decoder = GetAudio();
381 ASSERT_TRUE(audio_decoder); 371 ASSERT_TRUE(audio_decoder);
382 // Verify initial state. 372 // Verify initial state.
383 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count()); 373 EXPECT_EQ(0u, audio_decoder->pushed_buffer_count());
384 EXPECT_FALSE(audio_decoder->last_buffer()); 374 EXPECT_FALSE(audio_decoder->last_buffer());
385 375
386 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 376 ::media::MockAudioSourceCallback source_callback;
387 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 377 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
388 .WillByDefault(Invoke(OnMoreData)); 378 .WillRepeatedly(Invoke(OnMoreData));
389 // No error must be reported to source callback. 379 // No error must be reported to source callback.
390 EXPECT_CALL(*source_callback, OnError()).Times(0); 380 EXPECT_CALL(source_callback, OnError()).Times(0);
391 stream->Start(source_callback.get()); 381 stream->Start(&source_callback);
392 RunMessageLoopFor(2); 382 RunMessageLoopFor(2);
393 stream->Stop(); 383 stream->Stop();
394 384
395 // Verify that the stream pushed frames to the backend. 385 // Verify that the stream pushed frames to the backend.
396 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); 386 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
397 EXPECT_TRUE(audio_decoder->last_buffer()); 387 EXPECT_TRUE(audio_decoder->last_buffer());
398 388
399 // Verify decoder buffer. 389 // Verify decoder buffer.
400 ::media::AudioParameters audio_params = GetAudioParams(); 390 ::media::AudioParameters audio_params = GetAudioParams();
401 const size_t expected_frame_size = 391 const size_t expected_frame_size =
402 static_cast<size_t>(audio_params.GetBytesPerBuffer()); 392 static_cast<size_t>(audio_params.GetBytesPerBuffer());
403 const CastDecoderBuffer* buffer = audio_decoder->last_buffer(); 393 const CastDecoderBuffer* buffer = audio_decoder->last_buffer();
404 EXPECT_TRUE(buffer->data()); 394 EXPECT_TRUE(buffer->data());
405 EXPECT_EQ(expected_frame_size, buffer->data_size()); 395 EXPECT_EQ(expected_frame_size, buffer->data_size());
406 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio. 396 EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio.
407 EXPECT_FALSE(buffer->end_of_stream()); 397 EXPECT_FALSE(buffer->end_of_stream());
408 398
409 stream->Close(); 399 stream->Close();
410 } 400 }
411 401
412 TEST_F(CastAudioOutputStreamTest, DeviceBusy) { 402 TEST_F(CastAudioOutputStreamTest, DeviceBusy) {
413 ::media::AudioOutputStream* stream = CreateStream(); 403 ::media::AudioOutputStream* stream = CreateStream();
414 ASSERT_TRUE(stream); 404 ASSERT_TRUE(stream);
415 EXPECT_TRUE(stream->Open()); 405 EXPECT_TRUE(stream->Open());
416 406
417 FakeAudioDecoder* audio_decoder = GetAudio(); 407 FakeAudioDecoder* audio_decoder = GetAudio();
418 ASSERT_TRUE(audio_decoder); 408 ASSERT_TRUE(audio_decoder);
419 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY); 409 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_BUSY);
420 410
421 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 411 ::media::MockAudioSourceCallback source_callback;
422 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 412 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
423 .WillByDefault(Invoke(OnMoreData)); 413 .WillRepeatedly(Invoke(OnMoreData));
424 // No error must be reported to source callback. 414 // No error must be reported to source callback.
425 EXPECT_CALL(*source_callback, OnError()).Times(0); 415 EXPECT_CALL(source_callback, OnError()).Times(0);
426 stream->Start(source_callback.get()); 416 stream->Start(&source_callback);
427 RunMessageLoopFor(5); 417 RunMessageLoopFor(5);
428 // Make sure that one frame was pushed. 418 // Make sure that one frame was pushed.
429 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 419 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
430 420
431 // Sleep for a few frames and verify that more frames were not pushed 421 // Sleep for a few frames and verify that more frames were not pushed
432 // because the backend device was busy. 422 // because the backend device was busy.
433 RunMessageLoopFor(5); 423 RunMessageLoopFor(5);
434 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 424 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
435 425
436 // Unblock the pipeline and verify that PushFrame resumes. 426 // Unblock the pipeline and verify that PushFrame resumes.
437 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_OK); 427 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_OK);
438 RunMessageLoopFor(5); 428 RunMessageLoopFor(5);
439 EXPECT_LT(1u, audio_decoder->pushed_buffer_count()); 429 EXPECT_LT(1u, audio_decoder->pushed_buffer_count());
440 430
441 stream->Stop(); 431 stream->Stop();
442 stream->Close(); 432 stream->Close();
443 } 433 }
444 434
445 TEST_F(CastAudioOutputStreamTest, DeviceError) { 435 TEST_F(CastAudioOutputStreamTest, DeviceError) {
446 ::media::AudioOutputStream* stream = CreateStream(); 436 ::media::AudioOutputStream* stream = CreateStream();
447 ASSERT_TRUE(stream); 437 ASSERT_TRUE(stream);
448 EXPECT_TRUE(stream->Open()); 438 EXPECT_TRUE(stream->Open());
449 439
450 FakeAudioDecoder* audio_decoder = GetAudio(); 440 FakeAudioDecoder* audio_decoder = GetAudio();
451 ASSERT_TRUE(audio_decoder); 441 ASSERT_TRUE(audio_decoder);
452 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR); 442 audio_decoder->set_pipeline_status(FakeAudioDecoder::PIPELINE_STATUS_ERROR);
453 443
454 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 444 ::media::MockAudioSourceCallback source_callback;
455 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 445 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
456 .WillByDefault(Invoke(OnMoreData)); 446 .WillRepeatedly(Invoke(OnMoreData));
457 // AudioOutputStream must report error to source callback. 447 // AudioOutputStream must report error to source callback.
458 EXPECT_CALL(*source_callback, OnError()); 448 EXPECT_CALL(source_callback, OnError());
459 stream->Start(source_callback.get()); 449 stream->Start(&source_callback);
460 RunMessageLoopFor(2); 450 RunMessageLoopFor(2);
461 // Make sure that AudioOutputStream attempted to push the initial frame. 451 // Make sure that AudioOutputStream attempted to push the initial frame.
462 EXPECT_LT(0u, audio_decoder->pushed_buffer_count()); 452 EXPECT_LT(0u, audio_decoder->pushed_buffer_count());
463 453
464 stream->Stop(); 454 stream->Stop();
465 stream->Close(); 455 stream->Close();
466 } 456 }
467 457
468 TEST_F(CastAudioOutputStreamTest, DeviceAsyncError) { 458 TEST_F(CastAudioOutputStreamTest, DeviceAsyncError) {
469 ::media::AudioOutputStream* stream = CreateStream(); 459 ::media::AudioOutputStream* stream = CreateStream();
470 ASSERT_TRUE(stream); 460 ASSERT_TRUE(stream);
471 EXPECT_TRUE(stream->Open()); 461 EXPECT_TRUE(stream->Open());
472 462
473 FakeAudioDecoder* audio_decoder = GetAudio(); 463 FakeAudioDecoder* audio_decoder = GetAudio();
474 ASSERT_TRUE(audio_decoder); 464 ASSERT_TRUE(audio_decoder);
475 audio_decoder->set_pipeline_status( 465 audio_decoder->set_pipeline_status(
476 FakeAudioDecoder::PIPELINE_STATUS_ASYNC_ERROR); 466 FakeAudioDecoder::PIPELINE_STATUS_ASYNC_ERROR);
477 467
478 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 468 ::media::MockAudioSourceCallback source_callback;
479 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 469 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
480 .WillByDefault(Invoke(OnMoreData)); 470 .WillRepeatedly(Invoke(OnMoreData));
481 // AudioOutputStream must report error to source callback. 471 // AudioOutputStream must report error to source callback.
482 EXPECT_CALL(*source_callback, OnError()); 472 EXPECT_CALL(source_callback, OnError());
483 stream->Start(source_callback.get()); 473 stream->Start(&source_callback);
484 RunMessageLoopFor(5); 474 RunMessageLoopFor(5);
485 475
486 // Make sure that one frame was pushed. 476 // Make sure that one frame was pushed.
487 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count()); 477 EXPECT_EQ(1u, audio_decoder->pushed_buffer_count());
488 478
489 stream->Stop(); 479 stream->Stop();
490 stream->Close(); 480 stream->Close();
491 } 481 }
492 482
493 TEST_F(CastAudioOutputStreamTest, Volume) { 483 TEST_F(CastAudioOutputStreamTest, Volume) {
494 ::media::AudioOutputStream* stream = CreateStream(); 484 ::media::AudioOutputStream* stream = CreateStream();
495 ASSERT_TRUE(stream); 485 ASSERT_TRUE(stream);
496 ASSERT_TRUE(stream->Open()); 486 ASSERT_TRUE(stream->Open());
497 FakeAudioDecoder* audio_decoder = GetAudio(); 487 FakeAudioDecoder* audio_decoder = GetAudio();
498 ASSERT_TRUE(audio_decoder); 488 ASSERT_TRUE(audio_decoder);
499 489
500 double volume = 0.0; 490 double volume = 0.0;
501 stream->GetVolume(&volume); 491 stream->GetVolume(&volume);
502 EXPECT_EQ(1.0, volume); 492 EXPECT_EQ(1.0, volume);
503 EXPECT_EQ(1.0f, audio_decoder->volume()); 493 EXPECT_EQ(1.0f, audio_decoder->volume());
504 494
505 stream->SetVolume(0.5); 495 stream->SetVolume(0.5);
496 media_thread_.FlushForTesting();
506 stream->GetVolume(&volume); 497 stream->GetVolume(&volume);
507 EXPECT_EQ(0.5, volume); 498 EXPECT_EQ(0.5, volume);
508 EXPECT_EQ(0.5f, audio_decoder->volume()); 499 EXPECT_EQ(0.5f, audio_decoder->volume());
509 500
510 stream->Close(); 501 stream->Close();
511 } 502 }
512 503
513 TEST_F(CastAudioOutputStreamTest, StartStopStart) { 504 TEST_F(CastAudioOutputStreamTest, StartStopStart) {
514 ::media::AudioOutputStream* stream = CreateStream(); 505 ::media::AudioOutputStream* stream = CreateStream();
515 ASSERT_TRUE(stream); 506 ASSERT_TRUE(stream);
516 ASSERT_TRUE(stream->Open()); 507 ASSERT_TRUE(stream->Open());
517 508
518 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 509 ::media::MockAudioSourceCallback source_callback;
519 ON_CALL(*source_callback, OnMoreData(_, _, _, _)) 510 EXPECT_CALL(source_callback, OnMoreData(_, _, _, _))
520 .WillByDefault(Invoke(OnMoreData)); 511 .WillRepeatedly(Invoke(OnMoreData));
521 stream->Start(source_callback.get()); 512 stream->Start(&source_callback);
522 RunMessageLoopFor(2); 513 RunMessageLoopFor(2);
523 stream->Stop(); 514 stream->Stop();
524 stream->Start(source_callback.get()); 515 stream->Start(&source_callback);
525 RunMessageLoopFor(2); 516 RunMessageLoopFor(2);
526 517
527 FakeAudioDecoder* audio_device = GetAudio(); 518 FakeAudioDecoder* audio_device = GetAudio();
528 EXPECT_TRUE(audio_device); 519 EXPECT_TRUE(audio_device);
529 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state()); 520 EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state());
530 521
531 stream->Close(); 522 stream->Close();
532 } 523 }
533 524
534 TEST_F(CastAudioOutputStreamTest, CloseWithoutStart) { 525 TEST_F(CastAudioOutputStreamTest, CloseWithoutStart) {
535 ::media::AudioOutputStream* stream = CreateStream(); 526 ::media::AudioOutputStream* stream = CreateStream();
536 ASSERT_TRUE(stream); 527 ASSERT_TRUE(stream);
537 ASSERT_TRUE(stream->Open()); 528 ASSERT_TRUE(stream->Open());
538 stream->Close(); 529 stream->Close();
539 } 530 }
540 531
541 TEST_F(CastAudioOutputStreamTest, AudioDelay) { 532 TEST_F(CastAudioOutputStreamTest, AudioDelay) {
542 ::media::AudioOutputStream* stream = CreateStream(); 533 ::media::AudioOutputStream* stream = CreateStream();
543 ASSERT_TRUE(stream); 534 ASSERT_TRUE(stream);
544 ASSERT_TRUE(stream->Open()); 535 ASSERT_TRUE(stream->Open());
545 536
546 FakeAudioDecoder* audio_decoder = GetAudio(); 537 FakeAudioDecoder* audio_decoder = GetAudio();
547 ASSERT_TRUE(audio_decoder); 538 ASSERT_TRUE(audio_decoder);
548 audio_decoder->set_rendering_delay( 539 audio_decoder->set_rendering_delay(
549 MediaPipelineBackend::AudioDecoder::RenderingDelay(kDelayUs, 540 MediaPipelineBackend::AudioDecoder::RenderingDelay(kDelayUs,
550 kDelayTimestampUs)); 541 kDelayTimestampUs));
551 542
552 auto source_callback(base::MakeUnique<MockAudioSourceCallback>()); 543 ::media::MockAudioSourceCallback source_callback;
553 const base::TimeDelta delay(base::TimeDelta::FromMicroseconds(kDelayUs)); 544 const base::TimeDelta delay(base::TimeDelta::FromMicroseconds(kDelayUs));
554 const base::TimeTicks delay_timestamp( 545 const base::TimeTicks delay_timestamp(
555 base::TimeTicks() + base::TimeDelta::FromMicroseconds(kDelayTimestampUs)); 546 base::TimeTicks() + base::TimeDelta::FromMicroseconds(kDelayTimestampUs));
556 EXPECT_CALL(*source_callback, OnMoreData(delay, delay_timestamp, _, _)) 547 EXPECT_CALL(source_callback, OnMoreData(delay, delay_timestamp, _, _))
557 .WillRepeatedly(Invoke(OnMoreData)); 548 .WillRepeatedly(Invoke(OnMoreData));
558 549
559 stream->Start(source_callback.get()); 550 stream->Start(&source_callback);
560 RunMessageLoopFor(2); 551 RunMessageLoopFor(2);
561 stream->Stop(); 552 stream->Stop();
562 stream->Close(); 553 stream->Close();
563 } 554 }
564 555
565 } // namespace 556 } // namespace
566 } // namespace media 557 } // namespace media
567 } // namespace chromecast 558 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/audio/cast_audio_output_stream.cc ('k') | chromecast/media/cma/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698