1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.orgnamespace { 148ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org 158ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.orgvoid ExpectVolumeNear(int expected, int actual) { 168ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org // The hardware volume may be more coarsely quantized than [0, 255], so 178ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org // it is not always reasonable to expect to get exactly what we set. This 188ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org // allows for some error. 198ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org const int kMaxVolumeError = 10; 208ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org EXPECT_NEAR(expected, actual, kMaxVolumeError); 218ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org EXPECT_GE(actual, 0); 228ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org EXPECT_LE(actual, 255); 238ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org} 248ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org 258ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org} // namespace 268ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VolumeTest : public AfterStreamingFixture { 28eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org public: 29eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org void SetAndVerifyMicVolume(unsigned int volume) { 30eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org bool success = voe_volume_control_->SetMicVolume(volume) == 0; 31eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 32eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(success); 33eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 34eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (!success) { 35eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to set microphone volume to %u.\n", volume); 36eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org return; 37eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 38eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org 39eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org unsigned int test_volume = 1000; 40eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org success = voe_volume_control_->GetMicVolume(test_volume) == 0; 41eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 42eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(success); 43eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 44eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (success) { 45eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_EQ(volume, test_volume); 46eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } else { 47eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to get the microphone volume."); 48eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_EQ(1000u, test_volume); 49eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 50eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 51eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org 52eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org void SetAndVerifyInputMute(bool enable) { 53eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org bool success = voe_volume_control_->SetInputMute(channel_, enable) == 0; 54eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 55eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(success); 56eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 57eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (!success) { 58eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to %smute input.\n", enable ? "" : "un"); 59eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org return; 60eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 61eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org 62eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org bool is_muted = !enable; 63eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org success = voe_volume_control_->GetInputMute(channel_, is_muted) == 0; 64eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 65eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(success); 66eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 67eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (success) { 68eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_EQ(enable, is_muted); 69eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } else { 70eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to mute the input."); 71eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_NE(enable, is_muted); 72eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 73eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org// Some tests are flaky on Linux (Pulse Audio), which boils down to some system 77eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org// values not being acquired in time. In Pulse Audio we make one retry if 78eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org// needed, but if we fail then, a -1 is returned propagating up through VoE. 79eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org// To avoid possible bugs slipping through on other platforms we make adequate 80eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org// changes on Linux only. 81265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.orgTEST_F(VolumeTest, VerifyCorrectErrorReturns) { 82265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // All tests run on correct initialization which eliminates one possible error 83265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // return. In addition, we assume the audio_device returning values without 84265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // error, which eliminates another potential error. 85265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // Left to verify are sanity checks of set parameters. 86265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org 87265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // Valid volume range: [0, 255] 88265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetSpeakerVolume(256)); 89265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetMicVolume(256)); 90265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org 91265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org // Valid panning rage: [0, 1] 92265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetOutputVolumePan(channel_, -0.1f, 0.5f)); 93265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetOutputVolumePan(channel_, 1.1f, 0.5f)); 94265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetOutputVolumePan(channel_, 0.5f, -0.1f)); 95265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org EXPECT_EQ(-1, voe_volume_control_->SetOutputVolumePan(channel_, 0.5f, 1.1f)); 96265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org} 97265cb1bbfcabfdcff27e37c4d111ebffb2adc13abjornv@webrtc.org 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, DefaultSpeakerVolumeIsAtMost255) { 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int volume = 1000; 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_LE(volume, 255u); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, SetVolumeBeforePlayoutWorks) { 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This is a rather specialized test, intended to exercise some PulseAudio 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // code. However, these conditions should be satisfied on any platform. 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int original_volume = 0; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(original_volume)); 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(200)); 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int volume; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 1148ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(200u, volume); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PausePlaying(); 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ResumePlaying(); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Ensure the volume has not changed after resuming playout. 1208ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(200u, volume); 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PausePlaying(); 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(100)); 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ResumePlaying(); 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Ensure the volume set while paused is retained. 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 1278ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(100u, volume); 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(original_volume)); 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ManualSetVolumeWorks) { 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int original_volume = 0; 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(original_volume)); 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Setting speaker volume to 0 out of 255.\n"); 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(0)); 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int volume; 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 1418ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(0u, volume); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Setting speaker volume to 100 out of 255.\n"); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(100)); 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 1478ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(100u, volume); 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set the volume to 255 very briefly so we don't blast the poor user 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // listening to this. This is just to test the call succeeds. 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(255)); 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeakerVolume(volume)); 1548ba1e50f0afc8f9d63f20573c0b06737df7fc129andrew@webrtc.org ExpectVolumeNear(255u, volume); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Setting speaker volume to the original %d out of 255.\n", 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org original_volume); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetSpeakerVolume(original_volume)); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 162efe94614c9ffee557bce6ff5bf1bbbe85f30b1c0bjornv@webrtc.orgTEST_F(VolumeTest, DefaultMicrophoneVolumeIsAtMost255) { 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int volume = 1000; 164eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org bool could_get_mic_volume = voe_volume_control_->GetMicVolume(volume) == 0; 165eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 166eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(could_get_mic_volume); 167eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 168eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (could_get_mic_volume) { 169efe94614c9ffee557bce6ff5bf1bbbe85f30b1c0bjornv@webrtc.org EXPECT_LE(volume, 255u); 170eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } else { 171eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to get the microphone volume."); 172efe94614c9ffee557bce6ff5bf1bbbe85f30b1c0bjornv@webrtc.org EXPECT_EQ(1000u, volume); 173eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 176eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.orgTEST_F(VolumeTest, ManualRequiresMicrophoneCanSetMicrophoneVolumeWithAgcOff) { 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SwitchToManualMicrophone(); 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_apm_->SetAgcStatus(false)); 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int original_volume = 0; 181eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org bool could_get_mic_volume = 182eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org (voe_volume_control_->GetMicVolume(original_volume) == 0); 183eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#if !defined(WEBRTC_LINUX) 184eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org EXPECT_TRUE(could_get_mic_volume); 185eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org#endif 186eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (could_get_mic_volume) 187eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Current microphone volume is %u.\n", original_volume); 188eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org else 189eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Failed to fetch current microphone volume.\n"); 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Setting microphone volume to 0.\n"); 192eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org SetAndVerifyMicVolume(0); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Setting microphone volume to 255.\n"); 195eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org SetAndVerifyMicVolume(255); 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 197eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org if (could_get_mic_volume) { 198eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org TEST_LOG("Setting microphone volume back to %u.\n", original_volume); 199eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org SetAndVerifyMicVolume(original_volume); 200eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org Sleep(1000); 201eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org } 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ChannelScalingIsOneByDefault) { 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float scaling = -1.0f; 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetChannelOutputVolumeScaling( 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_, scaling)); 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(1.0f, scaling); 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ManualCanSetChannelScaling) { 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetChannelOutputVolumeScaling( 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_, 0.1f)); 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float scaling = 1.0f; 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetChannelOutputVolumeScaling( 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_, scaling)); 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(0.1f, scaling); 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Channel scaling set to 0.1: audio should be barely audible.\n"); 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(2000); 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, InputMutingIsNotEnabledByDefault) { 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool is_muted = true; 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetInputMute(channel_, is_muted)); 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(is_muted); 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 232eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.orgTEST_F(VolumeTest, ManualInputMutingMutesMicrophone) { 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SwitchToManualMicrophone(); 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Enable muting. 235eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org SetAndVerifyInputMute(true); 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Muted: talk into microphone and verify you can't hear yourself.\n"); 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(2000); 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Test that we can disable muting. 240eb6cd40f70b11d5b8ed72e31b56fa76a0625aef6bjornv@webrtc.org SetAndVerifyInputMute(false); 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Unmuted: talk into microphone and verify you can hear yourself.\n"); 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(2000); 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ManualTestInputAndOutputLevels) { 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SwitchToManualMicrophone(); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Speak and verify that the following levels look right:\n"); 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < 5; i++) { 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int input_level = 0; 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int output_level = 0; 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int input_level_full_range = 0; 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int output_level_full_range = 0; 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeechInputLevel( 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org input_level)); 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeechOutputLevel( 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_, output_level)); 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeechInputLevelFullRange( 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org input_level_full_range)); 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetSpeechOutputLevelFullRange( 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_, output_level_full_range)); 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG(" warped levels (0-9) : in=%5d, out=%5d\n", 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org input_level, output_level); 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG(" linear levels (0-32768): in=%5d, out=%5d\n", 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org input_level_full_range, output_level_full_range); 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ChannelsAreNotPannedByDefault) { 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float left = -1.0; 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float right = -1.0; 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetOutputVolumePan(channel_, left, right)); 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(1.0, left); 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(1.0, right); 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VolumeTest, ManualTestChannelPanning) { 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Panning left.\n"); 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 0.8f, 0.1f)); 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Back to center.\n"); 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 1.0f, 1.0f)); 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TEST_LOG("Panning right.\n"); 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->SetOutputVolumePan(channel_, 0.1f, 0.8f)); 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Sleep(1000); 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // To finish, verify that the getter works. 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float left = 0.0f; 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float right = 0.0f; 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, voe_volume_control_->GetOutputVolumePan(channel_, left, right)); 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(0.1f, left); 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FLOAT_EQ(0.8f, right); 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 302