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