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 <assert.h>
12bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include <ctype.h>
13bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include <stdio.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
17bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/test/func_test_manager.h"
18bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h"
19bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_config.h"
22bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_impl.h"
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef __GNUC__
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Disable warning message ('sprintf': name was marked as #pragma deprecated)
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma warning( disable : 4995 )
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Disable warning message 4996 ('scanf': This function or variable may be unsafe)
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma warning( disable : 4996 )
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedMicrophoneFile = "recorded_microphone_mono_48.pcm";
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedMicrophoneVolumeFile =
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org"recorded_microphone_volume_mono_48.pcm";
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedMicrophoneMuteFile = "recorded_microphone_mute_mono_48.pcm";
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedMicrophoneBoostFile =
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org"recorded_microphone_boost_mono_48.pcm";
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedMicrophoneAGCFile = "recorded_microphone_AGC_mono_48.pcm";
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* RecordedSpeakerFile = "recorded_speaker_48.pcm";
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Helper functions
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(WEBRTC_IOS)
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgchar* GetFilename(char* filename)
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return filename;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* GetFilename(const char* filename)
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return filename;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgchar* GetResource(char* resource)
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return resource;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* GetResource(const char* resource)
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return resource;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioEventObserver::AudioEventObserver(AudioDeviceModule* audioDevice)
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioEventObserver::~AudioEventObserver()
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid AudioEventObserver::OnErrorIsReported(const ErrorCode error)
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n[*** ERROR ***] => OnErrorIsReported(%d)\n \n", error);
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _error = error;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid AudioEventObserver::OnWarningIsReported(const WarningCode warning)
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n[*** WARNING ***] => OnWarningIsReported(%d)\n \n", warning);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _warning = warning;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioTransportImpl::AudioTransportImpl(AudioDeviceModule* audioDevice) :
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioDevice(audioDevice),
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playFromFile(false),
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _fullDuplex(false),
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _speakerVolume(false),
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _speakerMute(false),
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _microphoneVolume(false),
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _microphoneMute(false),
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _microphoneBoost(false),
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _microphoneAGC(false),
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _loopBackMeasurements(false),
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playFile(*FileWrapper::Create()),
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _recCount(0),
97083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    _playCount(0)
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _resampler.Reset(48000, 48000, kResamplerSynchronousStereo);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioTransportImpl::~AudioTransportImpl()
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playFile.Flush();
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playFile.CloseFile();
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete &_playFile;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
108083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    for (AudioPacketList::iterator iter = _audioList.begin();
109083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org         iter != _audioList.end(); ++iter) {
110083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            delete *iter;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ----------------------------------------------------------------------------
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//	AudioTransportImpl::SetFilePlayout
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ----------------------------------------------------------------------------
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t AudioTransportImpl::SetFilePlayout(bool enable, const char* fileName)
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playFromFile = enable;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (enable)
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return (_playFile.OpenFile(fileName, true, true, false));
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _playFile.Flush();
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return (_playFile.CloseFile());
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org;
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid AudioTransportImpl::SetFullDuplex(bool enable)
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _fullDuplex = enable;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    for (AudioPacketList::iterator iter = _audioList.begin();
137083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org         iter != _audioList.end(); ++iter) {
138083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            delete *iter;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
140083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    _audioList.clear();
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t AudioTransportImpl::RecordedDataIsAvailable(
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const void* audioSamples,
14564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t nSamples,
14664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint8_t nBytesPerSample,
14764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint8_t nChannels,
14864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t samplesPerSec,
14964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t totalDelayMS,
15064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const int32_t clockDrift,
15164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t currentMicLevel,
15228832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org    const bool keyPressed,
15364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t& newMicLevel)
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
155083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    if (_fullDuplex && _audioList.size() < 15)
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioPacket* packet = new AudioPacket();
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        memcpy(packet->dataBuffer, audioSamples, nSamples * nBytesPerSample);
15964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        packet->nSamples = (uint16_t) nSamples;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        packet->nBytesPerSample = nBytesPerSample;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        packet->nChannels = nChannels;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        packet->samplesPerSec = samplesPerSec;
163083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org        _audioList.push_back(packet);
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _recCount++;
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_recCount % 100 == 0)
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool addMarker(true);
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_loopBackMeasurements)
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addMarker = false;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_microphoneVolume)
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
17864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
17964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t minVolume(0);
18064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t volume(0);
18164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint16_t stepSize(0);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MaxMicrophoneVolume(&maxVolume));
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MinMicrophoneVolume(&minVolume));
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MicrophoneVolumeStepSize(&stepSize));
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MicrophoneVolume(&volume));
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (volume == 0)
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[0]");
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int stepScale = (int) ((maxVolume - minVolume) / (stepSize * 10));
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            volume += (stepScale * stepSize);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (volume > maxVolume)
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MAX]");
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                volume = 0;
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SetMicrophoneVolume(volume));
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_microphoneAGC)
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
20464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
20564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t minVolume(0);
20664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint16_t stepSize(0);
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MaxMicrophoneVolume(&maxVolume));
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MinMicrophoneVolume(&minVolume));
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MicrophoneVolumeStepSize(&stepSize));
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // emulate real AGC (min->max->min->max etc.)
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (currentMicLevel <= 1)
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MIN]");
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int stepScale = (int) ((maxVolume - minVolume) / (stepSize * 10));
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            newMicLevel = currentMicLevel + (stepScale * stepSize);
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (newMicLevel > maxVolume)
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MAX]");
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                newMicLevel = 1; // set lowest (non-zero) AGC level
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_microphoneMute && (_recCount % 500 == 0))
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            bool muted(false);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MicrophoneMute(&muted));
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            muted = !muted;
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SetMicrophoneMute(muted));
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (muted)
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MUTE ON]");
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } else
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MUTE OFF]");
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_microphoneBoost && (_recCount % 500 == 0))
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            bool boosted(false);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MicrophoneBoost(&boosted));
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            boosted = !boosted;
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SetMicrophoneBoost(boosted));
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (boosted)
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[BOOST ON]");
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } else
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[BOOST OFF]");
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if ((nChannels == 1) && addMarker)
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // mono
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("-");
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if ((nChannels == 2) && (nBytesPerSample == 2) && addMarker)
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            AudioDeviceModule::ChannelType
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                chType(AudioDeviceModule::kChannelLeft);
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->RecordingChannel(&chType));
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (chType == AudioDeviceModule::kChannelLeft)
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("-|");
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            else
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("|-");
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (addMarker)
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // stereo
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("--");
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (nChannels == 2 && nBytesPerSample == 2)
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // TEST_LOG("=> emulated mono (one channel exctracted from stereo input)\n");
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t AudioTransportImpl::NeedMorePlayData(
29064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t nSamples,
29164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint8_t nBytesPerSample,
29264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint8_t nChannels,
29364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const uint32_t samplesPerSec,
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void* audioSamples,
29522f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org    uint32_t& nSamplesOut,
29681f8df9af96c6b4bf43234f2a0162146a5da6112wu@webrtc.org    int64_t* elapsed_time_ms,
29722f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org    int64_t* ntp_time_ms)
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_fullDuplex)
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
301083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org        if (_audioList.empty())
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // use zero stuffing when not enough data
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            memset(audioSamples, 0, nBytesPerSample * nSamples);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
307083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            AudioPacket* packet = _audioList.front();
308083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            _audioList.pop_front();
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (packet)
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                int ret(0);
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                int lenOut(0);
31364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                int16_t tmpBuf_96kHz[80 * 12];
31464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                int16_t* ptr16In = NULL;
31564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                int16_t* ptr16Out = NULL;
31664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org
31764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                const uint16_t nSamplesIn = packet->nSamples;
31864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                const uint8_t nChannelsIn = packet->nChannels;
31964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                const uint32_t samplesPerSecIn = packet->samplesPerSec;
32064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                const uint16_t nBytesPerSampleIn =
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    packet->nBytesPerSample;
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                int32_t fsInHz(samplesPerSecIn);
32464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                int32_t fsOutHz(samplesPerSec);
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (fsInHz == 44100)
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    fsInHz = 44000;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (fsOutHz == 44100)
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    fsOutHz = 44000;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (nChannelsIn == 2 && nBytesPerSampleIn == 4)
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                {
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // input is stereo => we will resample in stereo
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    ret = _resampler.ResetIfNeeded(fsInHz, fsOutHz,
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   kResamplerSynchronousStereo);
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (ret == 0)
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    {
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (nChannels == 2)
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _resampler.Push(
34264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (const int16_t*) packet->dataBuffer,
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                2 * nSamplesIn,
34464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (int16_t*) audioSamples, 2
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                * nSamples, lenOut);
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        } else
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _resampler.Push(
34964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (const int16_t*) packet->dataBuffer,
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                2 * nSamplesIn, tmpBuf_96kHz, 2
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                * nSamples, lenOut);
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            ptr16In = &tmpBuf_96kHz[0];
35464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                            ptr16Out = (int16_t*) audioSamples;
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            // do stereo -> mono
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            for (unsigned int i = 0; i < nSamples; i++)
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            {
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                *ptr16Out = *ptr16In; // use left channel
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16Out++;
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16In++;
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16In++;
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            }
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        }
36564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                        assert(2*nSamples == (uint32_t)lenOut);
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } else
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    {
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (_playCount % 100 == 0)
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            TEST_LOG(
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     "ERROR: unable to resample from %d to %d\n",
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     samplesPerSecIn, samplesPerSec);
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                } else
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                {
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // input is mono (can be "reduced from stereo" as well) =>
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // we will resample in mono
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    ret = _resampler.ResetIfNeeded(fsInHz, fsOutHz,
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   kResamplerSynchronous);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (ret == 0)
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    {
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (nChannels == 1)
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _resampler.Push(
38464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (const int16_t*) packet->dataBuffer,
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                nSamplesIn,
38664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (int16_t*) audioSamples,
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                nSamples, lenOut);
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        } else
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _resampler.Push(
39164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                                (const int16_t*) packet->dataBuffer,
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                nSamplesIn, tmpBuf_96kHz, nSamples,
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                lenOut);
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            ptr16In = &tmpBuf_96kHz[0];
39664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                            ptr16Out = (int16_t*) audioSamples;
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            // do mono -> stereo
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            for (unsigned int i = 0; i < nSamples; i++)
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            {
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                *ptr16Out = *ptr16In; // left
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16Out++;
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                *ptr16Out = *ptr16In; // right (same as left sample)
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16Out++;
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                ptr16In++;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            }
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        }
40864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                        assert(nSamples == (uint32_t)lenOut);
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } else
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    {
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (_playCount % 100 == 0)
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            TEST_LOG("ERROR: unable to resample from %d to %d\n",
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     samplesPerSecIn, samplesPerSec);
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                nSamplesOut = nSamples;
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                delete packet;
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
4203b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org    }  // if (_fullDuplex)
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_playFromFile && _playFile.Open())
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
42464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        int16_t fileBuf[480];
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // read mono-file
42764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        int32_t len = _playFile.Read((int8_t*) fileBuf, 2
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            * nSamples);
42964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        if (len != 2 * (int32_t) nSamples)
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _playFile.Rewind();
43264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            _playFile.Read((int8_t*) fileBuf, 2 * nSamples);
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // convert to stero if required
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (nChannels == 1)
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            memcpy(audioSamples, fileBuf, 2 * nSamples);
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // mono sample from file is duplicated and sent to left and right
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // channels
44364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            int16_t* audio16 = (int16_t*) audioSamples;
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            for (unsigned int i = 0; i < nSamples; i++)
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                (*audio16) = fileBuf[i]; // left
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                audio16++;
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                (*audio16) = fileBuf[i]; // right
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                audio16++;
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
4523b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org    }  // if (_playFromFile && _playFile.Open())
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _playCount++;
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_playCount % 100 == 0)
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool addMarker(true);
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_speakerVolume)
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
46264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
46364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t minVolume(0);
46464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t volume(0);
46564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint16_t stepSize(0);
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MaxSpeakerVolume(&maxVolume));
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->MinSpeakerVolume(&minVolume));
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SpeakerVolumeStepSize(&stepSize));
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SpeakerVolume(&volume));
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (volume == 0)
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[0]");
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
47564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t step = (maxVolume - minVolume) / 10;
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            step = (step < stepSize ? stepSize : step);
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            volume += step;
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (volume > maxVolume)
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MAX]");
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                volume = 0;
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SetSpeakerVolume(volume));
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_speakerMute && (_playCount % 500 == 0))
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            bool muted(false);
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SpeakerMute(&muted));
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            muted = !muted;
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->SetSpeakerMute(muted));
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (muted)
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MUTE ON]");
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } else
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("[MUTE OFF]");
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addMarker = false;
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_loopBackMeasurements)
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
50664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint16_t recDelayMS(0);
50764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint16_t playDelayMS(0);
508083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            size_t nItemsInList(0);
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
510083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            nItemsInList = _audioList.size();
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->RecordingDelay(&recDelayMS));
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->PlayoutDelay(&playDelayMS));
513083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org            TEST_LOG("Delay (rec+play)+buf: %3zu (%3u+%3u)+%3zu [ms]\n",
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     recDelayMS + playDelayMS + 10 * (nItemsInList + 1),
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     recDelayMS, playDelayMS, 10 * (nItemsInList + 1));
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addMarker = false;
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if ((nChannels == 1) && addMarker)
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("+");
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if ((nChannels == 2) && addMarker)
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("++");
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
5273b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org    }  // if (_playCount % 100 == 0)
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    nSamplesOut = nSamples;
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
5340e6fa8c05cde2587e30dcf5e405132193d60dd42xians@webrtc.orgint AudioTransportImpl::OnDataAvailable(const int voe_channels[],
53544f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int number_of_voe_channels,
53644f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        const int16_t* audio_data,
53744f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int sample_rate,
53844f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int number_of_channels,
53944f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int number_of_frames,
54044f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int audio_delay_milliseconds,
54144f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        int current_volume,
54244f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        bool key_pressed,
54344f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org                                        bool need_audio_processing) {
54444f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org  return 0;
54544f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org}
54644f1239d9595c91f69f656e5beb1382463c4da8fxians@webrtc.org
54791d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.orgvoid AudioTransportImpl::PushCaptureData(int voe_channel,
54891d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                         const void* audio_data,
54991d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                         int bits_per_sample, int sample_rate,
55091d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                         int number_of_channels,
55191d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                         int number_of_frames) {}
55291d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org
55391d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.orgvoid AudioTransportImpl::PullRenderData(int bits_per_sample, int sample_rate,
55491d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                        int number_of_channels,
55591d88e1320d33fdc3648041bd941509e722f3ac4xians@webrtc.org                                        int number_of_frames,
55622f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org                                        void* audio_data,
55781f8df9af96c6b4bf43234f2a0162146a5da6112wu@webrtc.org                                        int64_t* elapsed_time_ms,
55822f69bd27abc89979460df6d01de8685cb058aabwu@webrtc.org                                        int64_t* ntp_time_ms) {}
55987c8b86c9f8a9929a2a564b2833244c6290e4701xians@webrtc.org
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFuncTestManager::FuncTestManager() :
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _processThread(NULL),
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioDevice(NULL),
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioEventObserver(NULL),
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport(NULL)
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _playoutFile48 = webrtc::test::ResourcePath("audio_device\\audio_short48",
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              "pcm");
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _playoutFile44 = webrtc::test::ResourcePath("audio_device\\audio_short44",
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              "pcm");
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _playoutFile16 = webrtc::test::ResourcePath("audio_device\\audio_short16",
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              "pcm");
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _playoutFile8 = webrtc::test::ResourcePath("audio_device\\audio_short8",
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "pcm");
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFuncTestManager::~FuncTestManager()
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::Init()
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((_processThread = ProcessThread::CreateProcessThread()) != NULL);
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_processThread == NULL)
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _processThread->Start();
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // create the Audio Device module
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE((_audioDevice = AudioDeviceModuleImpl::Create(
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        555, ADM_AUDIO_LAYER)) != NULL);
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(1, _audioDevice->AddRef());
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // register the Audio Device module
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _processThread->RegisterModule(_audioDevice);
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // register event observer
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioEventObserver = new AudioEventObserver(_audioDevice);
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, _audioDevice->RegisterEventObserver(_audioEventObserver));
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // register audio transport
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport = new AudioTransportImpl(_audioDevice);
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(_audioTransport));
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::Close()
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, _audioDevice->RegisterEventObserver(NULL));
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(NULL));
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, _audioDevice->Terminate());
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // release the ProcessThread object
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_processThread)
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _processThread->DeRegisterModule(_audioDevice);
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _processThread->Stop();
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ProcessThread::DestroyProcessThread(_processThread);
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // delete the audio observer
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioEventObserver)
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        delete _audioEventObserver;
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioEventObserver = NULL;
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // delete the audio transport
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioTransport)
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        delete _audioTransport;
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport = NULL;
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // release the AudioDeviceModule object
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice)
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->Release());
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioDevice = NULL;
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // return the ThreadWrapper (singleton)
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    Trace::ReturnTrace();
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // PRINT_TEST_RESULTS;
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
65564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::DoTest(const TestType testType)
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    switch (testType)
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTAll:
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestAudioLayerSelection();
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestDeviceEnumeration();
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestDeviceSelection();
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestAudioTransport();
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestSpeakerVolume();
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestMicrophoneVolume();
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestLoopback();
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTAudioLayerSelection:
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestAudioLayerSelection();
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTDeviceEnumeration:
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestDeviceEnumeration();
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTDeviceSelection:
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestDeviceSelection();
675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTAudioTransport:
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestAudioTransport();
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTSpeakerVolume:
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestSpeakerVolume();
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTMicrophoneVolume:
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestMicrophoneVolume();
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTSpeakerMute:
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestSpeakerMute();
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTMicrophoneMute:
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestMicrophoneMute();
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTMicrophoneBoost:
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestMicrophoneBoost();
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTMicrophoneAGC:
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestMicrophoneAGC();
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTLoopback:
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestLoopback();
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTDeviceRemoval:
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestDeviceRemoval();
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTMobileAPI:
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestAdvancedMBAPI();
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case TTTest:
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TestExtra();
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        default:
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestAudioLayerSelection()
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Audio Layer test:\n");
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule::AudioLayer audioLayer;
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->ActiveAudioLayer(&audioLayer));
732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio\n \n");
736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio\n \n");
739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (audioLayer == AudioDeviceModule::kLinuxAlsaAudio)
740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nActiveAudioLayer: kLinuxAlsaAudio\n \n");
742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (audioLayer == AudioDeviceModule::kLinuxPulseAudio)
743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nActiveAudioLayer: kLinuxPulseAudio\n \n");
745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nActiveAudioLayer: INVALID\n \n");
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char ch;
751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool tryWinWave(false);
752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool tryWinCore(false);
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("Would you like to try kWindowsCoreAudio instead "
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "[requires Win Vista or Win 7] (Y/N)?\n: ");
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(scanf(" %c", &ch) > 0);
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ch = toupper(ch);
760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (ch == 'Y')
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            tryWinCore = true;
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("Would you like to try kWindowsWaveAudio instead (Y/N)?\n: ");
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(scanf(" %c", &ch) > 0);
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ch = toupper(ch);
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (ch == 'Y')
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            tryWinWave = true;
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (tryWinWave || tryWinCore)
776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // =======================================
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // First, close down what we have started
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // terminate
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RegisterEventObserver(NULL));
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(NULL));
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->Terminate());
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // release the ProcessThread object
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_processThread)
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _processThread->DeRegisterModule(_audioDevice);
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _processThread->Stop();
790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            ProcessThread::DestroyProcessThread(_processThread);
791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // delete the audio observer
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_audioEventObserver)
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            delete _audioEventObserver;
797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioEventObserver = NULL;
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // delete the audio transport
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_audioTransport)
802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            delete _audioTransport;
804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport = NULL;
805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // release the AudioDeviceModule object
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_audioDevice)
809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, _audioDevice->Release());
811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioDevice = NULL;
812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ==================================================
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Next, try to make fresh start with new audio layer
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE((_processThread = ProcessThread::CreateProcessThread()) != NULL);
818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_processThread == NULL)
819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _processThread->Start();
823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // create the Audio Device module based on selected audio layer
825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (tryWinWave)
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioDevice = AudioDeviceModuleImpl::Create(
828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                555,
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                AudioDeviceModule::kWindowsWaveAudio);
830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (tryWinCore)
831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioDevice = AudioDeviceModuleImpl::Create(
833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                555,
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                AudioDeviceModule::kWindowsCoreAudio);
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_audioDevice == NULL)
838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Switch of audio layer failed!\n");
840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // restore default audio layer instead
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_TRUE((_audioDevice = AudioDeviceModuleImpl::Create(
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                555, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_audioDevice == NULL)
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Failed to revert back to default audio layer!\n");
848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(1, _audioDevice->AddRef());
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // register the Audio Device module
854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _processThread->RegisterModule(_audioDevice);
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // register event observer
857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioEventObserver = new AudioEventObserver(_audioDevice);
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RegisterEventObserver(_audioEventObserver));
859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // register audio transport
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport = new AudioTransportImpl(_audioDevice);
862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(_audioTransport));
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->ActiveAudioLayer(&audioLayer));
865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (tryWinCore)
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio <=> "
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "switch was *not* possible\n \n");
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            else
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio <=> "
873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "switch was possible\n \n");
874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (tryWinWave)
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio <=> "
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "switch was *not* possible\n \n");
879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            else
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio <=> "
881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "switch was possible\n \n");
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
8833b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org    }  // if (tryWinWave || tryWinCore)
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestDeviceEnumeration()
891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Device Enumeration test:\n");
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char name[kAdmMaxDeviceNameSize];
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char guid[kAdmMaxGuidSize];
910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
91164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const int16_t nPlayoutDevices(audioDevice->PlayoutDevices());
912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(nPlayoutDevices >= 0);
913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nPlayoutDevices: %u\n \n", nPlayoutDevices);
914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int n = 0; n < nPlayoutDevices; n++)
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutDeviceName(n, name, guid));
917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "PlayoutDeviceName(%d) :   name=%s \n \
919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	                 guid=%s\n",
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 n, name, guid);
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // default (-1)
92522c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org    // TODO(henrika): fix below test.
92622c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#if 0
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutDeviceName(-1, name, guid));
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("PlayoutDeviceName(%d):   default name=%s \n \
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	                 default guid=%s\n", -1, name, guid);
93022c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#endif  // 0
931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // should fail
933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audioDevice->PlayoutDeviceName(-1, name, guid));
934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    const int16_t nRecordingDevices(audioDevice->RecordingDevices());
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(nRecordingDevices >= 0);
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nRecordingDevices: %u\n \n", nRecordingDevices);
939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int n = 0; n < nRecordingDevices; n++)
940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingDeviceName(n, name, guid));
942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "RecordingDeviceName(%d) : name=%s \n \
944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	                 guid=%s\n",
945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 n, name, guid);
946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // default (-1)
95022c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org    // TODO(henrika): fix below test.
95122c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#if 0
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingDeviceName(-1, name, guid));
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("RecordingDeviceName(%d): default name=%s \n \
954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	                 default guid=%s\n", -1, name, guid);
95522c283b04855b8775d323e8788a0438ce2d7c2b5henrike@webrtc.org#endif
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // should fail
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audioDevice->PlayoutDeviceName(-1, name, guid));
959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestDeviceSelection()
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Device Selection test:\n");
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define PRINT_HEADING(a, b) \
983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{ \
984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		TEST_LOG("Set" #a "Device(" #b ") => \n"); \
985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} \
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define PRINT_HEADING_IDX(a, b,c ) \
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{ \
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		TEST_LOG("Set" #a "Device(%d) (%s) => \n", b, c); \
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} \
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define PRINT_STR(a, b) \
993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{ \
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                char str[128]; \
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                (b == true) ? (sprintf(str, "  %-17s: available\n", #a)) : (sprintf(str, "  %-17s: NA\n", #a)); \
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("%s", str); \
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} \
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
100564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int16_t nDevices(-1);
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char name[kAdmMaxDeviceNameSize];
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char guid[kAdmMaxGuidSize];
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // =======
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Playout
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    nDevices = audioDevice->PlayoutDevices();
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(nDevices >= 0);
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->SetPlayoutDevice(
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_HEADING(Playout, kDefaultCommunicationDevice);
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Playout, available);
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Playout, available);
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Playout, false);
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Speaker Volume, available);
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Speaker Mute, available);
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_HEADING(Playout, kDefaultDevice);
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Playout, available);
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Playout, available);
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Playout, false);
1048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Speaker Volume, available);
1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Speaker Mute, available);
1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->SetPlayoutDevice(
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kDefaultCommunicationDevice) == -1);
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SetPlayoutDevice(i));
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutDeviceName(i, name, guid));
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_HEADING_IDX(Playout, i, name);
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Playout, available);
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PRINT_STR(Stereo Playout, available);
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PRINT_STR(Stereo Playout, false);
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Speaker Volume, available);
1076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
1077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Speaker Mute, available);
1078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // =========
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Recording
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    nDevices = audioDevice->RecordingDevices();
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(nDevices >= 0);
1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->SetRecordingDevice(
1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kDefaultCommunicationDevice) == 0);
1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_HEADING(Recording, kDefaultCommunicationDevice);
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Recording, available);
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Recording, available);
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // special fix to ensure that we don't log 'available' when recording is not OK
1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Recording, false);
1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Volume, available);
1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Mute, available);
1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Boost, available);
1109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice));
1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_HEADING(Recording, kDefaultDevice);
1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Recording, available);
1114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Recording, available);
1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // special fix to ensure that we don't log 'available' when recording is not OK
1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Stereo Recording, false);
1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Volume, available);
1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Mute, available);
1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
1129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_STR(Microphone Boost, available);
1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
1131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->SetRecordingDevice(
1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioDeviceModule::kDefaultCommunicationDevice) == -1);
1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(-1, audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice));
1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SetRecordingDevice(i));
1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingDeviceName(i, name, guid));
1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_HEADING_IDX(Recording, i, name);
1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Recording, available);
1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
1146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PRINT_STR(Stereo Recording, available);
1147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else
1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // special fix to ensure that we don't log 'available' when recording
1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // is not OK
1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PRINT_STR(Stereo Recording, false);
1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Microphone Volume, available);
1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Microphone Mute, available);
1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PRINT_STR(Microphone Boost, available);
1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
116964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestAudioTransport()
1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Audio Transport test:\n");
1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool recIsAvailable(false);
1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool playIsAvailable(false);
1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
1191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
1197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!recIsAvailable)
1198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
1200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "\nWARNING: Recording is not available for the selected device!\n \n");
1201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
1210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable && playIsAvailable)
1211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
1213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (!playIsAvailable)
1214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
1216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "\nWARNING: Playout is not available for the selected device!\n \n");
1217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
122064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t samplesPerSec(0);
1221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (playIsAvailable)
1223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // =========================================
1225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Start by playing out an existing PCM file
1226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
1228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
123064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
1231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->MaxSpeakerVolume(&maxVolume));
1232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetSpeakerVolume(maxVolume/2));
1233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
1239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (samplesPerSec == 48000) {
1240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile48.c_str()));
1242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (samplesPerSec == 44100 || samplesPerSec == 44000) {
1243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile44.c_str()));
1245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (samplesPerSec == 16000) {
1246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile16.c_str()));
1248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (samplesPerSec == 8000) {
1249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile8.c_str()));
1251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
1252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Sample rate (%u) is not supported!\n \n",
1253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     samplesPerSec);
1254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
1255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioDevice->Playing())
1259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\n> Listen to the file being played (fs=%d) out "
1261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "and verify that the audio quality is OK.\n"
1262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Press any key to stop playing...\n \n",
1263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                samplesPerSec);
1264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PAUSE(DEFAULT_PAUSE_TIME);
1265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopPlayout());
1268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFilePlayout(false);
1271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
1274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable)
1275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ====================================
1277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Next, record from microphone to file
1278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
128264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
1283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
1284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
1285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(audioDevice->StartRawInputFileRecording(
1288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            GetFilename(RecordedMicrophoneFile)) == 0);
1289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
1292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
1293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
1294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // ensure file recording in mono
1296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
1297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
1299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        SleepMs(100);
1300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(audioDevice->Recording());
1302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioDevice->Recording())
1303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\n \n> The microphone input signal is now being recorded "
1305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "to a PCM file.\n"
1306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Speak into the microphone to ensure that your voice is"
1307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                " recorded.\n> Press any key to stop recording...\n \n");
1308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PAUSE(DEFAULT_PAUSE_TIME);
1309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
1312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
1313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelBoth));
1315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRecording());
1317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
1319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable && playIsAvailable)
1322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ==========================
1324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Play out the recorded file
1325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFilePlayout(true,
1327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        GetFilename(RecordedMicrophoneFile));
1328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->InitPlayout());
1334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StartPlayout());
1335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            SleepMs(100);
1336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE(audioDevice->Playing());
1339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioDevice->Playing())
1340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\n \n> Listen to the recorded file and verify that the "
1342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "audio quality is OK.\n"
1343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Press any key to stop listening...\n \n");
1344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PAUSE(DEFAULT_PAUSE_TIME);
1345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopPlayout());
1348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFilePlayout(false);
1351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable && playIsAvailable)
1354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ==============================
1356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Finally, make full duplex test
1357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        uint32_t playSamplesPerSec(0);
135964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        uint32_t recSamplesPerSecRec(0);
1360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
1364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
1367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
136864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
1369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
1370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
1371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
1374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
1376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
1377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (playSamplesPerSec != recSamplesPerSecRec)
1378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: sample rates does not match (fs_play=%u, fs_rec=%u)",
1380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     playSamplesPerSec, recSamplesPerSecRec);
1381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StopRecording());
1382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StopPlayout());
1383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFullDuplex(false);
1385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
1386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
1389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        SleepMs(100);
1391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioDevice->Playing() && audioDevice->Recording())
1393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\n \n> Full duplex audio (fs=%u) is now active.\n"
1395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Speak into the microphone and verify that your voice is "
1396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "played out in loopback.\n> Press any key to stop...\n \n",
1397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     playSamplesPerSec);
1398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PAUSE(DEFAULT_PAUSE_TIME);
1399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRecording());
1402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopPlayout());
1403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(false);
1406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
1409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
1410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
141764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestSpeakerVolume()
1418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Speaker Volume test:\n");
1421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
144264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t startVolume(0);
144364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t samplesPerSec(0);
1444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
1446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetSpeakerVolume(true);
1449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Volume control is not available for the selected "
1452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "device!\n \n");
1453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial volume setting
1457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitSpeaker());
1458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerVolume(&startVolume));
1459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // start at volume 0
1461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetSpeakerVolume(0));
1462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ======================================
1464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start playing out an existing PCM file
1465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
1472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (48000 == samplesPerSec) {
1473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile48.c_str()));
1475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (44100 == samplesPerSec || samplesPerSec == 44000) {
1476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile44.c_str()));
1478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (samplesPerSec == 16000) {
1479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile16.c_str()));
1481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (samplesPerSec == 8000) {
1482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(
1483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                true, GetResource(_playoutFile8.c_str()));
1484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
1485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Sample rate (%d) is not supported!\n \n",
1486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     samplesPerSec);
1487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
1488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
1493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Playing())
1494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Listen to the file being played out and verify that the "
1496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "selected speaker volume is varied between [~0] and [~MAX].\n"
1497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> The file shall be played out with an increasing volume level "
1498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "correlated to the speaker volume.\n"
1499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> Press any key to stop playing...\n \n");
1500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(10000);
1501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
1504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetSpeakerVolume(false);
1507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFilePlayout(false);
1508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore volume setting
1510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetSpeakerVolume(startVolume));
1511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestSpeakerMute()
1519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Speaker Mute test:\n");
1522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
1543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool startMute(false);
154464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t samplesPerSec(0);
1545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
1547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetSpeakerMute(true);
1550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
1553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "\nERROR: Mute control is not available for the selected"
1554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 " device!\n \n");
1555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial mute setting
1559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitSpeaker());
1560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SpeakerMute(&startMute));
1561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // start with no mute
1563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetSpeakerMute(false));
1564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ======================================
1566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start playing out an existing PCM file
1567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
1574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (48000 == samplesPerSec)
1575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(true, _playoutFile48.c_str());
1576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else if (44100 == samplesPerSec || 44000 == samplesPerSec)
1577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFilePlayout(true, _playoutFile44.c_str());
1578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else
1579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Sample rate (%d) is not supported!\n \n",
1581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     samplesPerSec);
1582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
1583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
1588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Playing())
1589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Listen to the file being played out and verify that the"
1591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " selected speaker mute control is toggled between [MUTE ON] and"
1592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " [MUTE OFF].\n> You should only hear the file during the"
1593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " 'MUTE OFF' periods.\n"
1594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> Press any key to stop playing...\n \n");
1595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
1596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
1599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetSpeakerMute(false);
1602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFilePlayout(false);
1603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore mute setting
1605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetSpeakerMute(startMute));
1606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
161364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestMicrophoneVolume()
1614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Microphone Volume test:\n");
1617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
1632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
1638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
1639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetMicrophoneVolume(true);
1642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Volume control is not available for the selected "
1645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "device!\n \n");
1646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
1659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Playout is not available for the selected "
1662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "device!\n \n");
1663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nEnable recording of microphone input to file (%s) during this"
1667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        " test (Y/N)?\n: ",
1668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             RecordedMicrophoneVolumeFile);
1669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char ch;
1670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool fileRecording(false);
1671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf(" %c", &ch) > 0);
1672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ch = toupper(ch);
1673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ch == 'Y')
1674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fileRecording = true;
1676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t startVolume(0);
1679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
1680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial volume setting
1682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitMicrophone());
1683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolume(&startVolume));
1684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // start at volume 0
1686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(0));
1687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ======================================================================
1689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start recording from the microphone while the mic volume is changed
1690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // continuously.
1691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Also, start playing out the input to enable real-time verification.
1692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
1694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneVolumeFile));
1696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
1702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
1703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
1704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // ensures a mono file
1706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelRight));
1707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
1709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Recording());
1718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
1719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
1720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the selected "
1722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "microphone volume is varied between [~0] and [~MAX].\n"
1723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> You should hear your own voice with an increasing volume level"
1724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " correlated to the microphone volume.\n"
1725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> After a finalized test (and if file recording was enabled) "
1726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "verify the recorded result off line.\n"
1727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> Press any key to stop...\n \n");
1728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
1729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
1732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
1734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopRecording());
1736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
1737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
1739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetMicrophoneVolume(false);
1741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(false);
1742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore volume setting
1744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(startVolume));
1745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestMicrophoneMute()
1753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Microphone Mute test:\n");
1756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
1771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
1777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
1778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetMicrophoneMute(true);
1781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Mute control is not available for the selected"
1784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " device!\n \n");
1785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
1798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Playout is not available for the selected "
1801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "device!\n \n");
1802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nEnable recording of microphone input to file (%s) during this "
1806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "test (Y/N)?\n: ",
1807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        RecordedMicrophoneMuteFile);
1808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char ch;
1809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool fileRecording(false);
1810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf(" %c", &ch) > 0);
1811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ch = toupper(ch);
1812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ch == 'Y')
1813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fileRecording = true;
1815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool startMute(false);
1818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
1819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial volume setting
1821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitMicrophone());
1822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneMute(&startMute));
1823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // start at no mute
1825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneMute(false));
1826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ==================================================================
1828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start recording from the microphone while the mic mute is toggled
1829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // continuously.
1830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Also, start playing out the input to enable real-time verification.
1831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
1833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneMuteFile));
1835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
1841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
1842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
1843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // ensure file recording in mono
1845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
1846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
1848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Recording());
1857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
1858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
1859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the selected "
1861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "microphone mute control is toggled between [MUTE ON] and [MUTE OFF]."
1862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "\n> You should only hear your own voice in loopback during the"
1863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " 'MUTE OFF' periods.\n> After a finalized test (and if file "
1864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "recording was enabled) verify the recorded result off line.\n"
1865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> Press any key to stop...\n \n");
1866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
1867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
1870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
1872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopRecording());
1874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
1875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
1876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetMicrophoneMute(false);
1878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(false);
1879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore volume setting
1881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneMute(startMute));
1882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
1884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
1885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
188964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestMicrophoneBoost()
1890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
1892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Microphone Boost test:\n");
1893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
1894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
1896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
1901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
1903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
1905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
1906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
1908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
1914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
1915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetMicrophoneBoost(true);
1918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(
1921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "\nERROR: Boost control is not available for the selected device!\n \n");
1922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
1926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
1928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
1935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
1936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
1938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
1939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nEnable recording of microphone input to file (%s) during this "
1942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "test (Y/N)?\n: ",
1943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        RecordedMicrophoneBoostFile);
1944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char ch;
1945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool fileRecording(false);
1946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf(" %c", &ch) > 0);
1947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ch = toupper(ch);
1948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ch == 'Y')
1949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fileRecording = true;
1951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool startBoost(false);
1954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
1955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial volume setting
1957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitMicrophone());
1958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneBoost(&startBoost));
1959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // start at no boost
1961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneBoost(false));
1962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ==================================================================
1964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start recording from the microphone while the mic boost is toggled
1965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // continuously.
1966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Also, start playing out the input to enable real-time verification.
1967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
1969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneBoostFile));
1971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
1973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
1974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
1977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
1978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
1979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
1980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // ensure file recording in mono
1981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
1982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
1984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
1986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
1987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
1989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
1990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Recording());
1993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
1994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
1995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the selected "
1997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "microphone boost control is toggled between [BOOST ON] and [BOOST OFF].\n"
1998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> You should hear your own voice with an increased volume level "
1999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "during the 'BOOST ON' periods.\n \n"
2000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> After a finalized test (and if file recording was enabled) verify"
2001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " the recorded result off line.\n"
2002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "> Press any key to stop...\n \n");
2003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
2004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
2007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
2009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopRecording());
2011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
2012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
2013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetMicrophoneBoost(false);
2015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(false);
2016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore boost setting
2018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneBoost(startBoost));
2019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
202664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestMicrophoneAGC()
2027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
2028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
2029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Microphone AGC test:\n");
2030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
2031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
2033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
2038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
2040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
2042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
2043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
2045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
2051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
2052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
2053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetMicrophoneAGC(true);
2055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
2056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: It is not possible to control the microphone volume"
2058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " for the selected device!\n \n");
2059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
2063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
2069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
2070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
2072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
2073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
2075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nEnable recording of microphone input to file (%s) during "
2079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "this test (Y/N)?\n: ",
2080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        RecordedMicrophoneAGCFile);
2081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char ch;
2082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool fileRecording(false);
2083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf(" %c", &ch) > 0);
2084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ch = toupper(ch);
2085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ch == 'Y')
2086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fileRecording = true;
2088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
209064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint32_t startVolume(0);
2091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
2092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // store initial volume setting
2094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitMicrophone());
2095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->MicrophoneVolume(&startVolume));
2096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ====================================================================
2098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start recording from the microphone while the mic volume is changed
2099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // continuously
2100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // by the emulated AGC (implemented by our audio transport).
2101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Also, start playing out the input to enable real-time verification.
2102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
2104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneAGCFile));
2106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
2108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
2109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
2110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->SetAGC(true));
2112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
2113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
2114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enabled)
2115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // ensures a mono file
2117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelRight));
2118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
2120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
2122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (available)
2123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
2125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
2126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->AGC());
2129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Recording());
2130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
2131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
2132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the volume of"
2134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " the selected microphone is varied between [~0] and [~MAX].\n"
2135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> You should hear your own voice with an increasing volume level"
2136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " correlated to an emulated AGC setting.\n"
2137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> After a finalized test (and if file recording was enabled) verify"
2138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            " the recorded result off line.\n"
2139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "> Press any key to stop...\n \n");
2140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
2141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fileRecording)
2144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
2146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetAGC(false));
2148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopRecording());
2149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
2150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
2151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
2152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetMicrophoneAGC(false);
2154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(false);
2155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // restore volume setting
2157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(startVolume));
2158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
216564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestLoopback()
2166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
2167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
2168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Loopback measurement test:\n");
2169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
2170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
2172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
2177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
2179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
2181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
2182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool recIsAvailable(false);
2184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool playIsAvailable(false);
218564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint8_t nPlayChannels(0);
218664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint8_t nRecChannels(0);
2187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
2189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
2195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!recIsAvailable)
2196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Recording is not available for the selected device!\n \n");
2198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
2202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
2208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable && playIsAvailable)
2209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
2211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetLoopbackMeasurements(true);
2212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (!playIsAvailable)
2213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
2215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool enabled(false);
2219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool available(false);
2220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (recIsAvailable && playIsAvailable)
2222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
222364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        uint32_t playSamplesPerSec(0);
222464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org        uint32_t recSamplesPerSecRec(0);
2225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
2227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(true);
2229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
2231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
2232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetStereoRecording(true));
2234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
2237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
2238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetStereoPlayout(true));
2240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
2243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (available)
2244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
224564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t maxVolume(0);
2246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
2247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
2248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitRecording());
2251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->InitPlayout());
2252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
2253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
2254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoPlayout(&enabled));
2255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        enabled ? nPlayChannels = 2 : nPlayChannels = 1;
2256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
2257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        enabled ? nRecChannels = 2 : nRecChannels = 1;
2258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartRecording());
2259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StartPlayout());
2260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (audioDevice->Playing() && audioDevice->Recording())
2262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\n \n> Loopback audio is now active.\n"
2264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "> Rec : fs=%u, #channels=%u.\n"
2265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Play: fs=%u, #channels=%u.\n"
2266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Speak into the microphone and verify that your voice is"
2267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "  played out in loopback.\n"
2268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                "> Press any key to stop...\n \n",
2269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                recSamplesPerSecRec, nRecChannels, playSamplesPerSec,
2270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                nPlayChannels);
2271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            PAUSE(30000);
2272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopRecording());
2275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->StopPlayout());
2276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
2277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetFullDuplex(false);
2279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _audioTransport->SetLoopbackMeasurements(false);
2280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
2283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
2284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestDeviceRemoval()
2292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
2293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
2294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Device removal test:\n");
2295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
2296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
2298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
2303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
2305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
2307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
2308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool recIsAvailable(false);
2310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool playIsAvailable(false);
231164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint8_t nPlayChannels(0);
231264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint8_t nRecChannels(0);
231364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    uint8_t loopCount(0);
2314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (loopCount < 2)
2316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (SelectRecordingDevice() == -1)
2318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Device selection failed!\n \n");
2320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
2321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
2324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!recIsAvailable)
2325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Recording is not available for the selected device!\n \n");
2327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
2328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (SelectPlayoutDevice() == -1)
2331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Device selection failed!\n \n");
2333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
2334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
2337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (recIsAvailable && playIsAvailable)
2338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFullDuplex(true);
2340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (!playIsAvailable)
2341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
2343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
2344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool available(false);
2347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool enabled(false);
2348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (recIsAvailable && playIsAvailable)
2350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
235164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t playSamplesPerSec(0);
235264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org            uint32_t recSamplesPerSecRec(0);
2353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
2355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFullDuplex(true);
2357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
2359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (available)
2360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
2361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                EXPECT_EQ(0, audioDevice->SetStereoRecording(true));
2362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
2363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
2365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (available)
2366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
2367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                EXPECT_EQ(0, audioDevice->SetStereoPlayout(true));
2368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
2369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
2371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (available)
2372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
237364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org                uint32_t maxVolume(0);
2374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
2375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
2376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
2377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->InitRecording());
2379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->InitPlayout());
2380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
2381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
2382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoPlayout(&enabled));
2383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            enabled ? nPlayChannels = 2 : nPlayChannels = 1;
2384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
2385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            enabled ? nRecChannels = 2 : nRecChannels = 1;
2386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StartRecording());
2387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StartPlayout());
2388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            AudioDeviceModule::AudioLayer audioLayer;
2390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->ActiveAudioLayer(&audioLayer));
2391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (audioLayer == AudioDeviceModule::kLinuxPulseAudio)
2393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
2394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\n \n> PulseAudio loopback audio is now active.\n"
2395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "> Rec : fs=%u, #channels=%u.\n"
2396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "> Play: fs=%u, #channels=%u.\n"
2397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "> Speak into the microphone and verify that your voice is"
2398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    " played out in loopback.\n"
2399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "> Unplug the device and make sure that your voice is played"
2400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    " out in loop back on the built-in soundcard.\n"
2401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "> Then press any key...\n",
2402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         recSamplesPerSecRec, nRecChannels, playSamplesPerSec,
2403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         nPlayChannels);
2404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                PAUSE(DEFAULT_PAUSE_TIME);
2406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } else if (audioDevice->Playing() && audioDevice->Recording())
2407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
2408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (loopCount < 1)
2409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                {
2410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    TEST_LOG("\n \n> Loopback audio is now active.\n"
2411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Rec : fs=%u, #channels=%u.\n"
2412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Play: fs=%u, #channels=%u.\n"
2413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Speak into the microphone and verify that your voice"
2414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        " is played out in loopback.\n"
2415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Unplug the device and wait for the error message...\n",
2416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        recSamplesPerSecRec, nRecChannels,
2417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        playSamplesPerSec, nPlayChannels);
2418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _audioEventObserver->_error
2420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        = (AudioDeviceObserver::ErrorCode) (-1);
2421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    while (_audioEventObserver->_error
2422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        == (AudioDeviceObserver::ErrorCode) (-1))
2423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    {
2424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        SleepMs(500);
2425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
2426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                } else
2427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                {
2428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    TEST_LOG("\n \n> Loopback audio is now active.\n"
2429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Rec : fs=%u, #channels=%u.\n"
2430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Play: fs=%u, #channels=%u.\n"
2431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Speak into the microphone and verify that your voice"
2432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        " is played out in loopback.\n"
2433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        "> Press any key to stop...\n",
2434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             recSamplesPerSecRec, nRecChannels,
2435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             playSamplesPerSec, nPlayChannels);
2436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    PAUSE(DEFAULT_PAUSE_TIME);
2438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
2439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
2440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StopRecording());
2442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->StopPlayout());
2443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
2444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioTransport->SetFullDuplex(false);
2446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (loopCount < 1)
2448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
2449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("\n \n> Stopped!\n");
2450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("> Now reinsert device if you want to enumerate it.\n");
2451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                TEST_LOG("> Press any key when done.\n");
2452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                PAUSE(DEFAULT_PAUSE_TIME);
2453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
2454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            loopCount++;
2456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
24573b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org    }  // loopCount
2458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
2460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
2461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
246864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestExtra()
2469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
2470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
2471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Extra test:\n");
2472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
2473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
2475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
2480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
2482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
2484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
2485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Terminate());
2487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(audioDevice->Initialized());
2488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
249564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::SelectRecordingDevice()
2496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
249764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int16_t nDevices = _audioDevice->RecordingDevices();
2498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char name[kAdmMaxDeviceNameSize];
2499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char guid[kAdmMaxGuidSize];
250064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int32_t ret(-1);
2501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
2503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nSelect Recording Device\n \n");
2504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("  (%d) Default\n", 0);
2505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("  (%d) Default Communication [Win 7]\n", 1);
2506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n");
2507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
2508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RecordingDeviceName(i, name, guid));
2510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(" (%d) Device %d (%s)\n", i+10, i, name);
2511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n: ");
2513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int sel(0);
2515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    scanf("%u", &sel);
2517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (sel == 0)
2519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice)));
2521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else if (sel == 1)
2523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE((ret = _audioDevice->SetRecordingDevice(
2525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            AudioDeviceModule::kDefaultCommunicationDevice)) == 0);
2526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else if (sel < (nDevices+10))
2528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(sel-10)));
2530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
2532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
2536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nSelect Recording Device\n \n");
2537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
2538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->RecordingDeviceName(i, name, guid));
2540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(" (%d) Device %d (%s)\n", i, i, name);
2541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n: ");
2543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int sel(0);
2544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf("%u", &sel) > 0);
2545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (sel < (nDevices))
2546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(sel)));
2548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
2549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
2553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return ret;
2555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
255764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::SelectPlayoutDevice()
2558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
255964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int16_t nDevices = _audioDevice->PlayoutDevices();
2560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char name[kAdmMaxDeviceNameSize];
2561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char guid[kAdmMaxGuidSize];
2562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32
2564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nSelect Playout Device\n \n");
2565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("  (%d) Default\n", 0);
2566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("  (%d) Default Communication [Win 7]\n", 1);
2567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n");
2568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
2569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->PlayoutDeviceName(i, name, guid));
2571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(" (%d) Device %d (%s)\n", i+10, i, name);
2572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n: ");
2574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int sel(0);
2576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    scanf("%u", &sel);
2578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
257964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int32_t ret(0);
2580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (sel == 0)
2582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE((ret = _audioDevice->SetPlayoutDevice(
2584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            AudioDeviceModule::kDefaultDevice)) == 0);
2585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else if (sel == 1)
2587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_TRUE((ret = _audioDevice->SetPlayoutDevice(
2589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            AudioDeviceModule::kDefaultCommunicationDevice)) == 0);
2590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else if (sel < (nDevices+10))
2592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, (ret = _audioDevice->SetPlayoutDevice(sel-10)));
2594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
2596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
2600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nSelect Playout Device\n \n");
2601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nDevices; i++)
2602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, _audioDevice->PlayoutDeviceName(i, name, guid));
2604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG(" (%d) Device %d (%s)\n", i, i, name);
2605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n: ");
2607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int sel(0);
2608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(scanf("%u", &sel) > 0);
260964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int32_t ret(0);
2610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (sel < (nDevices))
2611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, (ret = _audioDevice->SetPlayoutDevice(sel)));
2613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else
2614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
2618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return ret;
2620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
262264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgint32_t FuncTestManager::TestAdvancedMBAPI()
2623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
2624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n=======================================\n");
2625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG(" Advanced mobile device API test:\n");
2626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("=======================================\n");
2627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_audioDevice == NULL)
2629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RESET_TEST;
2634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule* audioDevice = _audioDevice;
2636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->Init());
2638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Initialized());
2639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectRecordingDevice() == -1)
2641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (SelectPlayoutDevice() == -1)
2646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\nERROR: Device selection failed!\n \n");
2648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
2649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(true);
2651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetLoopbackMeasurements(true);
2652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
2654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start recording
2655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitRecording());
2656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StartRecording());
2657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start playout
2658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->InitPlayout());
2659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StartPlayout());
2660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Recording());
2662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(audioDevice->Playing());
2663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_WIN32_WCE) || defined(WEBRTC_IOS)
2665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nResetAudioDevice\n \n");
2666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
2667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n\
2669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org> Press any key to stop...\n \n");
2670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
2671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int p=0; p<=60; p+=20)
2673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("Resetting sound device several time with pause %d ms\n", p);
2675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (int l=0; l<20; ++l)
2676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
2677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EXPECT_EQ(0, audioDevice->ResetAudioDevice());
2678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            SleepMs(p);
2679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
2680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n");
2681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        SleepMs(2000);
2682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
2684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_IOS)
2686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool loudspeakerOn(false);
2687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\nSet playout spaker\n \n");
2688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (audioDevice->Recording() && audioDevice->Playing())
2689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
2690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n\
2691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org> Press any key to stop...\n \n");
2692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PAUSE(DEFAULT_PAUSE_TIME);
2693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("Set to use speaker\n");
2696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetLoudspeakerStatus(true));
2697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n> Speak into the microphone and verify that the audio is"
2698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        " from the loudspeaker.\n\
2699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org> Press any key to stop...\n \n");
2700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PAUSE(DEFAULT_PAUSE_TIME);
27018fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org    EXPECT_EQ(0, audioDevice->GetLoudspeakerStatus(&loudspeakerOn));
2702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(loudspeakerOn);
2703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("Set to not use speaker\n");
2705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->SetLoudspeakerStatus(false));
2706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n> Speak into the microphone and verify that the audio is not"
2707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        " from the loudspeaker.\n\
2708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org> Press any key to stop...\n \n");
2709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PAUSE(DEFAULT_PAUSE_TIME);
27108fb9156f2f33aee3680554d19a9ab25e5de3af0efischman@webrtc.org    EXPECT_EQ(0, audioDevice->GetLoudspeakerStatus(&loudspeakerOn));
2711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_FALSE(loudspeakerOn);
2712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
2713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopRecording());
2715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->StopPlayout());
2716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
2717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _audioTransport->SetFullDuplex(false);
2719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TEST_LOG("\n");
2721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PRINT_TEST_RESULTS;
2722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
2724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
2725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27263b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
2727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// EOF
2729