| Index: webrtc/audio/audio_state_audio_path_unittest.cc
|
| diff --git a/webrtc/audio/audio_state_audio_path_unittest.cc b/webrtc/audio/audio_state_audio_path_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2cb643b8bce8cacab06deb55a994fa789e3f0403
|
| --- /dev/null
|
| +++ b/webrtc/audio/audio_state_audio_path_unittest.cc
|
| @@ -0,0 +1,135 @@
|
| +/*
|
| + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include <memory>
|
| +
|
| +#include "webrtc/audio/audio_state.h"
|
| +#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
|
| +#include "webrtc/test/gtest.h"
|
| +#include "webrtc/test/mock_voice_engine.h"
|
| +
|
| +namespace webrtc {
|
| +namespace test {
|
| +namespace {
|
| +struct ConfigHelper {
|
| + ConfigHelper() : audio_mixer_(AudioMixerImpl::Create()) {
|
| + using testing::_;
|
| +
|
| + EXPECT_CALL(voice_engine_, RegisterVoiceEngineObserver(testing::_))
|
| + .WillOnce(testing::Return(0));
|
| + EXPECT_CALL(voice_engine_, DeRegisterVoiceEngineObserver())
|
| + .WillOnce(testing::Return(0));
|
| + EXPECT_CALL(voice_engine_, audio_processing());
|
| + EXPECT_CALL(voice_engine_, audio_transport());
|
| +
|
| + ON_CALL(voice_engine_, audio_transport())
|
| + .WillByDefault(testing::Return(&audio_transport_));
|
| +
|
| + config_.voice_engine = &voice_engine_;
|
| + config_.audio_mixer = audio_mixer_;
|
| + }
|
| +
|
| + rtc::scoped_refptr<AudioMixer> mixer() { return audio_mixer_; }
|
| +
|
| + MockAudioTransport& original_audio_transport() { return audio_transport_; }
|
| +
|
| + AudioState::Config& config() { return config_; }
|
| + MockVoiceEngine& voice_engine() { return voice_engine_; }
|
| +
|
| + testing::StrictMock<MockVoiceEngine> voice_engine_;
|
| + MockAudioTransport audio_transport_;
|
| + rtc::scoped_refptr<AudioMixer> audio_mixer_;
|
| + AudioState::Config config_;
|
| +};
|
| +
|
| +class FakeAudioSource : public AudioMixer::Source {
|
| + public:
|
| + int Ssrc() const /*override*/ { return 0; }
|
| +
|
| + int PreferredSampleRate() const /*override*/ { return 8000; }
|
| +
|
| + MOCK_METHOD2(GetAudioFrameWithInfo,
|
| + AudioFrameInfo(int sample_rate_hz, AudioFrame* audio_frame));
|
| +};
|
| +} // namespace
|
| +
|
| +// Test that RecordedDataIsAvailable calls get to the original transport.
|
| +TEST(AudioStateAudioPathTest, RecordedAudioArrivesAtOriginalTransport) {
|
| + ConfigHelper helper;
|
| +
|
| + EXPECT_CALL(helper.voice_engine(), audio_device_module()).Times(2);
|
| + auto device = static_cast<MockAudioDeviceModule*>(
|
| + helper.voice_engine().audio_device_module());
|
| +
|
| + // Get a local pointer to the most recent transport connected to the
|
| + // Audio Device.
|
| + AudioTransport* audio_transport_proxy = nullptr;
|
| + ON_CALL(*device, RegisterAudioCallback(testing::_))
|
| + .WillByDefault(
|
| + testing::Invoke([&audio_transport_proxy](AudioTransport* transport) {
|
| + audio_transport_proxy = transport;
|
| + return 0;
|
| + }));
|
| +
|
| + rtc::scoped_refptr<AudioState> audio_state =
|
| + AudioState::Create(helper.config());
|
| +
|
| + // Setup completed. Ensure call of original transport is forwarded to new.
|
| + uint32_t new_mic_level;
|
| + EXPECT_CALL(helper.original_audio_transport(),
|
| + RecordedDataIsAvailable(nullptr, 80, 2, 1, 8000, 0, 0, 0, false,
|
| + testing::Ref(new_mic_level)));
|
| +
|
| + audio_transport_proxy->RecordedDataIsAvailable(nullptr, 80, 2, 1, 8000, 0, 0,
|
| + 0, false, new_mic_level);
|
| +}
|
| +
|
| +TEST(AudioStateAudioPathTest,
|
| + QueryingProxyForAudioShouldResultInGetAudioCallOnMixerSource) {
|
| + ConfigHelper helper;
|
| +
|
| + EXPECT_CALL(helper.voice_engine(), audio_device_module()).Times(2);
|
| + auto device = static_cast<MockAudioDeviceModule*>(
|
| + helper.voice_engine().audio_device_module());
|
| +
|
| + AudioTransport* audio_transport_proxy = nullptr;
|
| + ON_CALL(*device, RegisterAudioCallback(testing::_))
|
| + .WillByDefault(
|
| + testing::Invoke([&audio_transport_proxy](AudioTransport* transport) {
|
| + audio_transport_proxy = transport;
|
| + return 0;
|
| + }));
|
| +
|
| + rtc::scoped_refptr<AudioState> audio_state =
|
| + AudioState::Create(helper.config());
|
| +
|
| + FakeAudioSource fake_source;
|
| +
|
| + helper.mixer()->AddSource(&fake_source);
|
| +
|
| + EXPECT_CALL(fake_source, GetAudioFrameWithInfo(testing::_, testing::_))
|
| + .WillOnce(
|
| + testing::Invoke([](int sample_rate_hz, AudioFrame* audio_frame) {
|
| + audio_frame->sample_rate_hz_ = sample_rate_hz;
|
| + audio_frame->samples_per_channel_ = sample_rate_hz / 100;
|
| + audio_frame->num_channels_ = 1;
|
| + return AudioMixer::Source::AudioFrameInfo::kNormal;
|
| + }));
|
| +
|
| + int16_t audio_buffer[80];
|
| + size_t n_samples_out;
|
| + int64_t elapsed_time_ms;
|
| + int64_t ntp_time_ms;
|
| + audio_transport_proxy->NeedMorePlayData(80, 2, 1, 8000, audio_buffer,
|
| + n_samples_out, &elapsed_time_ms,
|
| + &ntp_time_ms);
|
| +}
|
| +} // namespace test
|
| +} // namespace webrtc
|
|
|