blob: ac843fe9c2ed94dbbb087c936d3b490834c02d06 [file] [log] [blame]
Tony Herree2044662021-11-29 11:33:42 +01001/*
2 * Copyright 2021 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 "pc/audio_rtp_receiver.h"
12
Harald Alvestrandc24a2182022-02-23 13:44:59 +000013#include <atomic>
14
Tony Herree2044662021-11-29 11:33:42 +010015#include "pc/test/mock_voice_media_channel.h"
16#include "rtc_base/gunit.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000017#include "rtc_base/ref_counted_object.h"
Tony Herree2044662021-11-29 11:33:42 +010018#include "rtc_base/thread.h"
19#include "test/gmock.h"
20#include "test/gtest.h"
21
22using ::testing::_;
23using ::testing::InvokeWithoutArgs;
24using ::testing::Mock;
25
26static const int kTimeOut = 100;
27static const double kDefaultVolume = 1;
28static const double kVolume = 3.7;
Tommi6589def2022-02-17 23:36:47 +010029static const double kVolumeMuted = 0.0;
Tony Herree2044662021-11-29 11:33:42 +010030static const uint32_t kSsrc = 3;
31
32namespace webrtc {
33class AudioRtpReceiverTest : public ::testing::Test {
34 protected:
35 AudioRtpReceiverTest()
36 : worker_(rtc::Thread::Current()),
37 receiver_(
38 rtc::make_ref_counted<AudioRtpReceiver>(worker_,
39 std::string(),
40 std::vector<std::string>(),
41 false)),
42 media_channel_(rtc::Thread::Current()) {
43 EXPECT_CALL(media_channel_, SetRawAudioSink(kSsrc, _));
44 EXPECT_CALL(media_channel_, SetBaseMinimumPlayoutDelayMs(kSsrc, _));
45 }
46
47 ~AudioRtpReceiverTest() {
Tommi6589def2022-02-17 23:36:47 +010048 EXPECT_CALL(media_channel_, SetOutputVolume(kSsrc, kVolumeMuted));
Tony Herree2044662021-11-29 11:33:42 +010049 receiver_->SetMediaChannel(nullptr);
Tony Herree2044662021-11-29 11:33:42 +010050 }
51
52 rtc::Thread* worker_;
53 rtc::scoped_refptr<AudioRtpReceiver> receiver_;
54 cricket::MockVoiceMediaChannel media_channel_;
55};
56
57TEST_F(AudioRtpReceiverTest, SetOutputVolumeIsCalled) {
58 std::atomic_int set_volume_calls(0);
59
60 EXPECT_CALL(media_channel_, SetOutputVolume(kSsrc, kDefaultVolume))
61 .WillOnce(InvokeWithoutArgs([&] {
62 set_volume_calls++;
63 return true;
64 }));
65
66 receiver_->track();
67 receiver_->track()->set_enabled(true);
68 receiver_->SetMediaChannel(&media_channel_);
Tommi20d8d912022-02-08 21:12:15 +010069 EXPECT_CALL(media_channel_, SetDefaultRawAudioSink(_)).Times(0);
Tony Herree2044662021-11-29 11:33:42 +010070 receiver_->SetupMediaChannel(kSsrc);
71
72 EXPECT_CALL(media_channel_, SetOutputVolume(kSsrc, kVolume))
73 .WillOnce(InvokeWithoutArgs([&] {
74 set_volume_calls++;
75 return true;
76 }));
77
78 receiver_->OnSetVolume(kVolume);
79 EXPECT_TRUE_WAIT(set_volume_calls == 2, kTimeOut);
80}
81
82TEST_F(AudioRtpReceiverTest, VolumesSetBeforeStartingAreRespected) {
83 // Set the volume before setting the media channel. It should still be used
84 // as the initial volume.
85 receiver_->OnSetVolume(kVolume);
86
87 receiver_->track()->set_enabled(true);
88 receiver_->SetMediaChannel(&media_channel_);
89
90 // The previosly set initial volume should be propagated to the provided
91 // media_channel_ as soon as SetupMediaChannel is called.
92 EXPECT_CALL(media_channel_, SetOutputVolume(kSsrc, kVolume));
93
94 receiver_->SetupMediaChannel(kSsrc);
95}
96} // namespace webrtc