blob: 896b0f2dae9a64e773d96bf06908e9e654b85cb4 [file] [log] [blame]
Fredrik Solenberg73276ad2017-09-14 14:46:47 +02001/*
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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "audio/test/audio_end_to_end_test.h"
12
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020013#include <algorithm>
Mirko Bonadei317a1f02019-09-17 17:06:18 +020014#include <memory>
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020015
Danil Chapovalov44db4362019-09-30 04:16:28 +020016#include "api/task_queue/task_queue_base.h"
Artem Titov4e199e92018-08-20 13:30:39 +020017#include "call/fake_network_pipe.h"
18#include "call/simulated_network.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "system_wrappers/include/sleep.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "test/gtest.h"
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020021
22namespace webrtc {
23namespace test {
24namespace {
25// Wait half a second between stopping sending and stopping receiving audio.
26constexpr int kExtraRecordTimeMs = 500;
27
28constexpr int kSampleRate = 48000;
29} // namespace
30
31AudioEndToEndTest::AudioEndToEndTest()
32 : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
33
Artem Titov75e36472018-10-08 12:28:56 +020034BuiltInNetworkBehaviorConfig AudioEndToEndTest::GetNetworkPipeConfig() const {
35 return BuiltInNetworkBehaviorConfig();
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020036}
37
38size_t AudioEndToEndTest::GetNumVideoStreams() const {
39 return 0;
40}
41
42size_t AudioEndToEndTest::GetNumAudioStreams() const {
43 return 1;
44}
45
46size_t AudioEndToEndTest::GetNumFlexfecStreams() const {
47 return 0;
48}
49
Artem Titov3faa8322018-03-07 14:44:00 +010050std::unique_ptr<TestAudioDeviceModule::Capturer>
51AudioEndToEndTest::CreateCapturer() {
52 return TestAudioDeviceModule::CreatePulsedNoiseCapturer(32000, kSampleRate);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020053}
54
Artem Titov3faa8322018-03-07 14:44:00 +010055std::unique_ptr<TestAudioDeviceModule::Renderer>
56AudioEndToEndTest::CreateRenderer() {
57 return TestAudioDeviceModule::CreateDiscardRenderer(kSampleRate);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020058}
59
60void AudioEndToEndTest::OnFakeAudioDevicesCreated(
Artem Titov3faa8322018-03-07 14:44:00 +010061 TestAudioDeviceModule* send_audio_device,
62 TestAudioDeviceModule* recv_audio_device) {
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020063 send_audio_device_ = send_audio_device;
64}
65
Danil Chapovalov44db4362019-09-30 04:16:28 +020066std::unique_ptr<test::PacketTransport> AudioEndToEndTest::CreateSendTransport(
67 TaskQueueBase* task_queue,
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020068 Call* sender_call) {
Danil Chapovalov44db4362019-09-30 04:16:28 +020069 return std::make_unique<test::PacketTransport>(
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020070 task_queue, sender_call, this, test::PacketTransport::kSender,
Artem Titov4e199e92018-08-20 13:30:39 +020071 test::CallTest::payload_type_map_,
Mirko Bonadei317a1f02019-09-17 17:06:18 +020072 std::make_unique<FakeNetworkPipe>(
Artem Titov4e199e92018-08-20 13:30:39 +020073 Clock::GetRealTimeClock(),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020074 std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020075}
76
Danil Chapovalov44db4362019-09-30 04:16:28 +020077std::unique_ptr<test::PacketTransport>
78AudioEndToEndTest::CreateReceiveTransport(TaskQueueBase* task_queue) {
79 return std::make_unique<test::PacketTransport>(
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020080 task_queue, nullptr, this, test::PacketTransport::kReceiver,
Artem Titov4e199e92018-08-20 13:30:39 +020081 test::CallTest::payload_type_map_,
Mirko Bonadei317a1f02019-09-17 17:06:18 +020082 std::make_unique<FakeNetworkPipe>(
Artem Titov4e199e92018-08-20 13:30:39 +020083 Clock::GetRealTimeClock(),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020084 std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020085}
86
87void AudioEndToEndTest::ModifyAudioConfigs(
Yves Gerey665174f2018-06-19 15:03:05 +020088 AudioSendStream::Config* send_config,
89 std::vector<AudioReceiveStream::Config>* receive_configs) {
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020090 // Large bitrate by default.
91 const webrtc::SdpAudioFormat kDefaultFormat("opus", 48000, 2,
92 {{"stereo", "1"}});
Oskar Sundbom2707fb22017-11-16 10:57:35 +010093 send_config->send_codec_spec = AudioSendStream::Config::SendCodecSpec(
94 test::CallTest::kAudioSendPayloadType, kDefaultFormat);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020095}
96
97void 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
107void 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