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
113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <math.h>
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/test/audio_device_test_defines.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
18bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_config.h"
21bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_impl.h"
22bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_utility.h"
23bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h"
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Helper functions
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(ANDROID)
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgchar filenameStr[2][256] =
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ {0},
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {0},
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; // Allow two buffers for those API calls taking two filenames
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint currentStr = 0;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* GetFilename(const char* filename)
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  currentStr = !currentStr;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", filename);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return filenameStr[currentStr];
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif !defined(WEBRTC_IOS)
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* GetFilename(const char* filename) {
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string full_path_filename = webrtc::test::OutputPath() + filename;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return full_path_filename.c_str();
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing namespace webrtc;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioEventObserverAPI: public AudioDeviceObserver {
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioEventObserverAPI(AudioDeviceModule* audioDevice)
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      : error_(kRecordingError),
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        warning_(kRecordingWarning),
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        audio_device_(audioDevice) {
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~AudioEventObserverAPI() {}
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void OnErrorIsReported(const ErrorCode error) {
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n[*** ERROR ***] => OnErrorIsReported(%d)\n\n", error);
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error_ = error;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void OnWarningIsReported(const WarningCode warning) {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n[*** WARNING ***] => OnWarningIsReported(%d)\n\n", warning);
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    warning_ = warning;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopRecording());
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopPlayout());
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ErrorCode error_;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WarningCode warning_;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioDeviceModule* audio_device_;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioTransportAPI: public AudioTransport {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioTransportAPI(AudioDeviceModule* audioDevice)
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      : rec_count_(0),
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        play_count_(0) {
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~AudioTransportAPI() {}
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
8664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  virtual int32_t RecordedDataIsAvailable(
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const void* audioSamples,
8864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t nSamples,
8964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint8_t nBytesPerSample,
9064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint8_t nChannels,
9164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t sampleRate,
9264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t totalDelay,
9364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const int32_t clockSkew,
9464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t currentMicLevel,
9528832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org      const bool keyPressed,
9664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      uint32_t& newMicLevel) {
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    rec_count_++;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (rec_count_ % 100 == 0) {
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (nChannels == 1) {
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // mono
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("-");
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      } else if ((nChannels == 2) && (nBytesPerSample == 2)) {
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // stereo but only using one channel
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("-|");
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      } else {
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // stereo
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("--");
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  virtual int32_t NeedMorePlayData(
11464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t nSamples,
11564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint8_t nBytesPerSample,
11664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint8_t nChannels,
11764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      const uint32_t sampleRate,
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      void* audioSamples,
11922f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org      uint32_t& nSamplesOut,
12081f8df9af96c6b4bf43234f2a0162146a5da6112wu@webrtc.org      int64_t* elapsed_time_ms,
12122f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org      int64_t* ntp_time_ms) {
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    play_count_++;
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (play_count_ % 100 == 0) {
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (nChannels == 1) {
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("+");
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      } else {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("++");
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    nSamplesOut = 480;
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1340e6fa8c05cde2587e30dcf5e405132193d60dd42xians@webrtc.org  virtual int OnDataAvailable(const int voe_channels[],
13544f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int number_of_voe_channels,
13644f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              const int16_t* audio_data,
13744f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int sample_rate,
13844f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int number_of_channels,
13944f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int number_of_frames,
14044f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int audio_delay_milliseconds,
14144f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              int current_volume,
14244f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              bool key_pressed,
14344f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                              bool need_audio_processing) {
14444f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org    return 0;
14544f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org  }
14644f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org
14791d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org  virtual void PushCaptureData(int voe_channel, const void* audio_data,
14891d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                               int bits_per_sample, int sample_rate,
14991d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                               int number_of_channels,
15091d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                               int number_of_frames) {}
15191d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org
15291d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org  virtual void PullRenderData(int bits_per_sample, int sample_rate,
15391d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                              int number_of_channels, int number_of_frames,
15422f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org                              void* audio_data,
15581f8df9af96c6b4bf43234f2a0162146a5da6112wu@webrtc.org                              int64_t* elapsed_time_ms,
15622f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org                              int64_t* ntp_time_ms) {}
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
15864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t rec_count_;
15964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t play_count_;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioDeviceAPITest: public testing::Test {
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioDeviceAPITest() {}
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~AudioDeviceAPITest() {}
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static void SetUpTestCase() {
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    process_thread_ = ProcessThread::CreateProcessThread();
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    process_thread_->Start();
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Windows:
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //      if (WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          user can select between default (Core) or Wave
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //      else
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          user can select between default (Wave) or Wave
17764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const int32_t kId = 444;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32)
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is defined!\n\n");
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // create default implementation (=Core Audio) instance
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_device_->AddRef();
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Release());
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // create non-default (=Wave Audio) instance
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsWaveAudio)) != NULL);
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_device_->AddRef();
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Release());
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // explicitly specify usage of Core Audio (same as default)
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsCoreAudio)) != NULL);
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is *not* defined!\n");
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL);
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // create default implementation (=Wave Audio) instance
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_device_->AddRef();
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Release());
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // explicitly specify usage of Wave Audio (same as default)
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsWaveAudio)) != NULL);
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(ANDROID)
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Fails tests
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL);
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL);
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxPulseAudio)) == NULL);
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Create default implementation instance
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(WEBRTC_LINUX)
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL);
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // create default implementation instance
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_device_->AddRef();
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Terminate());
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Release());
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // explicitly specify usage of Pulse Audio (same as default)
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxPulseAudio)) != NULL);
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_MAC)
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Fails tests
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL);
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL);
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL);
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kLinuxPulseAudio)) == NULL);
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Create default implementation instance
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create(
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audio_device_ == NULL) {
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      FAIL() << "Failed creating audio device object!";
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // The ADM is reference counted.
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_device_->AddRef();
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    process_thread_->RegisterModule(audio_device_);
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule::AudioLayer audio_layer =
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kPlatformDefaultAudio;
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->ActiveAudioLayer(&audio_layer));
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audio_layer == AudioDeviceModule::kLinuxAlsaAudio) {
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      linux_alsa_ = true;
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static void TearDownTestCase() {
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (process_thread_) {
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      process_thread_->DeRegisterModule(audio_device_);
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      process_thread_->Stop();
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ProcessThread::DestroyProcessThread(process_thread_);
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (event_observer_) {
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete event_observer_;
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      event_observer_ = NULL;
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audio_transport_) {
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete audio_transport_;
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      audio_transport_ = NULL;
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audio_device_) {
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->Release());
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SetUp() {
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (linux_alsa_) {
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      FAIL() << "API Test is not available on ALSA on Linux!";
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Init());
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Initialized());
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void TearDown() {
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->Terminate());
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  void CheckVolume(uint32_t expected, uint32_t actual) {
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Mac and Windows have lower resolution on the volume settings.
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_MAC) || defined(_WIN32)
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int diff = abs(static_cast<int>(expected - actual));
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_LE(diff, 5);
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((actual == expected) || (actual == expected-1));
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void CheckInitialPlayoutStates() {
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Playing());
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void CheckInitialRecordingStates() {
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->RecordingIsInitialized());
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Recording());
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static bool linux_alsa_;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static ProcessThread* process_thread_;
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static AudioDeviceModule* audio_device_;
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static AudioTransportAPI* audio_transport_;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static AudioEventObserverAPI* event_observer_;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Must be initialized like this to handle static SetUpTestCase() above.
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool AudioDeviceAPITest::linux_alsa_ = false;
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgProcessThread* AudioDeviceAPITest::process_thread_ = NULL;
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioDeviceModule* AudioDeviceAPITest::audio_device_ = NULL;
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioTransportAPI* AudioDeviceAPITest::audio_transport_ = NULL;
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioEventObserverAPI* AudioDeviceAPITest::event_observer_ = NULL;
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RegisterEventObserver) {
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  event_observer_ = new AudioEventObserverAPI(audio_device_);
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterEventObserver(NULL));
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterEventObserver(event_observer_));
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterEventObserver(NULL));
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RegisterAudioCallback) {
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  audio_transport_ = new AudioTransportAPI(audio_device_);
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, Init) {
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->Initialized());
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Init());
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->Initialized());
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Terminate());
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Initialized());
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Init());
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->Initialized());
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Terminate());
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Initialized());
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, Terminate) {
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->Initialized());
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Terminate());
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Initialized());
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Terminate());
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Initialized());
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Init());
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->Initialized());
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Terminate());
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Initialized());
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutDevices) {
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_GT(audio_device_->PlayoutDevices(), 0);
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_GT(audio_device_->PlayoutDevices(), 0);
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingDevices) {
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_GT(audio_device_->RecordingDevices(), 0);
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_GT(audio_device_->RecordingDevices(), 0);
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38922c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org// TODO(henrika): uncomment when you have decided what to do with issue 3675.
39022c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#if 0
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutDeviceName) {
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char name[kAdmMaxDeviceNameSize];
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char guid[kAdmMaxGuidSize];
39464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(-2, name, guid));
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(no_devices, name, guid));
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(0, NULL, guid));
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutDeviceName(0, name, NULL));
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // shall be mapped to 0.
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutDeviceName(-1, name, NULL));
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(-1, name, NULL));
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->PlayoutDeviceName(i, name, guid));
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->PlayoutDeviceName(i, name, NULL));
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingDeviceName) {
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char name[kAdmMaxDeviceNameSize];
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char guid[kAdmMaxGuidSize];
41864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->RecordingDeviceName(-2, name, guid));
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->RecordingDeviceName(no_devices, name, guid));
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->RecordingDeviceName(0, NULL, guid));
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingDeviceName(0, name, NULL));
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // shall me mapped to 0
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingDeviceName(-1, name, NULL));
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->RecordingDeviceName(-1, name, NULL));
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingDeviceName(i, name, guid));
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingDeviceName(i, name, NULL));
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SetPlayoutDevice) {
44064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(-1));
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(no_devices));
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultCommunicationDevice));
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice));
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultCommunicationDevice));
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice));
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SetRecordingDevice) {
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->Init());
46564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetRecordingDevice(-1));
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetRecordingDevice(no_devices));
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice));
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultCommunicationDevice) == -1);
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice) == -1);
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
48722c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#endif  // 0
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutIsAvailable) {
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutDevice(
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Availability check should not initialize.
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0,
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            audio_device_->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingIsAvailable) {
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultCommunicationDevice));
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->RecordingIsInitialized());
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice));
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->RecordingIsInitialized());
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->RecordingIsInitialized());
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, InitPlayout) {
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check initial state
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensure that device must be set before we can initialize
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->InitPlayout());
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        MACRO_DEFAULT_COMMUNICATION_DEVICE));
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopPlayout());
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Sleep is needed for e.g. iPhone since we after stopping then starting may
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // have a hangover time of a couple of ms before initialized.
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SleepMs(50);
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StopPlayout());
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (available) {
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->InitPlayout());
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, InitRecording) {
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check initial state
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->RecordingIsInitialized());
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensure that device must be set before we can initialize
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->InitRecording());
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitRecording());
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->RecordingIsInitialized());
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->RecordingIsInitialized());
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1,
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE));
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopRecording());
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->RecordingIsInitialized());
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0,
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE));
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SleepMs(50);
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->RecordingIsInitialized());
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StopRecording());
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->RecordingIsInitialized());
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (available) {
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->InitRecording());
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(audio_device_->RecordingIsInitialized());
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRecording());
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StartAndStopPlayout) {
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->StartPlayout());
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultCommunicationDevice
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutDevice(
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartPlayout());
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Playing());
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopPlayout());
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Playing());
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test but for kDefaultDevice
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartPlayout());
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Playing());
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopPlayout());
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Playing());
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test for all devices
67564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->InitPlayout());
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StartPlayout());
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_TRUE(audio_device_->Playing());
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StopPlayout());
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->Playing());
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StartAndStopRecording) {
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->StartRecording());
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRecording());
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultCommunicationDevice
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->RecordingIsInitialized());
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartRecording());
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Recording());
711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopRecording());
713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Recording());
714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL));
715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test but for kDefaultDevice
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->RecordingIsInitialized());
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartRecording());
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Recording());
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopRecording());
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->Recording());
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test for all devices
73264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->RecordingIsInitialized());
738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->InitRecording());
739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StartRecording());
740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_TRUE(audio_device_->Recording());
741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_));
742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->StopRecording());
743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_FALSE(audio_device_->Recording());
744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SetAndGetWaveOutVolume) {
75064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t vol(0);
751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE 1: Windows Wave only!
752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE 2: It seems like the waveOutSetVolume API returns
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // MMSYSERR_NOTSUPPORTED on some Vista machines!
75464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  const uint16_t maxVol(0xFFFF);
75564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t volL, volR;
756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // make dummy test to see if this API is supported
76064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int32_t works = audio_device_->SetWaveOutVolume(vol, vol);
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WARNING(works == 0);
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (works == 0)
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // set volume without open playout device
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = 0; vol <= maxVol; vol += (maxVol/5))
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol));
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR));
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_TRUE((volL == vol) && (volR == vol));
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // repeat test but this time with an open (default) output device
774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kDefaultDevice));
776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = 0; vol <= maxVol; vol += (maxVol/5))
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol));
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR));
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_TRUE((volL == vol) && (volR == vol));
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // as above but while playout is active
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartPlayout());
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->Playing());
788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = 0; vol <= maxVol; vol += (maxVol/5))
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol));
791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR));
792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_TRUE((volL == vol) && (volR == vol));
793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Playing());
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, InitSpeaker) {
802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: By calling Terminate (in TearDown) followed by Init (in SetUp) we
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensure that any existing output mixer handle is set to NULL.
804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The mixer handle is closed and reopened again for each call to
805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // SetPlayoutDevice.
806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultCommunicationDevice
809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
811cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitSpeaker());
812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
814cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  bool available;
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available));
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitPlayout());
818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartPlayout());
819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audio_device_->InitSpeaker());
820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopPlayout());
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultDevice
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
825cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitSpeaker());
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test for all devices
82864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
831cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, InitMicrophone) {
836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: By calling Terminate (in TearDown) followed by Init (in SetUp) we
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensure that any existing output mixer handle is set to NULL.
838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The mixer handle is closed and reopened again for each call to
839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // SetRecordingDevice.
840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultCommunicationDevice
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0,
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE));
845cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitMicrophone());
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
848cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  bool available;
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available));
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitRecording());
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StartRecording());
853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audio_device_->InitMicrophone());
854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StopRecording());
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // kDefaultDevice
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
859cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitMicrophone());
860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // repeat test for all devices
86264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
865cceb392c510580dbdf1cec2eec17e9c9ccb268abandrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SpeakerVolumeIsAvailable) {
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultCommunicationDevice
875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutDevice(
876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check for availability should not lead to initialization
879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultDevice
883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check all availiable devices
88864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Tests the following methods:
897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// SetSpeakerVolume
898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// SpeakerVolume
899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// MaxSpeakerVolume
900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// MinSpeakerVolume
901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// NOTE: Disabled on mac due to issue 257.
902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MAC
903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SpeakerVolumeTests) {
90464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t vol(0);
90564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t volume(0);
90664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t maxVolume(0);
90764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t minVolume(0);
90864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t stepSize(0);
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetSpeakerVolume(0));
914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // speaker must be initialized first
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SpeakerVolume(&volume));
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MaxSpeakerVolume(&maxVolume));
917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MinSpeakerVolume(&minVolume));
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SpeakerVolumeStepSize(&stepSize));
919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // test for warning (can e.g. happen on Vista with Wave API)
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0,
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            audio_device_->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerVolume(19001));
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume));
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WARNING(volume == 19001);
930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // use kDefaultCommunicationDevice and modify/retrieve the volume
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutDevice(
936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume));
941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume));
942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize));
943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = minVolume; vol < (int)maxVolume; vol += 20*stepSize) {
944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol));
945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume));
946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      CheckVolume(volume, vol);
947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // use kDefaultDevice and modify/retrieve the volume
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume));
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume));
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize));
95964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t step = (maxVolume - minVolume) / 10;
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    step = (step < stepSize ? stepSize : step);
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = minVolume; vol <= maxVolume; vol += step) {
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol));
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume));
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      CheckVolume(volume, vol);
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // use all (indexed) devices and modify/retrieve the volume
96964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->InitSpeaker());
975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume));
976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume));
977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize));
97864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org      uint32_t step = (maxVolume - minVolume) / 10;
979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      step = (step < stepSize ? stepSize : step);
980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      for (vol = minVolume; vol <= maxVolume; vol += step) {
981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol));
982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume));
983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        CheckVolume(volume, vol);
984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // restore reasonable level
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available));
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume));
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audio_device_->SetSpeakerVolume(maxVolume < 10 ?
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        maxVolume/3 : maxVolume/10) == 0);
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // !WEBRTC_MAC
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, AGC) {
1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: The AGC API only enables/disables the AGC. To ensure that it will
1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // have an effect, use it in combination with MicrophoneVolumeIsAvailable.
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->AGC());
1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // set/get tests
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetAGC(true));
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->AGC());
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetAGC(false));
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->AGC());
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneVolumeIsAvailable) {
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultCommunicationDevice
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check for availability should not lead to initialization
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultDevice
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check all availiable devices
103264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Tests the methods:
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// SetMicrophoneVolume
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// MicrophoneVolume
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// MaxMicrophoneVolume
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// MinMicrophoneVolume
1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// NOTE: Disabled on mac due to issue 257.
1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MAC
1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneVolumeTests) {
104864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t vol(0);
104964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t volume(0);
105064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t maxVolume(0);
105164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t minVolume(0);
105264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t stepSize(0);
1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetMicrophoneVolume(0));
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // must be initialized first
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MicrophoneVolume(&volume));
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MaxMicrophoneVolume(&maxVolume));
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MinMicrophoneVolume(&minVolume));
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MicrophoneVolumeStepSize(&stepSize));
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // test for warning (can e.g. happen on Vista with Wave API)
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultDevice));
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(19001));
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume));
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WARNING(volume == 19001);
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve the volume
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume));
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume));
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize));
1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = minVolume; vol < (int)maxVolume; vol += 10*stepSize)
1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol));
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume));
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      CheckVolume(volume, vol);
1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize kDefaultDevice and modify/retrieve the volume
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume));
1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume));
1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize));
1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (vol = minVolume; vol < maxVolume; vol += 10 * stepSize) {
1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol));
1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume));
1109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      CheckVolume(volume, vol);
1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // use all (indexed) devices and modify/retrieve the volume
111464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
1115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available) {
1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->InitMicrophone());
1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume));
1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume));
1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize));
1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      for (vol = minVolume; vol < maxVolume; vol += 20 * stepSize) {
1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol));
1125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume));
1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        CheckVolume(volume, vol);
1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // restore reasonable level
1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available));
1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume));
1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(maxVolume/10));
1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // !WEBRTC_MAC
1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SpeakerMuteIsAvailable) {
1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultCommunicationDevice
1147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutDevice(
1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check for availability should not lead to initialization
1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultDevice
1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check all availiable devices
116064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->PlayoutDevices();
1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i));
1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->SpeakerIsInitialized());
1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneMuteIsAvailable) {
1169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultCommunicationDevice
1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check for availability should not lead to initialization
1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultDevice
1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check all availiable devices
118664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneBoostIsAvailable) {
1195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultCommunicationDevice
1199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check for availability should not lead to initialization
1203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check the kDefaultDevice
1207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // check all availiable devices
121264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  int16_t no_devices = audio_device_->RecordingDevices();
1213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < no_devices; i++) {
1214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingDevice(i));
1215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audio_device_->MicrophoneIsInitialized());
1217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SpeakerMuteTests) {
1221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled;
1223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetSpeakerMute(true));
1226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // requires initialization
1227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SpeakerMute(&enabled));
1228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve the mute state
1231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
1232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kDefaultCommunicationDevice));
1233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
1235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
1237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(true));
1238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(false));
1241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize kDefaultDevice and modify/retrieve the mute state
1247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
1248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
1251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(true));
1252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(false));
1255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize the default device (0) and modify/retrieve the mute state
1260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(0));
1261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available));
1262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitSpeaker());
1264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(true));
1265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetSpeakerMute(false));
1268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled));
1269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneMuteTests) {
1274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetMicrophoneMute(true));
1278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // requires initialization
1279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled;
1281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MicrophoneMute(&enabled));
1282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve the mute
1285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
1289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true));
1292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false));
1295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize kDefaultDevice and modify/retrieve the mute
1301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true));
1306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false));
1309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize the default device (0) and modify/retrieve the Mute
1314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(0));
1315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available));
1316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true));
1319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false));
1322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled));
1323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, MicrophoneBoostTests) {
1328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled;
1330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetMicrophoneBoost(true));
1334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // requires initialization
1335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->MicrophoneBoost(&enabled));
1336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve the boost
1339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetRecordingDevice(
1340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available)
1343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true));
1346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false));
1349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize kDefaultDevice and modify/retrieve the boost
1355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true));
1360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false));
1363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // reinitialize the default device (0) and modify/retrieve the boost
1368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(0));
1369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available));
1370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->InitMicrophone());
1372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true));
1373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false));
1376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled));
1377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StereoPlayoutTests) {
1382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->InitPlayout());
1386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
1387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
1393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // must be performed before initialization
1394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetStereoPlayout(true));
1395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensure that we can set the stereo mode for playout
1398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
1399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
1400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve stereo support
1402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
1403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled;
1406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available));
1407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(false));
1412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultDevice and modify/retrieve stereo support
1420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
1421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available));
1422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(false));
1427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize default device (0) and modify/retrieve stereo support
1435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(0));
1436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available));
1437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(false));
1442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoPlayout(true));
1445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled));
1446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StereoRecordingTests) {
1451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Playing());
1453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->InitRecording());
1456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
1457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitRecording());
1462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->RecordingIsInitialized());
1463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // must be performed before initialization
1464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetStereoRecording(true));
1465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ensures that we can set the stereo mode for recording
1467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRecording());
1468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->RecordingIsInitialized());
1469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve stereo support
1471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
1472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled;
1475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available));
1476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(true));
1478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
1481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultDevice and modify/retrieve stereo support
1486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available));
1488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(true));
1490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
1493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize default device (0) and modify/retrieve stereo support
1498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(0));
1499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available));
1500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(true));
1502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(enabled);
1504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
1505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->StereoRecording(&enabled));
1506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(enabled);
1507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingChannelTests) {
1511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // the user in Win Core Audio
1512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioDeviceModule::ChannelType channelType(AudioDeviceModule::kChannelBoth);
1513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Playing());
1515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
1518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetRecordingChannel(
1519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kChannelBoth));
1520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // initialize kDefaultCommunicationDevice and modify/retrieve stereo support
1522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(
1523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool available;
1525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available));
1526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (available) {
1527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetStereoRecording(true));
1528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingChannel(
1529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kChannelBoth));
1530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType));
1531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(AudioDeviceModule::kChannelBoth, channelType);
1532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingChannel(
1533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kChannelLeft));
1534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType));
1535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(AudioDeviceModule::kChannelLeft, channelType);
1536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->SetRecordingChannel(
1537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kChannelRight));
1538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType));
1539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(AudioDeviceModule::kChannelRight, channelType);
1540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutBufferTests) {
1544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  AudioDeviceModule::BufferType bufferType;
154564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t sizeMS(0);
1546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) || defined(ANDROID) || defined(WEBRTC_IOS)
1550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType);
1551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType);
1553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->InitPlayout());
1557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // must set device first
1558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
1559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->PlayoutIsInitialized());
1565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutBuffer(
1567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kAdaptiveBufferSize, 100) == -1);
1568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
1569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutBuffer(
1570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kFixedBufferSize, kAdmMinPlayoutBufferSizeMs-1) == -1);
1571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(audio_device_->SetPlayoutBuffer(
1572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kFixedBufferSize, kAdmMaxPlayoutBufferSizeMs+1) == -1);
1573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests (all should be successful)
1575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->PlayoutIsInitialized());
1576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kAdaptiveBufferSize, 0));
1579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType);
1581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kAdaptiveBufferSize, 10000));
1583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType);
1585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(ANDROID) || defined(WEBRTC_IOS)
1587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1,
1588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            audio_device_->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize,
1589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          kAdmMinPlayoutBufferSizeMs));
1590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kFixedBufferSize, kAdmMinPlayoutBufferSizeMs));
1593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType);
1595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(kAdmMinPlayoutBufferSizeMs, sizeMS);
1596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kFixedBufferSize, kAdmMaxPlayoutBufferSizeMs));
1598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType);
1600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(kAdmMaxPlayoutBufferSizeMs, sizeMS);
1601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kFixedBufferSize, 100));
1603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType);
1605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(100, sizeMS);
1606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // restore default
1610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutBuffer(
1611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioDeviceModule::kAdaptiveBufferSize, 0));
1612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS));
1613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutDelay) {
1617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: this API is better tested in a functional test
161864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t sizeMS(0);
1619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutDelay(&sizeMS));
1622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutDelay(&sizeMS));
1623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingDelay) {
1626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: this API is better tested in a functional test
162764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t sizeMS(0);
1628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingDelay(&sizeMS));
1632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingDelay(&sizeMS));
1633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, CPULoad) {
1636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: this API is better tested in a functional test
163764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint16_t load(0);
1638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->CPULoad(&load));
1642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, load);
1643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->CPULoad(&load));
1645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(kjellander): Fix flakiness causing failures on Windows.
1649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(phoglund):  Fix flakiness causing failures on Linux.
1650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(_WIN32) && !defined(WEBRTC_LINUX)
1651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StartAndStopRawOutputFileRecording) {
1652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: this API is better tested in a functional test
1653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->StartRawOutputFileRecording(NULL));
1657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording(
1660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_output_not_playing.pcm")));
1661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording());
1662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(
1663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      MACRO_DEFAULT_COMMUNICATION_DEVICE));
1664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartPlayout());
1669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording(
1672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_output_playing.pcm")));
1673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  SleepMs(100);
1674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording());
1675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
1676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording(
1677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_output_not_playing.pcm")));
1678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording());
1679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // results after this test:
1681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //
1682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // - size of raw_output_not_playing.pcm shall be 0
1683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // - size of raw_output_playing.pcm shall be > 0
1684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, StartAndStopRawInputFileRecording) {
1687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NOTE: this API is better tested in a functional test
1688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(audio_device_->Playing());
1690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // fail tests
1692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->StartRawInputFileRecording(NULL));
1693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawInputFileRecording(
1696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_input_not_recording.pcm")));
1697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawInputFileRecording());
1698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitRecording());
1703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRecording());
1704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawInputFileRecording(
1706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_input_recording.pcm")));
1707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  SleepMs(100);
1708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawInputFileRecording());
1709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRecording());
1710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRawInputFileRecording(
1711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      GetFilename("raw_input_not_recording.pcm")));
1712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRawInputFileRecording());
1713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // results after this test:
1715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //
1716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // - size of raw_input_not_recording.pcm shall be 0
1717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // - size of raw_input_not_recording.pcm shall be > 0
1718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // !WIN32 && !WEBRTC_LINUX
1720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, RecordingSampleRate) {
172264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t sampleRate(0);
1723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->RecordingSampleRate(&sampleRate));
1726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
1727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(48000, sampleRate);
1728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(ANDROID)
1729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TEST_LOG("Recording sample rate is %u\n\n", sampleRate);
1730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000));
1731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(WEBRTC_IOS)
1732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TEST_LOG("Recording sample rate is %u\n\n", sampleRate);
1733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000) ||
1734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              (sampleRate == 8000));
1735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // @TODO(xians) - add tests for all platforms here...
1738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, PlayoutSampleRate) {
174164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org  uint32_t sampleRate(0);
1742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // bulk tests
1744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->PlayoutSampleRate(&sampleRate));
1745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
1746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(48000, sampleRate);
1747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(ANDROID)
1748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TEST_LOG("Playout sample rate is %u\n\n", sampleRate);
1749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000));
1750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(WEBRTC_IOS)
1751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TEST_LOG("Playout sample rate is %u\n\n", sampleRate);
1752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000) ||
1753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              (sampleRate == 8000));
1754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, ResetAudioDevice) {
1758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialRecordingStates();
1760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
1761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE));
1762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_IOS)
1764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Not playing or recording, should just return 0
1765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->ResetAudioDevice());
1766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitRecording());
1768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRecording());
1769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartPlayout());
1771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int l=0; l<20; ++l)
1772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("Resetting sound device several time with pause %d ms\n", l);
1774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audio_device_->ResetAudioDevice());
1775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SleepMs(l);
1776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Fail tests
1779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->ResetAudioDevice());
1780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitRecording());
1784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartRecording());
1785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartPlayout());
1787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->ResetAudioDevice());
1789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopRecording());
1791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
1792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(AudioDeviceAPITest, SetPlayoutSpeaker) {
1795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CheckInitialPlayoutStates();
1796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE));
1797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool loudspeakerOn(false);
1799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_IOS)
1800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Not playing or recording, should just return a success
1801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(true));
18028fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org  EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn));
1803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(loudspeakerOn);
1804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(false));
18058fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org  EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn));
1806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(loudspeakerOn);
1807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartPlayout());
1810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(true));
18118fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org  EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn));
1812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(loudspeakerOn);
1813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(false));
18148fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org  EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn));
1815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(loudspeakerOn);
1816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Fail tests
1819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(true));
1820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(false));
1821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(true));
1822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(false));
1823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(kjellander): Fix so these tests pass on Mac.
1825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_MAC)
1826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->InitPlayout());
1827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StartPlayout());
1828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, audio_device_->GetLoudspeakerStatus(&loudspeakerOn));
1831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, audio_device_->StopPlayout());
1833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1834