blob: f4550fcc12e7b8b6fabc64086b58b2797a18c15f [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
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000011#include "webrtc/voice_engine/voe_hardware_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000013#include <assert.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000014
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000015#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
16#include "webrtc/system_wrappers/interface/trace.h"
17#include "webrtc/voice_engine/include/voe_errors.h"
18#include "webrtc/voice_engine/voice_engine_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
20namespace webrtc
21{
22
23VoEHardware* VoEHardware::GetInterface(VoiceEngine* voiceEngine)
24{
25#ifndef WEBRTC_VOICE_ENGINE_HARDWARE_API
26 return NULL;
27#else
28 if (NULL == voiceEngine)
29 {
30 return NULL;
31 }
tommi@webrtc.org0989fb72013-02-15 15:07:32 +000032 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
tommi@webrtc.orga990e122012-04-26 15:28:22 +000033 s->AddRef();
34 return s;
niklase@google.com470e71d2011-07-07 08:21:25 +000035#endif
36}
37
38#ifdef WEBRTC_VOICE_ENGINE_HARDWARE_API
39
henrike@webrtc.org93bea512013-03-28 15:58:49 +000040VoEHardwareImpl::VoEHardwareImpl(voe::SharedData* shared) : _shared(shared)
niklase@google.com470e71d2011-07-07 08:21:25 +000041{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000042 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000043 "VoEHardwareImpl() - ctor");
niklase@google.com470e71d2011-07-07 08:21:25 +000044}
45
46VoEHardwareImpl::~VoEHardwareImpl()
47{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000048 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000049 "~VoEHardwareImpl() - dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +000050}
51
niklase@google.com470e71d2011-07-07 08:21:25 +000052int VoEHardwareImpl::SetAudioDeviceLayer(AudioLayers audioLayer)
53{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000054 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000055 "SetAudioDeviceLayer(audioLayer=%d)", audioLayer);
56
57 // Don't allow a change if VoE is initialized
tommi@webrtc.org851becd2012-04-04 14:57:19 +000058 if (_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +000059 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000060 _shared->SetLastError(VE_ALREADY_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +000061 return -1;
62 }
63
64 // Map to AudioDeviceModule::AudioLayer
65 AudioDeviceModule::AudioLayer
66 wantedLayer(AudioDeviceModule::kPlatformDefaultAudio);
67 switch (audioLayer)
68 {
69 case kAudioPlatformDefault:
70 // already set above
71 break;
72 case kAudioWindowsCore:
73 wantedLayer = AudioDeviceModule::kWindowsCoreAudio;
74 break;
75 case kAudioWindowsWave:
76 wantedLayer = AudioDeviceModule::kWindowsWaveAudio;
77 break;
78 case kAudioLinuxAlsa:
79 wantedLayer = AudioDeviceModule::kLinuxAlsaAudio;
80 break;
81 case kAudioLinuxPulse:
82 wantedLayer = AudioDeviceModule::kLinuxPulseAudio;
83 break;
niklase@google.com470e71d2011-07-07 08:21:25 +000084 }
85
86 // Save the audio device layer for Init()
tommi@webrtc.org851becd2012-04-04 14:57:19 +000087 _shared->set_audio_device_layer(wantedLayer);
niklase@google.com470e71d2011-07-07 08:21:25 +000088
89 return 0;
90}
91
92int VoEHardwareImpl::GetAudioDeviceLayer(AudioLayers& audioLayer)
93{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000094 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000095 "GetAudioDeviceLayer(devices=?)");
96
97 // Can always be called regardless of VoE state
98
99 AudioDeviceModule::AudioLayer
100 activeLayer(AudioDeviceModule::kPlatformDefaultAudio);
101
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000102 if (_shared->audio_device())
niklase@google.com470e71d2011-07-07 08:21:25 +0000103 {
104 // Get active audio layer from ADM
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000105 if (_shared->audio_device()->ActiveAudioLayer(&activeLayer) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000106 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000107 _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
108 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000109 return -1;
110 }
111 }
112 else
113 {
114 // Return VoE's internal layer setting
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000115 activeLayer = _shared->audio_device_layer();
niklase@google.com470e71d2011-07-07 08:21:25 +0000116 }
117
118 // Map to AudioLayers
119 switch (activeLayer)
120 {
121 case AudioDeviceModule::kPlatformDefaultAudio:
122 audioLayer = kAudioPlatformDefault;
123 break;
124 case AudioDeviceModule::kWindowsCoreAudio:
125 audioLayer = kAudioWindowsCore;
126 break;
127 case AudioDeviceModule::kWindowsWaveAudio:
128 audioLayer = kAudioWindowsWave;
129 break;
130 case AudioDeviceModule::kLinuxAlsaAudio:
131 audioLayer = kAudioLinuxAlsa;
132 break;
133 case AudioDeviceModule::kLinuxPulseAudio:
134 audioLayer = kAudioLinuxPulse;
135 break;
136 default:
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000137 _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
138 " unknown audio layer");
niklase@google.com470e71d2011-07-07 08:21:25 +0000139 }
140
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000141 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
142 VoEId(_shared->instance_id(), -1),
143 " Output: audioLayer=%d", audioLayer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000144
145 return 0;
146}
147int VoEHardwareImpl::GetNumOfRecordingDevices(int& devices)
148{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000149 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000150 "GetNumOfRecordingDevices(devices=?)");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000151 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000152 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000154 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000155 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000156 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000157 return -1;
158 }
159
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000160 devices = static_cast<int> (_shared->audio_device()->RecordingDevices());
niklase@google.com470e71d2011-07-07 08:21:25 +0000161
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000162 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
163 VoEId(_shared->instance_id(), -1), " Output: devices=%d", devices);
niklase@google.com470e71d2011-07-07 08:21:25 +0000164
165 return 0;
166}
167
168int VoEHardwareImpl::GetNumOfPlayoutDevices(int& devices)
169{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000170 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000171 "GetNumOfPlayoutDevices(devices=?)");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000172 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000173 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000174
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000175 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000176 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000177 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000178 return -1;
179 }
180
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000181 devices = static_cast<int> (_shared->audio_device()->PlayoutDevices());
niklase@google.com470e71d2011-07-07 08:21:25 +0000182
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000183 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
184 VoEId(_shared->instance_id(), -1),
185 " Output: devices=%d", devices);
niklase@google.com470e71d2011-07-07 08:21:25 +0000186
187 return 0;
188}
189
190int VoEHardwareImpl::GetRecordingDeviceName(int index,
191 char strNameUTF8[128],
192 char strGuidUTF8[128])
193{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000194 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000195 "GetRecordingDeviceName(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000196 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000197 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000198
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000199 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000200 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000201 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000202 return -1;
203 }
204 if (strNameUTF8 == NULL)
205 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000206 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000207 "GetRecordingDeviceName() invalid argument");
208 return -1;
209 }
210
211 // Note that strGuidUTF8 is allowed to be NULL
212
213 // Init len variable to length of supplied vectors
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000214 const uint16_t strLen = 128;
niklase@google.com470e71d2011-07-07 08:21:25 +0000215
216 // Check if length has been changed in module
217 assert(strLen == kAdmMaxDeviceNameSize);
218 assert(strLen == kAdmMaxGuidSize);
219
leozwang@webrtc.org813e4b02012-03-01 18:34:25 +0000220 char name[strLen];
221 char guid[strLen];
niklase@google.com470e71d2011-07-07 08:21:25 +0000222
223 // Get names from module
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000224 if (_shared->audio_device()->RecordingDeviceName(index, name, guid) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000225 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000226 _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000227 "GetRecordingDeviceName() failed to get device name");
228 return -1;
229 }
230
231 // Copy to vectors supplied by user
232 strncpy(strNameUTF8, name, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000233 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
234 VoEId(_shared->instance_id(), -1),
235 " Output: strNameUTF8=%s", strNameUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000236
237 if (strGuidUTF8 != NULL)
238 {
xians@google.com49d025f2011-09-27 14:43:06 +0000239 strncpy(strGuidUTF8, guid, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000240 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
241 VoEId(_shared->instance_id(), -1),
242 " Output: strGuidUTF8=%s", strGuidUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000243 }
244
245 return 0;
246}
247
248int VoEHardwareImpl::GetPlayoutDeviceName(int index,
249 char strNameUTF8[128],
250 char strGuidUTF8[128])
251{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000252 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000253 "GetPlayoutDeviceName(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000254 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000255 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000256
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000257 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000258 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000259 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000260 return -1;
261 }
262 if (strNameUTF8 == NULL)
263 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000264 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000265 "GetPlayoutDeviceName() invalid argument");
266 return -1;
267 }
268
269 // Note that strGuidUTF8 is allowed to be NULL
270
271 // Init len variable to length of supplied vectors
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000272 const uint16_t strLen = 128;
niklase@google.com470e71d2011-07-07 08:21:25 +0000273
274 // Check if length has been changed in module
275 assert(strLen == kAdmMaxDeviceNameSize);
276 assert(strLen == kAdmMaxGuidSize);
277
leozwang@webrtc.org813e4b02012-03-01 18:34:25 +0000278 char name[strLen];
279 char guid[strLen];
niklase@google.com470e71d2011-07-07 08:21:25 +0000280
281 // Get names from module
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000282 if (_shared->audio_device()->PlayoutDeviceName(index, name, guid) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000283 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000284 _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000285 "GetPlayoutDeviceName() failed to get device name");
286 return -1;
287 }
288
289 // Copy to vectors supplied by user
290 strncpy(strNameUTF8, name, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000291 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
292 VoEId(_shared->instance_id(), -1),
293 " Output: strNameUTF8=%s", strNameUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000294
295 if (strGuidUTF8 != NULL)
296 {
xians@google.comb8753492011-09-05 12:17:30 +0000297 strncpy(strGuidUTF8, guid, strLen);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000298 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
299 VoEId(_shared->instance_id(), -1),
300 " Output: strGuidUTF8=%s", strGuidUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +0000301 }
302
303 return 0;
304}
305
306int VoEHardwareImpl::SetRecordingDevice(int index,
307 StereoChannel recordingChannel)
308{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000309 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000310 "SetRecordingDevice(index=%d, recordingChannel=%d)",
311 index, (int) recordingChannel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000312 CriticalSectionScoped cs(_shared->crit_sec());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000313 IPHONE_NOT_SUPPORTED(_shared->statistics());
leozwang@webrtc.org81cd4472012-09-20 17:18:51 +0000314 // TODO(leozwang): Add this api to Android OpenSL ES implementation.
niklase@google.com470e71d2011-07-07 08:21:25 +0000315
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000316 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000317 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000318 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000319 return -1;
320 }
321
322 bool isRecording(false);
323
324 // Store state about activated recording to be able to restore it after the
325 // recording device has been modified.
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000326 if (_shared->audio_device()->Recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000327 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000328 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000329 "SetRecordingDevice() device is modified while recording"
330 " is active...");
331 isRecording = true;
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000332 if (_shared->audio_device()->StopRecording() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000333 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000334 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000335 "SetRecordingDevice() unable to stop recording");
336 return -1;
337 }
338 }
339
340 // We let the module do the index sanity
341
342 // Set recording channel
343 AudioDeviceModule::ChannelType recCh =
344 AudioDeviceModule::kChannelBoth;
345 switch (recordingChannel)
346 {
347 case kStereoLeft:
348 recCh = AudioDeviceModule::kChannelLeft;
349 break;
350 case kStereoRight:
351 recCh = AudioDeviceModule::kChannelRight;
352 break;
353 case kStereoBoth:
354 // default setting kChannelBoth (<=> mono)
355 break;
niklase@google.com470e71d2011-07-07 08:21:25 +0000356 }
357
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000358 if (_shared->audio_device()->SetRecordingChannel(recCh) != 0) {
359 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
xians@webrtc.org79af7342012-01-31 12:22:14 +0000360 "SetRecordingChannel() unable to set the recording channel");
361 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000362
363 // Map indices to unsigned since underlying functions need that
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000364 uint16_t indexU = static_cast<uint16_t> (index);
niklase@google.com470e71d2011-07-07 08:21:25 +0000365
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000366 int32_t res(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000367
368 if (index == -1)
369 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000370 res = _shared->audio_device()->SetRecordingDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000371 AudioDeviceModule::kDefaultCommunicationDevice);
372 }
373 else if (index == -2)
374 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000375 res = _shared->audio_device()->SetRecordingDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000376 AudioDeviceModule::kDefaultDevice);
377 }
378 else
379 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000380 res = _shared->audio_device()->SetRecordingDevice(indexU);
niklase@google.com470e71d2011-07-07 08:21:25 +0000381 }
382
383 if (res != 0)
384 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000385 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000386 "SetRecordingDevice() unable to set the recording device");
387 return -1;
388 }
389
390 // Init microphone, so user can do volume settings etc
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000391 if (_shared->audio_device()->InitMicrophone() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000392 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000393 _shared->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000394 "SetRecordingDevice() cannot access microphone");
395 }
396
397 // Set number of channels
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000398 bool available = false;
399 if (_shared->audio_device()->StereoRecordingIsAvailable(&available) != 0) {
400 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
xians@webrtc.org79af7342012-01-31 12:22:14 +0000401 "StereoRecordingIsAvailable() failed to query stereo recording");
402 }
403
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000404 if (_shared->audio_device()->SetStereoRecording(available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000405 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000406 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000407 "SetRecordingDevice() failed to set mono recording mode");
408 }
409
410 // Restore recording if it was enabled already when calling this function.
411 if (isRecording)
412 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000413 if (!_shared->ext_recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000414 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000415 WEBRTC_TRACE(kTraceInfo, kTraceVoice,
416 VoEId(_shared->instance_id(), -1),
417 "SetRecordingDevice() recording is now being restored...");
418 if (_shared->audio_device()->InitRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000419 {
420 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000421 VoEId(_shared->instance_id(), -1),
422 "SetRecordingDevice() failed to initialize recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000423 return -1;
424 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000425 if (_shared->audio_device()->StartRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000426 {
427 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000428 VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000429 "SetRecordingDevice() failed to start recording");
430 return -1;
431 }
432 }
433 }
434
435 return 0;
436}
437
438int VoEHardwareImpl::SetPlayoutDevice(int index)
439{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000440 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000441 "SetPlayoutDevice(index=%d)", index);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000442 CriticalSectionScoped cs(_shared->crit_sec());
443 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000444 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000445
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000446 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000447 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000448 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000449 return -1;
450 }
451
452 bool isPlaying(false);
453
454 // Store state about activated playout to be able to restore it after the
455 // playout device has been modified.
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000456 if (_shared->audio_device()->Playing())
niklase@google.com470e71d2011-07-07 08:21:25 +0000457 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000458 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000459 "SetPlayoutDevice() device is modified while playout is "
460 "active...");
461 isPlaying = true;
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000462 if (_shared->audio_device()->StopPlayout() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000463 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000464 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000465 "SetPlayoutDevice() unable to stop playout");
466 return -1;
467 }
468 }
469
470 // We let the module do the index sanity
471
472 // Map indices to unsigned since underlying functions need that
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000473 uint16_t indexU = static_cast<uint16_t> (index);
niklase@google.com470e71d2011-07-07 08:21:25 +0000474
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000475 int32_t res(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000476
477 if (index == -1)
478 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000479 res = _shared->audio_device()->SetPlayoutDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000480 AudioDeviceModule::kDefaultCommunicationDevice);
481 }
482 else if (index == -2)
483 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000484 res = _shared->audio_device()->SetPlayoutDevice(
niklase@google.com470e71d2011-07-07 08:21:25 +0000485 AudioDeviceModule::kDefaultDevice);
486 }
487 else
488 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000489 res = _shared->audio_device()->SetPlayoutDevice(indexU);
niklase@google.com470e71d2011-07-07 08:21:25 +0000490 }
491
492 if (res != 0)
493 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000494 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000495 "SetPlayoutDevice() unable to set the playout device");
496 return -1;
497 }
498
499 // Init speaker, so user can do volume settings etc
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000500 if (_shared->audio_device()->InitSpeaker() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000501 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000502 _shared->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000503 "SetPlayoutDevice() cannot access speaker");
504 }
505
506 // Set number of channels
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000507 bool available = false;
508 _shared->audio_device()->StereoPlayoutIsAvailable(&available);
509 if (_shared->audio_device()->SetStereoPlayout(available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000510 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000511 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
niklase@google.com470e71d2011-07-07 08:21:25 +0000512 "SetPlayoutDevice() failed to set stereo playout mode");
513 }
514
515 // Restore playout if it was enabled already when calling this function.
516 if (isPlaying)
517 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000518 if (!_shared->ext_playout())
niklase@google.com470e71d2011-07-07 08:21:25 +0000519 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000520 WEBRTC_TRACE(kTraceInfo, kTraceVoice,
521 VoEId(_shared->instance_id(), -1),
522 "SetPlayoutDevice() playout is now being restored...");
523 if (_shared->audio_device()->InitPlayout() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000524 {
525 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000526 VoEId(_shared->instance_id(), -1),
527 "SetPlayoutDevice() failed to initialize playout");
niklase@google.com470e71d2011-07-07 08:21:25 +0000528 return -1;
529 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000530 if (_shared->audio_device()->StartPlayout() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000531 {
532 WEBRTC_TRACE(kTraceError, kTraceVoice,
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000533 VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000534 "SetPlayoutDevice() failed to start playout");
535 return -1;
536 }
537 }
538 }
539
540 return 0;
541}
542
543int VoEHardwareImpl::GetRecordingDeviceStatus(bool& isAvailable)
544{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000545 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000546 "GetRecordingDeviceStatus()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000547 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000548 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000549
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000550 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000551 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000552 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000553 return -1;
554 }
555
556 // We let the module do isRecording sanity
557
558 bool available(false);
559
560 // Check availability
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000561 if (_shared->audio_device()->RecordingIsAvailable(&available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000562 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000563 _shared->SetLastError(VE_UNDEFINED_SC_REC_ERR, kTraceError,
564 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000565 return -1;
566 }
567
568 isAvailable = available;
569
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000570 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
571 VoEId(_shared->instance_id(), -1),
572 " Output: isAvailable = %d)", (int) isAvailable);
niklase@google.com470e71d2011-07-07 08:21:25 +0000573
574 return 0;
575}
576
577int VoEHardwareImpl::GetPlayoutDeviceStatus(bool& isAvailable)
578{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000579 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000580 "GetPlayoutDeviceStatus()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000581 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000582 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000583
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000584 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000585 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000586 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000587 return -1;
588 }
589
590 // We let the module do isPlaying sanity
591
592 bool available(false);
593
594 // Check availability
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000595 if (_shared->audio_device()->PlayoutIsAvailable(&available) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000596 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000597 _shared->SetLastError(VE_PLAY_UNDEFINED_SC_ERR, kTraceError,
598 " Audio Device error");
niklase@google.com470e71d2011-07-07 08:21:25 +0000599 return -1;
600 }
601
602 isAvailable = available;
603
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000604 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
605 VoEId(_shared->instance_id(), -1),
606 " Output: isAvailable = %d)", (int) isAvailable);
niklase@google.com470e71d2011-07-07 08:21:25 +0000607
608 return 0;
609}
610
611int VoEHardwareImpl::ResetAudioDevice()
612{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000613 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000614 "ResetAudioDevice()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000615 ANDROID_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000616
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000617 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000618 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000619 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000620 return -1;
621 }
622
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000623#if defined(WEBRTC_IOS)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000624 if (_shared->audio_device()->ResetAudioDevice() < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000625 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000626 _shared->SetLastError(VE_SOUNDCARD_ERROR, kTraceError,
627 " Failed to reset sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000628 return -1;
629 }
630#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000631 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
632 " no support for resetting sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000633 return -1;
634#endif
635
636 return 0;
637}
638
639int VoEHardwareImpl::AudioDeviceControl(unsigned int par1, unsigned int par2,
640 unsigned int par3)
641{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000642 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000643 "AudioDeviceControl(%i, %i, %i)", par1, par2, par3);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000644 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000645 IPHONE_NOT_SUPPORTED(_shared->statistics());
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000646 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000647 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000648 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000649 return -1;
650 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000651 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
652 " no support for resetting sound device");
niklase@google.com470e71d2011-07-07 08:21:25 +0000653 return -1;
654}
655
656int VoEHardwareImpl::SetLoudspeakerStatus(bool enable)
657{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000658 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000659 "SetLoudspeakerStatus(enable=%i)", (int) enable);
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000660 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000661
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000662 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000663 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000664 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000665 return -1;
666 }
leozwang@google.comf1ed5ad2011-08-01 17:36:09 +0000667#if defined(WEBRTC_ANDROID)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000668 if (_shared->audio_device()->SetLoudspeakerStatus(enable) < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000669 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000670 _shared->SetLastError(VE_IGNORED_FUNCTION, kTraceError,
671 " Failed to set loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000672 return -1;
673 }
674
675 return 0;
676#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000677 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
678 " no support for setting loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000679 return -1;
680#endif
681}
682
683int VoEHardwareImpl::GetLoudspeakerStatus(bool& enabled)
684{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000685 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000686 "GetLoudspeakerStatus()");
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000687 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000688
leozwang@google.comf1ed5ad2011-08-01 17:36:09 +0000689#if defined(WEBRTC_ANDROID)
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000690 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000691 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000692 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000693 return -1;
694 }
695
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000696 if (_shared->audio_device()->GetLoudspeakerStatus(&enabled) < 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000697 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000698 _shared->SetLastError(VE_IGNORED_FUNCTION, kTraceError,
699 " Failed to get loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000700 return -1;
701 }
702
703 return 0;
704#else
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000705 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
706 " no support for setting loudspeaker status");
niklase@google.com470e71d2011-07-07 08:21:25 +0000707 return -1;
708#endif
709}
710
711int VoEHardwareImpl::GetCPULoad(int& loadPercent)
712{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000713 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000714 "GetCPULoad()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000715 ANDROID_NOT_SUPPORTED(_shared->statistics());
sjlee@webrtc.org4b425082012-09-10 17:58:21 +0000716 IPHONE_NOT_SUPPORTED(_shared->statistics());
niklase@google.com470e71d2011-07-07 08:21:25 +0000717
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000718 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000719 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000720 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000721 return -1;
722 }
723
724 // Get CPU load from ADM
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000725 uint16_t load(0);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000726 if (_shared->audio_device()->CPULoad(&load) != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000727 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000728 _shared->SetLastError(VE_CPU_INFO_ERROR, kTraceError,
729 " error getting system CPU load");
niklase@google.com470e71d2011-07-07 08:21:25 +0000730 return -1;
731 }
732
733 loadPercent = static_cast<int> (load);
734
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000735 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
736 VoEId(_shared->instance_id(), -1),
737 " Output: loadPercent = %d", loadPercent);
niklase@google.com470e71d2011-07-07 08:21:25 +0000738
739 return 0;
740}
741
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000742int VoEHardwareImpl::EnableBuiltInAEC(bool enable)
743{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000744 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000745 "%s", __FUNCTION__);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000746 if (!_shared->statistics().Initialized())
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000747 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000748 _shared->SetLastError(VE_NOT_INITED, kTraceError);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000749 return -1;
750 }
751
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000752 return _shared->audio_device()->EnableBuiltInAEC(enable);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000753}
754
755bool VoEHardwareImpl::BuiltInAECIsEnabled() const
756{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000757 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000758 "%s", __FUNCTION__);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000759 if (!_shared->statistics().Initialized())
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000760 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000761 _shared->SetLastError(VE_NOT_INITED, kTraceError);
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000762 return false;
763 }
764
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000765 return _shared->audio_device()->BuiltInAECIsEnabled();
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000766}
767
leozwang@webrtc.org96bcac82012-12-04 19:11:55 +0000768int VoEHardwareImpl::SetRecordingSampleRate(unsigned int samples_per_sec) {
769 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
770 "%s", __FUNCTION__);
771 if (!_shared->statistics().Initialized()) {
772 _shared->SetLastError(VE_NOT_INITED, kTraceError);
773 return false;
774 }
775 return _shared->audio_device()->SetRecordingSampleRate(samples_per_sec);
776}
777
778int VoEHardwareImpl::RecordingSampleRate(unsigned int* samples_per_sec) const {
779 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
780 "%s", __FUNCTION__);
781 if (!_shared->statistics().Initialized()) {
782 _shared->SetLastError(VE_NOT_INITED, kTraceError);
783 return false;
784 }
785 return _shared->audio_device()->RecordingSampleRate(samples_per_sec);
786}
787
788int VoEHardwareImpl::SetPlayoutSampleRate(unsigned int samples_per_sec) {
789 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
790 "%s", __FUNCTION__);
791 if (!_shared->statistics().Initialized()) {
792 _shared->SetLastError(VE_NOT_INITED, kTraceError);
793 return false;
794 }
795 return _shared->audio_device()->SetPlayoutSampleRate(samples_per_sec);
796}
797
798int VoEHardwareImpl::PlayoutSampleRate(unsigned int* samples_per_sec) const {
799 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
800 "%s", __FUNCTION__);
801 if (!_shared->statistics().Initialized()) {
802 _shared->SetLastError(VE_NOT_INITED, kTraceError);
803 return false;
804 }
805 return _shared->audio_device()->PlayoutSampleRate(samples_per_sec);
806}
807
niklase@google.com470e71d2011-07-07 08:21:25 +0000808#endif // WEBRTC_VOICE_ENGINE_HARDWARE_API
809
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000810} // namespace webrtc