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

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

Issue 2101303004: Pass delay and timestamp to AudioSourceCallback::OnMoreData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix Mac CQ errors. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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_mixer.h" 5 #include "chromecast/media/audio/cast_audio_mixer.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/time/time.h"
15 #include "chromecast/media/audio/cast_audio_manager.h" 16 #include "chromecast/media/audio/cast_audio_manager.h"
16 #include "chromecast/media/audio/cast_audio_output_stream.h" 17 #include "chromecast/media/audio/cast_audio_output_stream.h"
17 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
19 20
20 namespace chromecast { 21 namespace chromecast {
21 namespace media { 22 namespace media {
22 namespace { 23 namespace {
23 24
24 using ::testing::_; 25 using ::testing::_;
25 using ::testing::Invoke; 26 using ::testing::Invoke;
26 using ::testing::Return; 27 using ::testing::Return;
27 using ::testing::StrictMock; 28 using ::testing::StrictMock;
28 29
29 // Utility functions 30 // Utility functions
30 ::media::AudioParameters GetAudioParams() { 31 ::media::AudioParameters GetAudioParams() {
31 return ::media::AudioParameters( 32 return ::media::AudioParameters(
32 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, 33 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
33 ::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024); 34 ::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024);
34 } 35 }
35 36
36 // Mock implementations 37 // Mock implementations
37 class MockAudioSourceCallback 38 class MockAudioSourceCallback
38 : public ::media::AudioOutputStream::AudioSourceCallback { 39 : public ::media::AudioOutputStream::AudioSourceCallback {
39 public: 40 public:
40 MockAudioSourceCallback() { 41 MockAudioSourceCallback() {
41 ON_CALL(*this, OnMoreData(_, _, _)) 42 ON_CALL(*this, OnMoreData(_, _, _, _))
42 .WillByDefault(Invoke(this, &MockAudioSourceCallback::OnMoreDataImpl)); 43 .WillByDefault(Invoke(this, &MockAudioSourceCallback::OnMoreDataImpl));
43 } 44 }
44 45
45 MOCK_METHOD3(OnMoreData, 46 MOCK_METHOD4(OnMoreData,
46 int(::media::AudioBus* audio_bus, 47 int(base::TimeDelta, base::TimeTicks, int, ::media::AudioBus*));
47 uint32_t total_bytes_delay,
48 uint32_t frames_skipped));
49 MOCK_METHOD1(OnError, void(::media::AudioOutputStream* stream)); 48 MOCK_METHOD1(OnError, void(::media::AudioOutputStream* stream));
50 49
51 private: 50 private:
52 int OnMoreDataImpl(::media::AudioBus* audio_bus, 51 int OnMoreDataImpl(base::TimeDelta /* delay */,
53 uint32_t total_bytes_delay, 52 base::TimeTicks /* delay_timestamp */,
54 uint32_t frames_skipped) { 53 int /* prior_frames_skipped */,
55 audio_bus->Zero(); 54 ::media::AudioBus* dest) {
56 return audio_bus->frames(); 55 dest->Zero();
56 return dest->frames();
57 } 57 }
58 }; 58 };
59 59
60 class MockCastAudioOutputStream : public CastAudioOutputStream { 60 class MockCastAudioOutputStream : public CastAudioOutputStream {
61 public: 61 public:
62 MockCastAudioOutputStream(const ::media::AudioParameters& audio_params, 62 MockCastAudioOutputStream(const ::media::AudioParameters& audio_params,
63 CastAudioManager* audio_manager) 63 CastAudioManager* audio_manager)
64 : CastAudioOutputStream(audio_params, audio_manager) {} 64 : CastAudioOutputStream(audio_params, audio_manager) {}
65 65
66 MOCK_METHOD0(Open, bool()); 66 MOCK_METHOD0(Open, bool());
67 MOCK_METHOD0(Close, void()); 67 MOCK_METHOD0(Close, void());
68 MOCK_METHOD1(Start, void(AudioSourceCallback* source_callback)); 68 MOCK_METHOD1(Start, void(AudioSourceCallback* source_callback));
69 MOCK_METHOD0(Stop, void()); 69 MOCK_METHOD0(Stop, void());
70 MOCK_METHOD1(SetVolume, void(double volume)); 70 MOCK_METHOD1(SetVolume, void(double volume));
71 MOCK_METHOD1(GetVolume, void(double* volume)); 71 MOCK_METHOD1(GetVolume, void(double* volume));
72 72
73 void SignalPull(AudioSourceCallback* source_callback, 73 void SignalPull(AudioSourceCallback* source_callback, base::TimeDelta delay) {
74 uint32_t total_bytes_delay) {
75 std::unique_ptr<::media::AudioBus> audio_bus = 74 std::unique_ptr<::media::AudioBus> audio_bus =
76 ::media::AudioBus::Create(GetAudioParams()); 75 ::media::AudioBus::Create(GetAudioParams());
77 source_callback->OnMoreData(audio_bus.get(), total_bytes_delay, 0); 76 source_callback->OnMoreData(delay, base::TimeTicks::Now(), 0,
77 audio_bus.get());
78 } 78 }
79 79
80 void SignalError(AudioSourceCallback* source_callback) { 80 void SignalError(AudioSourceCallback* source_callback) {
81 source_callback->OnError(this); 81 source_callback->OnError(this);
82 } 82 }
83 }; 83 };
84 84
85 class MockCastAudioManager : public CastAudioManager { 85 class MockCastAudioManager : public CastAudioManager {
86 public: 86 public:
87 MockCastAudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner, 87 MockCastAudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
(...skipping 14 matching lines...) Expand all
102 MOCK_METHOD1(ReleaseOutputStream, void(::media::AudioOutputStream* stream)); 102 MOCK_METHOD1(ReleaseOutputStream, void(::media::AudioOutputStream* stream));
103 103
104 private: 104 private:
105 void ReleaseOutputStreamConcrete(::media::AudioOutputStream* stream) { 105 void ReleaseOutputStreamConcrete(::media::AudioOutputStream* stream) {
106 CastAudioManager::ReleaseOutputStream(stream); 106 CastAudioManager::ReleaseOutputStream(stream);
107 } 107 }
108 }; 108 };
109 109
110 class MockCastAudioMixer : public CastAudioMixer { 110 class MockCastAudioMixer : public CastAudioMixer {
111 public: 111 public:
112 MockCastAudioMixer(const RealStreamFactory& real_stream_factory) 112 explicit MockCastAudioMixer(const RealStreamFactory& real_stream_factory)
113 : CastAudioMixer(real_stream_factory) { 113 : CastAudioMixer(real_stream_factory) {
114 ON_CALL(*this, MakeStream(_, _)) 114 ON_CALL(*this, MakeStream(_, _))
115 .WillByDefault(Invoke(this, &MockCastAudioMixer::MakeStreamConcrete)); 115 .WillByDefault(Invoke(this, &MockCastAudioMixer::MakeStreamConcrete));
116 } 116 }
117 117
118 MOCK_METHOD2( 118 MOCK_METHOD2(
119 MakeStream, 119 MakeStream,
120 ::media::AudioOutputStream*(const ::media::AudioParameters& params, 120 ::media::AudioOutputStream*(const ::media::AudioParameters& params,
121 CastAudioManager* audio_manager)); 121 CastAudioManager* audio_manager));
122 122
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 streams[i]->Start(sources[i].get()); 288 streams[i]->Start(sources[i].get());
289 289
290 // Individually pull out streams 290 // Individually pull out streams
291 while (streams.size() > 1) { 291 while (streams.size() > 1) {
292 ::media::AudioOutputStream* stream = streams.front(); 292 ::media::AudioOutputStream* stream = streams.front();
293 stream->Stop(); 293 stream->Stop();
294 streams.erase(streams.begin()); 294 streams.erase(streams.begin());
295 sources.erase(sources.begin()); 295 sources.erase(sources.begin());
296 296
297 for (auto& source : sources) 297 for (auto& source : sources)
298 EXPECT_CALL(*source, OnMoreData(_, _, _)); 298 EXPECT_CALL(*source, OnMoreData(_, _, _, _));
299 mock_mixer_stream().SignalPull(&mock_mixer(), 0); 299 mock_mixer_stream().SignalPull(&mock_mixer(), base::TimeDelta());
300 300
301 EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream)); 301 EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream));
302 stream->Close(); 302 stream->Close();
303 } 303 }
304 304
305 EXPECT_CALL(mock_mixer_stream(), Stop()); 305 EXPECT_CALL(mock_mixer_stream(), Stop());
306 EXPECT_CALL(mock_mixer_stream(), Close()); 306 EXPECT_CALL(mock_mixer_stream(), Close());
307 EXPECT_CALL(mock_manager(), ReleaseOutputStream(streams.front())); 307 EXPECT_CALL(mock_manager(), ReleaseOutputStream(streams.front()));
308 streams.front()->Close(); 308 streams.front()->Close();
309 } 309 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 427
428 EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); 428 EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer()));
429 streams.front()->Start(&source); 429 streams.front()->Start(&source);
430 430
431 EXPECT_CALL(mock_mixer_stream(), Stop()); 431 EXPECT_CALL(mock_mixer_stream(), Stop());
432 EXPECT_CALL(mock_mixer_stream(), Close()); 432 EXPECT_CALL(mock_mixer_stream(), Close());
433 EXPECT_CALL(mock_manager(), ReleaseOutputStream(streams.front())); 433 EXPECT_CALL(mock_manager(), ReleaseOutputStream(streams.front()));
434 streams.front()->Close(); 434 streams.front()->Close();
435 } 435 }
436 436
437 TEST_F(CastAudioMixerTest, ByteDelays) { 437 TEST_F(CastAudioMixerTest, Delay) {
438 MockAudioSourceCallback source; 438 MockAudioSourceCallback source;
439 ::media::AudioOutputStream* stream = CreateMixerStream(); 439 ::media::AudioOutputStream* stream = CreateMixerStream();
440 440
441 EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_)) 441 EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_))
442 .WillOnce(Return(&mock_mixer_stream())); 442 .WillOnce(Return(&mock_mixer_stream()));
443 EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); 443 EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true));
444 ASSERT_TRUE(stream->Open()); 444 ASSERT_TRUE(stream->Open());
445 445
446 EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); 446 EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer()));
447 stream->Start(&source); 447 stream->Start(&source);
448 448
449 // The |total_bytes_delay| is the same because the Mixer and stream are 449 // |delay| is the same because the Mixer and stream are
450 // using the same AudioParameters. 450 // using the same AudioParameters.
451 EXPECT_CALL(source, OnMoreData(_, 100, 0)); 451 base::TimeDelta delay = base::TimeDelta::FromMicroseconds(1000);
452 mock_mixer_stream().SignalPull(&mock_mixer(), 100); 452 EXPECT_CALL(source, OnMoreData(delay, _, 0, _));
453 mock_mixer_stream().SignalPull(&mock_mixer(), delay);
453 454
454 EXPECT_CALL(mock_mixer_stream(), Stop()); 455 EXPECT_CALL(mock_mixer_stream(), Stop());
455 EXPECT_CALL(mock_mixer_stream(), Close()); 456 EXPECT_CALL(mock_mixer_stream(), Close());
456 EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream)); 457 EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream));
457 stream->Close(); 458 stream->Close();
458 } 459 }
459 460
460 } // namespace 461 } // namespace
461 } // namespace media 462 } // namespace media
462 } // namespace chromecast 463 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698