2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
15 void ExpectVolumeNear(int expected, int actual) {
16 // The hardware volume may be more coarsely quantized than [0, 255], so
17 // it is not always reasonable to expect to get exactly what we set. This
18 // allows for some error.
19 const int kMaxVolumeError = 10;
20 EXPECT_NEAR(expected, actual, kMaxVolumeError);
22 EXPECT_LE(actual, 255);
27 class VolumeTest : public AfterStreamingFixture {
30 // TODO(phoglund): a number of tests are disabled here on Linux, all pending
32 // http://code.google.com/p/webrtc/issues/detail?id=367
34 TEST_F(VolumeTest, DefaultSpeakerVolumeIsAtMost255) {
35 unsigned int volume = 1000;
36 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
37 EXPECT_LE(volume, 255u);
40 TEST_F(VolumeTest, SetVolumeBeforePlayoutWorks) {
41 // This is a rather specialized test, intended to exercise some PulseAudio
42 // code. However, these conditions should be satisfied on any platform.
43 unsigned int original_volume = 0;
44 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(original_volume));
47 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(200));
49 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
50 ExpectVolumeNear(200u, volume);
54 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
55 // Ensure the volume has not changed after resuming playout.
56 ExpectVolumeNear(200u, volume);
59 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(100));
61 // Ensure the volume set while paused is retained.
62 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
63 ExpectVolumeNear(100u, volume);
65 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(original_volume));
68 TEST_F(VolumeTest, ManualSetVolumeWorks) {
69 unsigned int original_volume = 0;
70 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(original_volume));
73 TEST_LOG("Setting speaker volume to 0 out of 255.\n");
74 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(0));
76 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
77 ExpectVolumeNear(0u, volume);
80 TEST_LOG("Setting speaker volume to 100 out of 255.\n");
81 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(100));
82 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
83 ExpectVolumeNear(100u, volume);
86 // Set the volume to 255 very briefly so we don't blast the poor user
87 // listening to this. This is just to test the call succeeds.
88 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(255));
89 EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume));
90 ExpectVolumeNear(255u, volume);
92 TEST_LOG("Setting speaker volume to the original %d out of 255.\n",
94 EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(original_volume));
98 TEST_F(VolumeTest, DISABLED_ON_LINUX(DefaultMicrophoneVolumeIsAtMost255)) {
99 unsigned int volume = 1000;
100 EXPECT_EQ(0, voe_volume_control_->GetMicVolume(volume));
101 EXPECT_LE(volume, 255u);
104 TEST_F(VolumeTest, DISABLED_ON_LINUX(
105 ManualRequiresMicrophoneCanSetMicrophoneVolumeWithAcgOff)) {
106 SwitchToManualMicrophone();
107 EXPECT_EQ(0, voe_apm_->SetAgcStatus(false));
109 unsigned int original_volume = 0;
110 EXPECT_EQ(0, voe_volume_control_->GetMicVolume(original_volume));
112 TEST_LOG("Setting microphone volume to 0.\n");
113 EXPECT_EQ(0, voe_volume_control_->SetMicVolume(channel_));
115 TEST_LOG("Setting microphone volume to 255.\n");
116 EXPECT_EQ(0, voe_volume_control_->SetMicVolume(255));
118 TEST_LOG("Setting microphone volume back to saved value.\n");
119 EXPECT_EQ(0, voe_volume_control_->SetMicVolume(original_volume));
123 TEST_F(VolumeTest, ChannelScalingIsOneByDefault) {
124 float scaling = -1.0f;
126 EXPECT_EQ(0, voe_volume_control_->GetChannelOutputVolumeScaling(
128 EXPECT_FLOAT_EQ(1.0f, scaling);
131 TEST_F(VolumeTest, ManualCanSetChannelScaling) {
132 EXPECT_EQ(0, voe_volume_control_->SetChannelOutputVolumeScaling(
135 float scaling = 1.0f;
136 EXPECT_EQ(0, voe_volume_control_->GetChannelOutputVolumeScaling(
139 EXPECT_FLOAT_EQ(0.1f, scaling);
141 TEST_LOG("Channel scaling set to 0.1: audio should be barely audible.\n");
145 TEST_F(VolumeTest, InputMutingIsNotEnabledByDefault) {
146 bool is_muted = true;
147 EXPECT_EQ(0, voe_volume_control_->GetInputMute(channel_, is_muted));
148 EXPECT_FALSE(is_muted);
151 TEST_F(VolumeTest, DISABLED_ON_LINUX(ManualInputMutingMutesMicrophone)) {
152 SwitchToManualMicrophone();
155 EXPECT_EQ(0, voe_volume_control_->SetInputMute(channel_, true));
156 bool is_muted = false;
157 EXPECT_EQ(0, voe_volume_control_->GetInputMute(channel_, is_muted));
158 EXPECT_TRUE(is_muted);
160 TEST_LOG("Muted: talk into microphone and verify you can't hear yourself.\n");
163 // Test that we can disable muting.
164 EXPECT_EQ(0, voe_volume_control_->SetInputMute(channel_, false));
165 EXPECT_EQ(0, voe_volume_control_->GetInputMute(channel_, is_muted));
166 EXPECT_FALSE(is_muted);
168 TEST_LOG("Unmuted: talk into microphone and verify you can hear yourself.\n");
172 TEST_F(VolumeTest, DISABLED_ON_LINUX(SystemInputMutingIsNotEnabledByDefault)) {
173 bool is_muted = true;
174 EXPECT_EQ(0, voe_volume_control_->GetSystemInputMute(is_muted));
175 EXPECT_FALSE(is_muted);
178 TEST_F(VolumeTest, DISABLED_ON_LINUX(ManualSystemInputMutingMutesMicrophone)) {
179 SwitchToManualMicrophone();
181 // Enable system input muting.
182 EXPECT_EQ(0, voe_volume_control_->SetSystemInputMute(true));
183 bool is_muted = false;
184 EXPECT_EQ(0, voe_volume_control_->GetSystemInputMute(is_muted));
185 EXPECT_TRUE(is_muted);
187 TEST_LOG("Muted: talk into microphone and verify you can't hear yourself.\n");
190 // Test that we can disable system input muting.
191 EXPECT_EQ(0, voe_volume_control_->SetSystemInputMute(false));
192 EXPECT_EQ(0, voe_volume_control_->GetSystemInputMute(is_muted));
193 EXPECT_FALSE(is_muted);
195 TEST_LOG("Unmuted: talk into microphone and verify you can hear yourself.\n");
199 TEST_F(VolumeTest, DISABLED_ON_LINUX(SystemOutputMutingIsNotEnabledByDefault)) {
200 bool is_muted = true;
201 EXPECT_EQ(0, voe_volume_control_->GetSystemOutputMute(is_muted));
202 EXPECT_FALSE(is_muted);
205 TEST_F(VolumeTest, ManualSystemOutputMutingMutesOutput) {
207 EXPECT_EQ(0, voe_volume_control_->SetSystemOutputMute(true));
208 bool is_muted = false;
209 EXPECT_EQ(0, voe_volume_control_->GetSystemOutputMute(is_muted));
210 EXPECT_TRUE(is_muted);
212 TEST_LOG("Muted: you should hear no audio.\n");
215 // Test that we can disable muting.
216 EXPECT_EQ(0, voe_volume_control_->SetSystemOutputMute(false));
217 EXPECT_EQ(0, voe_volume_control_->GetSystemOutputMute(is_muted));
218 EXPECT_FALSE(is_muted);
220 TEST_LOG("Unmuted: you should hear audio.\n");
224 TEST_F(VolumeTest, ManualTestInputAndOutputLevels) {
225 SwitchToManualMicrophone();
227 TEST_LOG("Speak and verify that the following levels look right:\n");
228 for (int i = 0; i < 5; i++) {
230 unsigned int input_level = 0;
231 unsigned int output_level = 0;
232 unsigned int input_level_full_range = 0;
233 unsigned int output_level_full_range = 0;
235 EXPECT_EQ(0, voe_volume_control_->GetSpeechInputLevel(
237 EXPECT_EQ(0, voe_volume_control_->GetSpeechOutputLevel(
238 channel_, output_level));
239 EXPECT_EQ(0, voe_volume_control_->GetSpeechInputLevelFullRange(
240 input_level_full_range));
241 EXPECT_EQ(0, voe_volume_control_->GetSpeechOutputLevelFullRange(
242 channel_, output_level_full_range));
244 TEST_LOG(" warped levels (0-9) : in=%5d, out=%5d\n",
245 input_level, output_level);
246 TEST_LOG(" linear levels (0-32768): in=%5d, out=%5d\n",
247 input_level_full_range, output_level_full_range);
251 TEST_F(VolumeTest, ChannelsAreNotPannedByDefault) {
255 EXPECT_EQ(0, voe_volume_control_->GetOutputVolumePan(channel_, left, right));
256 EXPECT_FLOAT_EQ(1.0, left);
257 EXPECT_FLOAT_EQ(1.0, right);
260 TEST_F(VolumeTest, ManualTestChannelPanning) {
261 TEST_LOG("Panning left.\n");
262 EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 0.8f, 0.1f));
265 TEST_LOG("Back to center.\n");
266 EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 1.0f, 1.0f));
269 TEST_LOG("Panning right.\n");
270 EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 0.1f, 0.8f));
273 // To finish, verify that the getter works.
277 EXPECT_EQ(0, voe_volume_control_->GetOutputVolumePan(channel_, left, right));
278 EXPECT_FLOAT_EQ(0.1f, left);
279 EXPECT_FLOAT_EQ(0.8f, right);