blob: 86be2458e5f99b53a2674969ec9c1da3479fa60a [file] [log] [blame]
solenberg566ef242015-11-06 15:34:49 -08001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kwibergfffa42b2016-02-23 10:46:32 -080011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "audio/audio_state.h"
14#include "modules/audio_mixer/audio_mixer_impl.h"
15#include "modules/audio_processing/include/mock_audio_processing.h"
16#include "test/gtest.h"
17#include "test/mock_voice_engine.h"
solenberg566ef242015-11-06 15:34:49 -080018
19namespace webrtc {
20namespace test {
21namespace {
22
aleloi04c07222016-11-22 06:42:53 -080023const int kSampleRate = 8000;
24const int kNumberOfChannels = 1;
25const int kBytesPerSample = 2;
aleloidd310712016-11-17 06:28:59 -080026
aleloi04c07222016-11-22 06:42:53 -080027struct ConfigHelper {
28 ConfigHelper() : audio_mixer(AudioMixerImpl::Create()) {
aleloi04c07222016-11-22 06:42:53 -080029 EXPECT_CALL(mock_voice_engine, audio_device_module())
30 .Times(testing::AtLeast(1));
aleloi04c07222016-11-22 06:42:53 -080031 EXPECT_CALL(mock_voice_engine, audio_transport())
32 .WillRepeatedly(testing::Return(&audio_transport));
33
34 auto device = static_cast<MockAudioDeviceModule*>(
35 voice_engine().audio_device_module());
36
37 // Populate the audio transport proxy pointer to the most recent
38 // transport connected to the Audio Device.
39 ON_CALL(*device, RegisterAudioCallback(testing::_))
40 .WillByDefault(testing::Invoke([this](AudioTransport* transport) {
41 registered_audio_transport = transport;
42 return 0;
43 }));
44
45 audio_state_config.voice_engine = &mock_voice_engine;
46 audio_state_config.audio_mixer = audio_mixer;
peaha9cc40b2017-06-29 08:32:09 -070047 audio_state_config.audio_processing =
48 new rtc::RefCountedObject<MockAudioProcessing>();
solenberg566ef242015-11-06 15:34:49 -080049 }
aleloi04c07222016-11-22 06:42:53 -080050 AudioState::Config& config() { return audio_state_config; }
51 MockVoiceEngine& voice_engine() { return mock_voice_engine; }
52 rtc::scoped_refptr<AudioMixer> mixer() { return audio_mixer; }
53 MockAudioTransport& original_audio_transport() { return audio_transport; }
54 AudioTransport* audio_transport_proxy() { return registered_audio_transport; }
solenberg566ef242015-11-06 15:34:49 -080055
56 private:
aleloi04c07222016-11-22 06:42:53 -080057 testing::StrictMock<MockVoiceEngine> mock_voice_engine;
58 AudioState::Config audio_state_config;
59 rtc::scoped_refptr<AudioMixer> audio_mixer;
60 MockAudioTransport audio_transport;
61 AudioTransport* registered_audio_transport = nullptr;
solenberg566ef242015-11-06 15:34:49 -080062};
aleloi04c07222016-11-22 06:42:53 -080063
64class FakeAudioSource : public AudioMixer::Source {
65 public:
66 // TODO(aleloi): Valid overrides commented out, because the gmock
67 // methods don't use any override declarations, and we want to avoid
68 // warnings from -Winconsistent-missing-override. See
69 // http://crbug.com/428099.
70 int Ssrc() const /*override*/ { return 0; }
71
72 int PreferredSampleRate() const /*override*/ { return kSampleRate; }
73
74 MOCK_METHOD2(GetAudioFrameWithInfo,
75 AudioFrameInfo(int sample_rate_hz, AudioFrame* audio_frame));
76};
77
solenberg566ef242015-11-06 15:34:49 -080078} // namespace
79
80TEST(AudioStateTest, Create) {
81 ConfigHelper helper;
82 rtc::scoped_refptr<AudioState> audio_state =
83 AudioState::Create(helper.config());
84 EXPECT_TRUE(audio_state.get());
85}
86
87TEST(AudioStateTest, ConstructDestruct) {
88 ConfigHelper helper;
kwibergfffa42b2016-02-23 10:46:32 -080089 std::unique_ptr<internal::AudioState> audio_state(
solenberg566ef242015-11-06 15:34:49 -080090 new internal::AudioState(helper.config()));
91}
92
93TEST(AudioStateTest, GetVoiceEngine) {
94 ConfigHelper helper;
kwibergfffa42b2016-02-23 10:46:32 -080095 std::unique_ptr<internal::AudioState> audio_state(
solenberg566ef242015-11-06 15:34:49 -080096 new internal::AudioState(helper.config()));
97 EXPECT_EQ(audio_state->voice_engine(), &helper.voice_engine());
98}
99
aleloidd310712016-11-17 06:28:59 -0800100// Test that RecordedDataIsAvailable calls get to the original transport.
aleloi04c07222016-11-22 06:42:53 -0800101TEST(AudioStateAudioPathTest, RecordedAudioArrivesAtOriginalTransport) {
aleloidd310712016-11-17 06:28:59 -0800102 ConfigHelper helper;
aleloidd310712016-11-17 06:28:59 -0800103
aleloi04c07222016-11-22 06:42:53 -0800104 rtc::scoped_refptr<AudioState> audio_state =
105 AudioState::Create(helper.config());
106
107 // Setup completed. Ensure call of original transport is forwarded to new.
108 uint32_t new_mic_level;
109 EXPECT_CALL(
110 helper.original_audio_transport(),
111 RecordedDataIsAvailable(nullptr, kSampleRate / 100, kBytesPerSample,
112 kNumberOfChannels, kSampleRate, 0, 0, 0, false,
113 testing::Ref(new_mic_level)));
114
115 helper.audio_transport_proxy()->RecordedDataIsAvailable(
116 nullptr, kSampleRate / 100, kBytesPerSample, kNumberOfChannels,
117 kSampleRate, 0, 0, 0, false, new_mic_level);
118}
119
120TEST(AudioStateAudioPathTest,
121 QueryingProxyForAudioShouldResultInGetAudioCallOnMixerSource) {
122 ConfigHelper helper;
123
124 rtc::scoped_refptr<AudioState> audio_state =
125 AudioState::Create(helper.config());
126
127 FakeAudioSource fake_source;
128
129 helper.mixer()->AddSource(&fake_source);
130
131 EXPECT_CALL(fake_source, GetAudioFrameWithInfo(testing::_, testing::_))
132 .WillOnce(
133 testing::Invoke([](int sample_rate_hz, AudioFrame* audio_frame) {
134 audio_frame->sample_rate_hz_ = sample_rate_hz;
135 audio_frame->samples_per_channel_ = sample_rate_hz / 100;
136 audio_frame->num_channels_ = kNumberOfChannels;
137 return AudioMixer::Source::AudioFrameInfo::kNormal;
aleloidd310712016-11-17 06:28:59 -0800138 }));
139
aleloi04c07222016-11-22 06:42:53 -0800140 int16_t audio_buffer[kSampleRate / 100 * kNumberOfChannels];
141 size_t n_samples_out;
142 int64_t elapsed_time_ms;
143 int64_t ntp_time_ms;
144 helper.audio_transport_proxy()->NeedMorePlayData(
145 kSampleRate / 100, kBytesPerSample, kNumberOfChannels, kSampleRate,
146 audio_buffer, n_samples_out, &elapsed_time_ms, &ntp_time_ms);
aleloidd310712016-11-17 06:28:59 -0800147}
solenberg566ef242015-11-06 15:34:49 -0800148} // namespace test
149} // namespace webrtc