blob: 7247a696e1a58b4a79811704b1c27561766dfc0a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
xians@webrtc.org79af7342012-01-31 12:22:14 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "voe_hardware_impl.h"
12
13#include <cassert>
14
15#include "cpu_wrapper.h"
16#include "critical_section_wrapper.h"
17#include "trace.h"
18#include "voe_errors.h"
19#include "voice_engine_impl.h"
20
21namespace webrtc
22{
23
24VoEHardware* VoEHardware::GetInterface(VoiceEngine* voiceEngine)
25{
26#ifndef WEBRTC_VOICE_ENGINE_HARDWARE_API
27 return NULL;
28#else
29 if (NULL == voiceEngine)
30 {
31 return NULL;
32 }
tommi@webrtc.orga990e122012-04-26 15:28:22 +000033 VoiceEngineImpl* s = reinterpret_cast<VoiceEngineImpl*>(voiceEngine);
34 s->AddRef();
35 return s;
niklase@google.com470e71d2011-07-07 08:21:25 +000036#endif
37}
38
39#ifdef WEBRTC_VOICE_ENGINE_HARDWARE_API
40
tommi@webrtc.org851becd2012-04-04 14:57:19 +000041VoEHardwareImpl::VoEHardwareImpl(voe::SharedData* shared) :
42 _cpu(NULL), _shared(shared)
niklase@google.com470e71d2011-07-07 08:21:25 +000043{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000044 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000045 "VoEHardwareImpl() - ctor");
46
47 _cpu = CpuWrapper::CreateCpu();
48 if (_cpu)
49 {
50 _cpu->CpuUsage(); // init cpu usage
51 }
52}
53
54VoEHardwareImpl::~VoEHardwareImpl()
55{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000056 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000057 "~VoEHardwareImpl() - dtor");
58
59 if (_cpu)
60 {
61 delete _cpu;
62 _cpu = NULL;
63 }
64}
65
niklase@google.com470e71d2011-07-07 08:21:25 +000066int VoEHardwareImpl::SetAudioDeviceLayer(AudioLayers audioLayer)
67{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000068 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000069 "SetAudioDeviceLayer(audioLayer=%d)", audioLayer);
70
71 // Don't allow a change if VoE is initialized
tommi@webrtc.org851becd2012-04-04 14:57:19 +000072 if (_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +000073 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000074 _shared->SetLastError(VE_ALREADY_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +000075 return -1;
76 }
77
78 // Map to AudioDeviceModule::AudioLayer
79 AudioDeviceModule::AudioLayer
80 wantedLayer(AudioDeviceModule::kPlatformDefaultAudio);
81 switch (audioLayer)
82 {
83 case kAudioPlatformDefault:
84 // already set above
85 break;
86 case kAudioWindowsCore:
87 wantedLayer = AudioDeviceModule::kWindowsCoreAudio;
88 break;
89 case kAudioWindowsWave:
90 wantedLayer = AudioDeviceModule::kWindowsWaveAudio;
91 break;
92 case kAudioLinuxAlsa:
93 wantedLayer = AudioDeviceModule::kLinuxAlsaAudio;
94 break;
95 case kAudioLinuxPulse:
96 wantedLayer = AudioDeviceModule::kLinuxPulseAudio;
97 break;
niklase@google.com470e71d2011-07-07 08:21:25 +000098 }
99
100 // Save the audio device layer for Init()
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000101 _shared->set_audio_device_layer(wantedLayer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000102
103 return 0;
104}
105
106int VoEHardwareImpl::GetAudioDeviceLayer(AudioLayers& audioLayer)
107{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000108 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000109 "GetAudioDeviceLayer(devices=?)");
110
111 // Can always be called regardless of VoE state
112
113 AudioDeviceModule::AudioLayer
114 activeLayer(AudioDeviceModule::kPlatformDefaultAudio);
115
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000116 if (_shared->audio_device())
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 {
118 // Get active audio layer from ADM
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000119 if (_shared->audio_device()->ActiveAudioLayer(&activeLayer) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000120 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000121 _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
122 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000123 return -1;
124 }
125 }
126 else
127 {
128 // Return VoE's internal layer setting
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000129 activeLayer = _shared->audio_device_layer();
niklase@google.com470e71d2011-07-07 08:21:25 +0000130 }
131
132 // Map to AudioLayers
133 switch (activeLayer)
134 {
135 case AudioDeviceModule::kPlatformDefaultAudio:
136 audioLayer = kAudioPlatformDefault;
137 break;
138 case AudioDeviceModule::kWindowsCoreAudio:
139 audioLayer = kAudioWindowsCore;
140 break;
141 case AudioDeviceModule::kWindowsWaveAudio:
142 audioLayer = kAudioWindowsWave;
143 break;
144 case AudioDeviceModule::kLinuxAlsaAudio:
145 audioLayer = kAudioLinuxAlsa;
146 break;
147 case AudioDeviceModule::kLinuxPulseAudio:
148 audioLayer = kAudioLinuxPulse;
149 break;
150 default:
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000151 _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
152 " unknown audio layer");
niklase@google.com470e71d2011-07-07 08:21:25 +0000153 }
154
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000155 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
156 VoEId(_shared->instance_id(), -1),
157 " Output: audioLayer=%d", audioLayer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000158
159 return 0;
160}
161int VoEHardwareImpl::GetNumOfRecordingDevices(int& devices)
162{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000163 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000164 "GetNumOfRecordingDevices(devices=?)");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000165 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000166 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000167
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000168 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000169 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000170 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000171 return -1;
172 }
173
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000174 devices = static_cast<int> (_shared->audio_device()->RecordingDevices());
niklase@google.com470e71d2011-07-07 08:21:25 +0000175
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000176 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
177 VoEId(_shared->instance_id(), -1), " Output: devices=%d", devices);
niklase@google.com470e71d2011-07-07 08:21:25 +0000178
179 return 0;
180}
181
182int VoEHardwareImpl::GetNumOfPlayoutDevices(int& devices)
183{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000184 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000185 "GetNumOfPlayoutDevices(devices=?)");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000186 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000187 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000188
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000189 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000190 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000191 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000192 return -1;
193 }
194
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000195 devices = static_cast<int> (_shared->audio_device()->PlayoutDevices());
niklase@google.com470e71d2011-07-07 08:21:25 +0000196
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000197 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
198 VoEId(_shared->instance_id(), -1),
199 " Output: devices=%d", devices);
niklase@google.com470e71d2011-07-07 08:21:25 +0000200
201 return 0;
202}
203
204int VoEHardwareImpl::GetRecordingDeviceName(int index,
205 char strNameUTF8[128],
206 char strGuidUTF8[128])
207{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000208 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000209 "GetRecordingDeviceName(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000210 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000211 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000212
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000213 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000214 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000215 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000216 return -1;
217 }
218 if (strNameUTF8 == NULL)
219 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000220 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000221 "GetRecordingDeviceName() invalid argument");
222 return -1;
223 }
224
225 // Note that strGuidUTF8 is allowed to be NULL
226
227 // Init len variable to length of supplied vectors
228 const WebRtc_UWord16 strLen = 128;
229
230 // Check if length has been changed in module
231 assert(strLen == kAdmMaxDeviceNameSize);
232 assert(strLen == kAdmMaxGuidSize);
233
leozwang@webrtc.org813e4b02012-03-01 18:34:25 +0000234 char name[strLen];
235 char guid[strLen];
niklase@google.com470e71d2011-07-07 08:21:25 +0000236
237 // Get names from module
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000238 if (_shared->audio_device()->RecordingDeviceName(index, name, guid) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000239 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000240 _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000241 "GetRecordingDeviceName() failed to get device name");
242 return -1;
243 }
244
245 // Copy to vectors supplied by user
246 strncpy(strNameUTF8, name, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000247 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
248 VoEId(_shared->instance_id(), -1),
249 " Output: strNameUTF8=%s", strNameUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000250
251 if (strGuidUTF8 != NULL)
252 {
xians@google.com49d025f2011-09-27 14:43:06 +0000253 strncpy(strGuidUTF8, guid, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000254 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
255 VoEId(_shared->instance_id(), -1),
256 " Output: strGuidUTF8=%s", strGuidUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000257 }
258
259 return 0;
260}
261
262int VoEHardwareImpl::GetPlayoutDeviceName(int index,
263 char strNameUTF8[128],
264 char strGuidUTF8[128])
265{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000266 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000267 "GetPlayoutDeviceName(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000268 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000269 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000270
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000271 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000272 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000273 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000274 return -1;
275 }
276 if (strNameUTF8 == NULL)
277 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000278 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000279 "GetPlayoutDeviceName() invalid argument");
280 return -1;
281 }
282
283 // Note that strGuidUTF8 is allowed to be NULL
284
285 // Init len variable to length of supplied vectors
286 const WebRtc_UWord16 strLen = 128;
287
288 // Check if length has been changed in module
289 assert(strLen == kAdmMaxDeviceNameSize);
290 assert(strLen == kAdmMaxGuidSize);
291
leozwang@webrtc.org813e4b02012-03-01 18:34:25 +0000292 char name[strLen];
293 char guid[strLen];
niklase@google.com470e71d2011-07-07 08:21:25 +0000294
295 // Get names from module
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000296 if (_shared->audio_device()->PlayoutDeviceName(index, name, guid) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000297 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000298 _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000299 "GetPlayoutDeviceName() failed to get device name");
300 return -1;
301 }
302
303 // Copy to vectors supplied by user
304 strncpy(strNameUTF8, name, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000305 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
306 VoEId(_shared->instance_id(), -1),
307 " Output: strNameUTF8=%s", strNameUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000308
309 if (strGuidUTF8 != NULL)
310 {
xians@google.comb8753492011-09-05 12:17:30 +0000311 strncpy(strGuidUTF8, guid, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000312 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
313 VoEId(_shared->instance_id(), -1),
314 " Output: strGuidUTF8=%s", strGuidUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000315 }
316
317 return 0;
318}
319
320int VoEHardwareImpl::SetRecordingDevice(int index,
321 StereoChannel recordingChannel)
322{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000323 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000324 "SetRecordingDevice(index=%d, recordingChannel=%d)",
325 index, (int) recordingChannel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000326 CriticalSectionScoped cs(_shared->crit_sec());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000327 IPHONE_NOT_SUPPORTED(_shared->statistics());
leozwang@webrtc.org81cd4472012-09-20 17:18:51 +0000328 // TODO(leozwang): Add this api to Android OpenSL ES implementation.
niklase@google.com470e71d2011-07-07 08:21:25 +0000329
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000330 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000331 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000332 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000333 return -1;
334 }
335
336 bool isRecording(false);
337
338 // Store state about activated recording to be able to restore it after the
339 // recording device has been modified.
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000340 if (_shared->audio_device()->Recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000341 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000342 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000343 "SetRecordingDevice() device is modified while recording"
344 " is active...");
345 isRecording = true;
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000346 if (_shared->audio_device()->StopRecording() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000347 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000348 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000349 "SetRecordingDevice() unable to stop recording");
350 return -1;
351 }
352 }
353
354 // We let the module do the index sanity
355
356 // Set recording channel
357 AudioDeviceModule::ChannelType recCh =
358 AudioDeviceModule::kChannelBoth;
359 switch (recordingChannel)
360 {
361 case kStereoLeft:
362 recCh = AudioDeviceModule::kChannelLeft;
363 break;
364 case kStereoRight:
365 recCh = AudioDeviceModule::kChannelRight;
366 break;
367 case kStereoBoth:
368 // default setting kChannelBoth (<=> mono)
369 break;
niklase@google.com470e71d2011-07-07 08:21:25 +0000370 }
371
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000372 if (_shared->audio_device()->SetRecordingChannel(recCh) != 0) {
373 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
xians@webrtc.org79af7342012-01-31 12:22:14 +0000374 "SetRecordingChannel() unable to set the recording channel");
375 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000376
377 // Map indices to unsigned since underlying functions need that
378 WebRtc_UWord16 indexU = static_cast<WebRtc_UWord16> (index);
379
380 WebRtc_Word32 res(0);
381
382 if (index == -1)
383 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000384 res = _shared->audio_device()->SetRecordingDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000385 AudioDeviceModule::kDefaultCommunicationDevice);
386 }
387 else if (index == -2)
388 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000389 res = _shared->audio_device()->SetRecordingDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000390 AudioDeviceModule::kDefaultDevice);
391 }
392 else
393 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000394 res = _shared->audio_device()->SetRecordingDevice(indexU);
niklase@google.com470e71d2011-07-07 08:21:25 +0000395 }
396
397 if (res != 0)
398 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000399 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000400 "SetRecordingDevice() unable to set the recording device");
401 return -1;
402 }
403
404 // Init microphone, so user can do volume settings etc
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000405 if (_shared->audio_device()->InitMicrophone() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000406 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000407 _shared->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000408 "SetRecordingDevice() cannot access microphone");
409 }
410
411 // Set number of channels
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000412 bool available = false;
413 if (_shared->audio_device()->StereoRecordingIsAvailable(&available) != 0) {
414 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
xians@webrtc.org79af7342012-01-31 12:22:14 +0000415 "StereoRecordingIsAvailable() failed to query stereo recording");
416 }
417
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000418 if (_shared->audio_device()->SetStereoRecording(available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000419 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000420 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000421 "SetRecordingDevice() failed to set mono recording mode");
422 }
423
424 // Restore recording if it was enabled already when calling this function.
425 if (isRecording)
426 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000427 if (!_shared->ext_recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000428 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000429 WEBRTC_TRACE(kTraceInfo, kTraceVoice,
430 VoEId(_shared->instance_id(), -1),
431 "SetRecordingDevice() recording is now being restored...");
432 if (_shared->audio_device()->InitRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000433 {
434 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000435 VoEId(_shared->instance_id(), -1),
436 "SetRecordingDevice() failed to initialize recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000437 return -1;
438 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000439 if (_shared->audio_device()->StartRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000440 {
441 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000442 VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000443 "SetRecordingDevice() failed to start recording");
444 return -1;
445 }
446 }
447 }
448
449 return 0;
450}
451
452int VoEHardwareImpl::SetPlayoutDevice(int index)
453{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000454 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000455 "SetPlayoutDevice(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000456 CriticalSectionScoped cs(_shared->crit_sec());
457 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000458 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000459
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000460 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000461 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000462 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000463 return -1;
464 }
465
466 bool isPlaying(false);
467
468 // Store state about activated playout to be able to restore it after the
469 // playout device has been modified.
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000470 if (_shared->audio_device()->Playing())
niklase@google.com470e71d2011-07-07 08:21:25 +0000471 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000472 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000473 "SetPlayoutDevice() device is modified while playout is "
474 "active...");
475 isPlaying = true;
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000476 if (_shared->audio_device()->StopPlayout() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000477 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000478 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000479 "SetPlayoutDevice() unable to stop playout");
480 return -1;
481 }
482 }
483
484 // We let the module do the index sanity
485
486 // Map indices to unsigned since underlying functions need that
487 WebRtc_UWord16 indexU = static_cast<WebRtc_UWord16> (index);
488
489 WebRtc_Word32 res(0);
490
491 if (index == -1)
492 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000493 res = _shared->audio_device()->SetPlayoutDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000494 AudioDeviceModule::kDefaultCommunicationDevice);
495 }
496 else if (index == -2)
497 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000498 res = _shared->audio_device()->SetPlayoutDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000499 AudioDeviceModule::kDefaultDevice);
500 }
501 else
502 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000503 res = _shared->audio_device()->SetPlayoutDevice(indexU);
niklase@google.com470e71d2011-07-07 08:21:25 +0000504 }
505
506 if (res != 0)
507 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000508 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000509 "SetPlayoutDevice() unable to set the playout device");
510 return -1;
511 }
512
513 // Init speaker, so user can do volume settings etc
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000514 if (_shared->audio_device()->InitSpeaker() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000515 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000516 _shared->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000517 "SetPlayoutDevice() cannot access speaker");
518 }
519
520 // Set number of channels
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000521 bool available = false;
522 _shared->audio_device()->StereoPlayoutIsAvailable(&available);
523 if (_shared->audio_device()->SetStereoPlayout(available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000524 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000525 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000526 "SetPlayoutDevice() failed to set stereo playout mode");
527 }
528
529 // Restore playout if it was enabled already when calling this function.
530 if (isPlaying)
531 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000532 if (!_shared->ext_playout())
niklase@google.com470e71d2011-07-07 08:21:25 +0000533 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000534 WEBRTC_TRACE(kTraceInfo, kTraceVoice,
535 VoEId(_shared->instance_id(), -1),
536 "SetPlayoutDevice() playout is now being restored...");
537 if (_shared->audio_device()->InitPlayout() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000538 {
539 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000540 VoEId(_shared->instance_id(), -1),
541 "SetPlayoutDevice() failed to initialize playout");
niklase@google.com470e71d2011-07-07 08:21:25 +0000542 return -1;
543 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000544 if (_shared->audio_device()->StartPlayout() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000545 {
546 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000547 VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000548 "SetPlayoutDevice() failed to start playout");
549 return -1;
550 }
551 }
552 }
553
554 return 0;
555}
556
557int VoEHardwareImpl::GetRecordingDeviceStatus(bool& isAvailable)
558{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000559 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000560 "GetRecordingDeviceStatus()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000561 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000562 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000563
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000564 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000565 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000566 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000567 return -1;
568 }
569
570 // We let the module do isRecording sanity
571
572 bool available(false);
573
574 // Check availability
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000575 if (_shared->audio_device()->RecordingIsAvailable(&available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000576 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000577 _shared->SetLastError(VE_UNDEFINED_SC_REC_ERR, kTraceError,
578 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000579 return -1;
580 }
581
582 isAvailable = available;
583
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000584 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
585 VoEId(_shared->instance_id(), -1),
586 " Output: isAvailable = %d)", (int) isAvailable);
niklase@google.com470e71d2011-07-07 08:21:25 +0000587
588 return 0;
589}
590
591int VoEHardwareImpl::GetPlayoutDeviceStatus(bool& isAvailable)
592{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000593 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000594 "GetPlayoutDeviceStatus()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000595 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000596 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000597
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000598 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000599 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000600 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000601 return -1;
602 }
603
604 // We let the module do isPlaying sanity
605
606 bool available(false);
607
608 // Check availability
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000609 if (_shared->audio_device()->PlayoutIsAvailable(&available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000610 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000611 _shared->SetLastError(VE_PLAY_UNDEFINED_SC_ERR, kTraceError,
612 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000613 return -1;
614 }
615
616 isAvailable = available;
617
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000618 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
619 VoEId(_shared->instance_id(), -1),
620 " Output: isAvailable = %d)", (int) isAvailable);
niklase@google.com470e71d2011-07-07 08:21:25 +0000621
622 return 0;
623}
624
625int VoEHardwareImpl::ResetAudioDevice()
626{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000627 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000628 "ResetAudioDevice()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000629 ANDROID_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000630
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000631 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000632 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000633 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000634 return -1;
635 }
636
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000637#if defined(WEBRTC_IOS)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000638 if (_shared->audio_device()->ResetAudioDevice() < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000639 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000640 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceError,
641 " Failed to reset sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000642 return -1;
643 }
644#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000645 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
646 " no support for resetting sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000647 return -1;
648#endif
649
650 return 0;
651}
652
653int VoEHardwareImpl::AudioDeviceControl(unsigned int par1, unsigned int par2,
654 unsigned int par3)
655{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000656 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000657 "AudioDeviceControl(%i, %i, %i)", par1, par2, par3);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000658 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000659 IPHONE_NOT_SUPPORTED(_shared->statistics());
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000660 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000661 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000662 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000663 return -1;
664 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000665 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
666 " no support for resetting sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000667 return -1;
668}
669
670int VoEHardwareImpl::SetLoudspeakerStatus(bool enable)
671{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000672 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000673 "SetLoudspeakerStatus(enable=%i)", (int) enable);
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000674 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000675
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000676 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000677 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000678 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000679 return -1;
680 }
leozwang@google.comf1ed5ad2011-08-01 17:36:09 +0000681#if defined(WEBRTC_ANDROID)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000682 if (_shared->audio_device()->SetLoudspeakerStatus(enable) < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000683 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000684 _shared->SetLastError(VE_IGNORED_FUNCTION, kTraceError,
685 " Failed to set loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000686 return -1;
687 }
688
689 return 0;
690#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000691 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
692 " no support for setting loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000693 return -1;
694#endif
695}
696
697int VoEHardwareImpl::GetLoudspeakerStatus(bool& enabled)
698{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000699 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000700 "GetLoudspeakerStatus()");
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000701 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000702
leozwang@google.comf1ed5ad2011-08-01 17:36:09 +0000703#if defined(WEBRTC_ANDROID)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000704 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000705 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000706 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000707 return -1;
708 }
709
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000710 if (_shared->audio_device()->GetLoudspeakerStatus(&enabled) < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000711 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000712 _shared->SetLastError(VE_IGNORED_FUNCTION, kTraceError,
713 " Failed to get loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000714 return -1;
715 }
716
717 return 0;
718#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000719 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
720 " no support for setting loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000721 return -1;
722#endif
723}
724
725int VoEHardwareImpl::GetCPULoad(int& loadPercent)
726{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000727 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000728 "GetCPULoad()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000729 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000730 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000731
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000732 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000733 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000734 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000735 return -1;
736 }
737
738 // Get CPU load from ADM
739 WebRtc_UWord16 load(0);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000740 if (_shared->audio_device()->CPULoad(&load) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000741 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000742 _shared->SetLastError(VE_CPU_INFO_ERROR, kTraceError,
743 " error getting system CPU load");
niklase@google.com470e71d2011-07-07 08:21:25 +0000744 return -1;
745 }
746
747 loadPercent = static_cast<int> (load);
748
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000749 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
750 VoEId(_shared->instance_id(), -1),
751 " Output: loadPercent = %d", loadPercent);
niklase@google.com470e71d2011-07-07 08:21:25 +0000752
753 return 0;
754}
755
756int VoEHardwareImpl::GetSystemCPULoad(int& loadPercent)
757{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000758 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000759 "GetSystemCPULoad(loadPercent=?)");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000760 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000761 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000762
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000763 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000764 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000765 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000766 return -1;
767 }
768
769 // Check if implemented for this platform
770 if (!_cpu)
771 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000772 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
773 " no support for getting system CPU load");
niklase@google.com470e71d2011-07-07 08:21:25 +0000774 return -1;
775 }
776
777 // Get CPU load
778 WebRtc_Word32 load = _cpu->CpuUsage();
779 if (load < 0)
780 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000781 _shared->SetLastError(VE_CPU_INFO_ERROR, kTraceError,
782 " error getting system CPU load");
niklase@google.com470e71d2011-07-07 08:21:25 +0000783 return -1;
784 }
785
786 loadPercent = static_cast<int> (load);
787
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000788 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
789 VoEId(_shared->instance_id(), -1),
790 " Output: loadPercent = %d", loadPercent);
niklase@google.com470e71d2011-07-07 08:21:25 +0000791
792 return 0;
793}
794
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000795int VoEHardwareImpl::EnableBuiltInAEC(bool enable)
796{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000797 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000798 "%s", __FUNCTION__);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000799 if (!_shared->statistics().Initialized())
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000800 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000801 _shared->SetLastError(VE_NOT_INITED, kTraceError);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000802 return -1;
803 }
804
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000805 return _shared->audio_device()->EnableBuiltInAEC(enable);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000806}
807
808bool VoEHardwareImpl::BuiltInAECIsEnabled() const
809{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000810 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000811 "%s", __FUNCTION__);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000812 if (!_shared->statistics().Initialized())
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000813 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000814 _shared->SetLastError(VE_NOT_INITED, kTraceError);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000815 return false;
816 }
817
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000818 return _shared->audio_device()->BuiltInAECIsEnabled();
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000819}
820
niklase@google.com470e71d2011-07-07 08:21:25 +0000821#endif // WEBRTC_VOICE_ENGINE_HARDWARE_API
822
823} // namespace webrtc