1 /*
2  *  Copyright (c) 2017 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 
11 #include "audio/test/audio_end_to_end_test.h"
12 
13 #include <algorithm>
14 #include <memory>
15 
16 #include "api/task_queue/task_queue_base.h"
17 #include "call/fake_network_pipe.h"
18 #include "call/simulated_network.h"
19 #include "system_wrappers/include/sleep.h"
20 #include "test/gtest.h"
21 
22 namespace webrtc {
23 namespace test {
24 namespace {
25 // Wait half a second between stopping sending and stopping receiving audio.
26 constexpr int kExtraRecordTimeMs = 500;
27 
28 constexpr int kSampleRate = 48000;
29 }  // namespace
30 
AudioEndToEndTest()31 AudioEndToEndTest::AudioEndToEndTest()
32     : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
33 
GetNetworkPipeConfig() const34 BuiltInNetworkBehaviorConfig AudioEndToEndTest::GetNetworkPipeConfig() const {
35   return BuiltInNetworkBehaviorConfig();
36 }
37 
GetNumVideoStreams() const38 size_t AudioEndToEndTest::GetNumVideoStreams() const {
39   return 0;
40 }
41 
GetNumAudioStreams() const42 size_t AudioEndToEndTest::GetNumAudioStreams() const {
43   return 1;
44 }
45 
GetNumFlexfecStreams() const46 size_t AudioEndToEndTest::GetNumFlexfecStreams() const {
47   return 0;
48 }
49 
50 std::unique_ptr<TestAudioDeviceModule::Capturer>
CreateCapturer()51 AudioEndToEndTest::CreateCapturer() {
52   return TestAudioDeviceModule::CreatePulsedNoiseCapturer(32000, kSampleRate);
53 }
54 
55 std::unique_ptr<TestAudioDeviceModule::Renderer>
CreateRenderer()56 AudioEndToEndTest::CreateRenderer() {
57   return TestAudioDeviceModule::CreateDiscardRenderer(kSampleRate);
58 }
59 
OnFakeAudioDevicesCreated(TestAudioDeviceModule * send_audio_device,TestAudioDeviceModule * recv_audio_device)60 void AudioEndToEndTest::OnFakeAudioDevicesCreated(
61     TestAudioDeviceModule* send_audio_device,
62     TestAudioDeviceModule* recv_audio_device) {
63   send_audio_device_ = send_audio_device;
64 }
65 
CreateSendTransport(TaskQueueBase * task_queue,Call * sender_call)66 std::unique_ptr<test::PacketTransport> AudioEndToEndTest::CreateSendTransport(
67     TaskQueueBase* task_queue,
68     Call* sender_call) {
69   return std::make_unique<test::PacketTransport>(
70       task_queue, sender_call, this, test::PacketTransport::kSender,
71       test::CallTest::payload_type_map_,
72       std::make_unique<FakeNetworkPipe>(
73           Clock::GetRealTimeClock(),
74           std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
75 }
76 
77 std::unique_ptr<test::PacketTransport>
CreateReceiveTransport(TaskQueueBase * task_queue)78 AudioEndToEndTest::CreateReceiveTransport(TaskQueueBase* task_queue) {
79   return std::make_unique<test::PacketTransport>(
80       task_queue, nullptr, this, test::PacketTransport::kReceiver,
81       test::CallTest::payload_type_map_,
82       std::make_unique<FakeNetworkPipe>(
83           Clock::GetRealTimeClock(),
84           std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
85 }
86 
ModifyAudioConfigs(AudioSendStream::Config * send_config,std::vector<AudioReceiveStream::Config> * receive_configs)87 void AudioEndToEndTest::ModifyAudioConfigs(
88     AudioSendStream::Config* send_config,
89     std::vector<AudioReceiveStream::Config>* receive_configs) {
90   // Large bitrate by default.
91   const webrtc::SdpAudioFormat kDefaultFormat("opus", 48000, 2,
92                                               {{"stereo", "1"}});
93   send_config->send_codec_spec = AudioSendStream::Config::SendCodecSpec(
94       test::CallTest::kAudioSendPayloadType, kDefaultFormat);
95 }
96 
OnAudioStreamsCreated(AudioSendStream * send_stream,const std::vector<AudioReceiveStream * > & receive_streams)97 void AudioEndToEndTest::OnAudioStreamsCreated(
98     AudioSendStream* send_stream,
99     const std::vector<AudioReceiveStream*>& receive_streams) {
100   ASSERT_NE(nullptr, send_stream);
101   ASSERT_EQ(1u, receive_streams.size());
102   ASSERT_NE(nullptr, receive_streams[0]);
103   send_stream_ = send_stream;
104   receive_stream_ = receive_streams[0];
105 }
106 
PerformTest()107 void AudioEndToEndTest::PerformTest() {
108   // Wait until the input audio file is done...
109   send_audio_device_->WaitForRecordingEnd();
110   // and some extra time to account for network delay.
111   SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraRecordTimeMs);
112 }
113 }  // namespace test
114 }  // namespace webrtc
115