Home | History | Annotate | Download | only in audio_device
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      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 "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
     12 #include "webrtc/modules/audio_device/audio_device_config.h"
     13 #include "webrtc/modules/audio_device/audio_device_impl.h"
     14 #include "webrtc/system_wrappers/include/ref_count.h"
     15 #include "webrtc/system_wrappers/include/tick_util.h"
     16 
     17 #include <assert.h>
     18 #include <string.h>
     19 
     20 #if defined(_WIN32)
     21     #include "audio_device_wave_win.h"
     22  #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
     23     #include "audio_device_core_win.h"
     24  #endif
     25 #elif defined(WEBRTC_ANDROID)
     26 #include <stdlib.h>
     27 #include "webrtc/modules/audio_device/android/audio_device_template.h"
     28 #include "webrtc/modules/audio_device/android/audio_manager.h"
     29 #include "webrtc/modules/audio_device/android/audio_record_jni.h"
     30 #include "webrtc/modules/audio_device/android/audio_track_jni.h"
     31 #include "webrtc/modules/audio_device/android/opensles_player.h"
     32 #elif defined(WEBRTC_LINUX)
     33  #if defined(LINUX_ALSA)
     34    #include "audio_device_alsa_linux.h"
     35  #endif
     36 #if defined(LINUX_PULSE)
     37     #include "audio_device_pulse_linux.h"
     38 #endif
     39 #elif defined(WEBRTC_IOS)
     40     #include "audio_device_ios.h"
     41 #elif defined(WEBRTC_MAC)
     42     #include "audio_device_mac.h"
     43 #endif
     44 
     45 #if defined(WEBRTC_DUMMY_FILE_DEVICES)
     46 #include "webrtc/modules/audio_device/dummy/file_audio_device_factory.h"
     47 #endif
     48 
     49 #include "webrtc/modules/audio_device/dummy/audio_device_dummy.h"
     50 #include "webrtc/modules/audio_device/dummy/file_audio_device.h"
     51 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
     52 #include "webrtc/system_wrappers/include/trace.h"
     53 
     54 #define CHECK_INITIALIZED()         \
     55 {                                   \
     56     if (!_initialized) {            \
     57         return -1;                  \
     58     };                              \
     59 }
     60 
     61 #define CHECK_INITIALIZED_BOOL()    \
     62 {                                   \
     63     if (!_initialized) {            \
     64         return false;               \
     65     };                              \
     66 }
     67 
     68 namespace webrtc
     69 {
     70 
     71 AudioDeviceModule* CreateAudioDeviceModule(
     72     int32_t id, AudioDeviceModule::AudioLayer audioLayer) {
     73   return AudioDeviceModuleImpl::Create(id, audioLayer);
     74 }
     75 
     76 // ============================================================================
     77 //                                   Static methods
     78 // ============================================================================
     79 
     80 // ----------------------------------------------------------------------------
     81 //  AudioDeviceModule::Create()
     82 // ----------------------------------------------------------------------------
     83 
     84 AudioDeviceModule* AudioDeviceModuleImpl::Create(const int32_t id,
     85                                                  const AudioLayer audioLayer)
     86 {
     87     // Create the generic ref counted (platform independent) implementation.
     88     RefCountImpl<AudioDeviceModuleImpl>* audioDevice =
     89         new RefCountImpl<AudioDeviceModuleImpl>(id, audioLayer);
     90 
     91     // Ensure that the current platform is supported.
     92     if (audioDevice->CheckPlatform() == -1)
     93     {
     94         delete audioDevice;
     95         return NULL;
     96     }
     97 
     98     // Create the platform-dependent implementation.
     99     if (audioDevice->CreatePlatformSpecificObjects() == -1)
    100     {
    101         delete audioDevice;
    102         return NULL;
    103     }
    104 
    105     // Ensure that the generic audio buffer can communicate with the
    106     // platform-specific parts.
    107     if (audioDevice->AttachAudioBuffer() == -1)
    108     {
    109         delete audioDevice;
    110         return NULL;
    111     }
    112 
    113     WebRtcSpl_Init();
    114 
    115     return audioDevice;
    116 }
    117 
    118 // ============================================================================
    119 //                            Construction & Destruction
    120 // ============================================================================
    121 
    122 // ----------------------------------------------------------------------------
    123 //  AudioDeviceModuleImpl - ctor
    124 // ----------------------------------------------------------------------------
    125 
    126 AudioDeviceModuleImpl::AudioDeviceModuleImpl(const int32_t id, const AudioLayer audioLayer) :
    127     _critSect(*CriticalSectionWrapper::CreateCriticalSection()),
    128     _critSectEventCb(*CriticalSectionWrapper::CreateCriticalSection()),
    129     _critSectAudioCb(*CriticalSectionWrapper::CreateCriticalSection()),
    130     _ptrCbAudioDeviceObserver(NULL),
    131     _ptrAudioDevice(NULL),
    132     _id(id),
    133     _platformAudioLayer(audioLayer),
    134     _lastProcessTime(TickTime::MillisecondTimestamp()),
    135     _platformType(kPlatformNotSupported),
    136     _initialized(false),
    137     _lastError(kAdmErrNone)
    138 {
    139     WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, id, "%s created", __FUNCTION__);
    140 }
    141 
    142 // ----------------------------------------------------------------------------
    143 //  CheckPlatform
    144 // ----------------------------------------------------------------------------
    145 
    146 int32_t AudioDeviceModuleImpl::CheckPlatform()
    147 {
    148     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
    149 
    150     // Ensure that the current platform is supported
    151     //
    152     PlatformType platform(kPlatformNotSupported);
    153 
    154 #if defined(_WIN32)
    155     platform = kPlatformWin32;
    156     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is WIN32");
    157 #elif defined(WEBRTC_ANDROID)
    158     platform = kPlatformAndroid;
    159     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is ANDROID");
    160 #elif defined(WEBRTC_LINUX)
    161     platform = kPlatformLinux;
    162     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is LINUX");
    163 #elif defined(WEBRTC_IOS)
    164     platform = kPlatformIOS;
    165     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is IOS");
    166 #elif defined(WEBRTC_MAC)
    167     platform = kPlatformMac;
    168     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is MAC");
    169 #endif
    170 
    171     if (platform == kPlatformNotSupported)
    172     {
    173         WEBRTC_TRACE(kTraceCritical, kTraceAudioDevice, _id, "current platform is not supported => this module will self destruct!");
    174         return -1;
    175     }
    176 
    177     // Store valid output results
    178     //
    179     _platformType = platform;
    180 
    181     return 0;
    182 }
    183 
    184 
    185 // ----------------------------------------------------------------------------
    186 //  CreatePlatformSpecificObjects
    187 // ----------------------------------------------------------------------------
    188 
    189 int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects()
    190 {
    191     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
    192 
    193     AudioDeviceGeneric* ptrAudioDevice(NULL);
    194 
    195 #if defined(WEBRTC_DUMMY_AUDIO_BUILD)
    196     ptrAudioDevice = new AudioDeviceDummy(Id());
    197     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Dummy Audio APIs will be utilized");
    198 #elif defined(WEBRTC_DUMMY_FILE_DEVICES)
    199     ptrAudioDevice = FileAudioDeviceFactory::CreateFileAudioDevice(Id());
    200     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
    201                  "Will use file-playing dummy device.");
    202 #else
    203     AudioLayer audioLayer(PlatformAudioLayer());
    204 
    205     // Create the *Windows* implementation of the Audio Device
    206     //
    207 #if defined(_WIN32)
    208     if ((audioLayer == kWindowsWaveAudio)
    209 #if !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
    210         // Wave audio is default if Core audio is not supported in this build
    211         || (audioLayer == kPlatformDefaultAudio)
    212 #endif
    213         )
    214     {
    215         // create *Windows Wave Audio* implementation
    216         ptrAudioDevice = new AudioDeviceWindowsWave(Id());
    217         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Windows Wave APIs will be utilized");
    218     }
    219 #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
    220     if ((audioLayer == kWindowsCoreAudio) ||
    221         (audioLayer == kPlatformDefaultAudio)
    222         )
    223     {
    224         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "attempting to use the Windows Core Audio APIs...");
    225 
    226         if (AudioDeviceWindowsCore::CoreAudioIsSupported())
    227         {
    228             // create *Windows Core Audio* implementation
    229             ptrAudioDevice = new AudioDeviceWindowsCore(Id());
    230             WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Windows Core Audio APIs will be utilized");
    231         }
    232         else
    233         {
    234             // create *Windows Wave Audio* implementation
    235             ptrAudioDevice = new AudioDeviceWindowsWave(Id());
    236             if (ptrAudioDevice != NULL)
    237             {
    238                 // Core Audio was not supported => revert to Windows Wave instead
    239                 _platformAudioLayer = kWindowsWaveAudio;  // modify the state set at construction
    240                 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "Windows Core Audio is *not* supported => Wave APIs will be utilized instead");
    241             }
    242         }
    243     }
    244 #endif // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
    245 #endif  // #if defined(_WIN32)
    246 
    247 #if defined(WEBRTC_ANDROID)
    248     // Create an Android audio manager.
    249     _audioManagerAndroid.reset(new AudioManager());
    250     // Select best possible combination of audio layers.
    251     if (audioLayer == kPlatformDefaultAudio) {
    252         if (_audioManagerAndroid->IsLowLatencyPlayoutSupported()) {
    253           // Always use OpenSL ES for output on devices that supports the
    254           // low-latency output audio path.
    255           audioLayer = kAndroidJavaInputAndOpenSLESOutputAudio;
    256         } else {
    257           // Use Java-based audio in both directions when low-latency output
    258           // is not supported.
    259           audioLayer =  kAndroidJavaAudio;
    260         }
    261     }
    262     AudioManager* audio_manager = _audioManagerAndroid.get();
    263     if (audioLayer == kAndroidJavaAudio) {
    264       // Java audio for both input and output audio.
    265       ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(
    266           audioLayer, audio_manager);
    267     } else if (audioLayer == kAndroidJavaInputAndOpenSLESOutputAudio) {
    268       // Java audio for input and OpenSL ES for output audio (i.e. mixed APIs).
    269       // This combination provides low-latency output audio and at the same
    270       // time support for HW AEC using the AudioRecord Java API.
    271       ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, OpenSLESPlayer>(
    272           audioLayer, audio_manager);
    273     } else {
    274       // Invalid audio layer.
    275       ptrAudioDevice = NULL;
    276     }
    277     // END #if defined(WEBRTC_ANDROID)
    278 
    279     // Create the *Linux* implementation of the Audio Device
    280     //
    281 #elif defined(WEBRTC_LINUX)
    282     if ((audioLayer == kLinuxPulseAudio) || (audioLayer == kPlatformDefaultAudio))
    283     {
    284 #if defined(LINUX_PULSE)
    285         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "attempting to use the Linux PulseAudio APIs...");
    286 
    287         // create *Linux PulseAudio* implementation
    288         AudioDeviceLinuxPulse* pulseDevice = new AudioDeviceLinuxPulse(Id());
    289         if (pulseDevice->Init() != -1)
    290         {
    291             ptrAudioDevice = pulseDevice;
    292             WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Linux PulseAudio APIs will be utilized");
    293         }
    294         else
    295         {
    296             delete pulseDevice;
    297 #endif
    298 #if defined(LINUX_ALSA)
    299             // create *Linux ALSA Audio* implementation
    300             ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
    301             if (ptrAudioDevice != NULL)
    302             {
    303                 // Pulse Audio was not supported => revert to ALSA instead
    304                 _platformAudioLayer = kLinuxAlsaAudio;  // modify the state set at construction
    305                 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "Linux PulseAudio is *not* supported => ALSA APIs will be utilized instead");
    306             }
    307 #endif
    308 #if defined(LINUX_PULSE)
    309         }
    310 #endif
    311     }
    312     else if (audioLayer == kLinuxAlsaAudio)
    313     {
    314 #if defined(LINUX_ALSA)
    315         // create *Linux ALSA Audio* implementation
    316         ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
    317         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Linux ALSA APIs will be utilized");
    318 #endif
    319     }
    320 #endif  // #if defined(WEBRTC_LINUX)
    321 
    322     // Create the *iPhone* implementation of the Audio Device
    323     //
    324 #if defined(WEBRTC_IOS)
    325     if (audioLayer == kPlatformDefaultAudio)
    326     {
    327         // Create iOS Audio Device implementation.
    328       ptrAudioDevice = new AudioDeviceIOS();
    329         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "iPhone Audio APIs will be utilized");
    330     }
    331     // END #if defined(WEBRTC_IOS)
    332 
    333     // Create the *Mac* implementation of the Audio Device
    334     //
    335 #elif defined(WEBRTC_MAC)
    336     if (audioLayer == kPlatformDefaultAudio)
    337     {
    338         // Create *Mac Audio* implementation
    339         ptrAudioDevice = new AudioDeviceMac(Id());
    340         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Mac OS X Audio APIs will be utilized");
    341     }
    342 #endif  // WEBRTC_MAC
    343 
    344     // Create the *Dummy* implementation of the Audio Device
    345     // Available for all platforms
    346     //
    347     if (audioLayer == kDummyAudio)
    348     {
    349         // Create *Dummy Audio* implementation
    350         assert(!ptrAudioDevice);
    351         ptrAudioDevice = new AudioDeviceDummy(Id());
    352         WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Dummy Audio APIs will be utilized");
    353     }
    354 #endif  // if defined(WEBRTC_DUMMY_AUDIO_BUILD)
    355 
    356     if (ptrAudioDevice == NULL)
    357     {
    358         WEBRTC_TRACE(kTraceCritical, kTraceAudioDevice, _id, "unable to create the platform specific audio device implementation");
    359         return -1;
    360     }
    361 
    362     // Store valid output pointers
    363     //
    364     _ptrAudioDevice = ptrAudioDevice;
    365 
    366     return 0;
    367 }
    368 
    369 // ----------------------------------------------------------------------------
    370 //  AttachAudioBuffer
    371 //
    372 //  Install "bridge" between the platform implemetation and the generic
    373 //  implementation. The "child" shall set the native sampling rate and the
    374 //  number of channels in this function call.
    375 // ----------------------------------------------------------------------------
    376 
    377 int32_t AudioDeviceModuleImpl::AttachAudioBuffer()
    378 {
    379     WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
    380 
    381     _audioDeviceBuffer.SetId(_id);
    382     _ptrAudioDevice->AttachAudioBuffer(&_audioDeviceBuffer);
    383     return 0;
    384 }
    385 
    386 // ----------------------------------------------------------------------------
    387 //  ~AudioDeviceModuleImpl - dtor
    388 // ----------------------------------------------------------------------------
    389 
    390 AudioDeviceModuleImpl::~AudioDeviceModuleImpl()
    391 {
    392     WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, _id, "%s destroyed", __FUNCTION__);
    393 
    394     if (_ptrAudioDevice)
    395     {
    396         delete _ptrAudioDevice;
    397         _ptrAudioDevice = NULL;
    398     }
    399 
    400     delete &_critSect;
    401     delete &_critSectEventCb;
    402     delete &_critSectAudioCb;
    403 }
    404 
    405 // ============================================================================
    406 //                                  Module
    407 // ============================================================================
    408 
    409 // ----------------------------------------------------------------------------
    410 //  Module::TimeUntilNextProcess
    411 //
    412 //  Returns the number of milliseconds until the module want a worker thread
    413 //  to call Process().
    414 // ----------------------------------------------------------------------------
    415 
    416 int64_t AudioDeviceModuleImpl::TimeUntilNextProcess()
    417 {
    418     int64_t now = TickTime::MillisecondTimestamp();
    419     int64_t deltaProcess = kAdmMaxIdleTimeProcess - (now - _lastProcessTime);
    420     return deltaProcess;
    421 }
    422 
    423 // ----------------------------------------------------------------------------
    424 //  Module::Process
    425 //
    426 //  Check for posted error and warning reports. Generate callbacks if
    427 //  new reports exists.
    428 // ----------------------------------------------------------------------------
    429 
    430 int32_t AudioDeviceModuleImpl::Process()
    431 {
    432 
    433     _lastProcessTime = TickTime::MillisecondTimestamp();
    434 
    435     // kPlayoutWarning
    436     if (_ptrAudioDevice->PlayoutWarning())
    437     {
    438         CriticalSectionScoped lock(&_critSectEventCb);
    439         if (_ptrCbAudioDeviceObserver)
    440         {
    441             WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "=> OnWarningIsReported(kPlayoutWarning)");
    442             _ptrCbAudioDeviceObserver->OnWarningIsReported(AudioDeviceObserver::kPlayoutWarning);
    443         }
    444         _ptrAudioDevice->ClearPlayoutWarning();
    445     }
    446 
    447     // kPlayoutError
    448     if (_ptrAudioDevice->PlayoutError())
    449     {
    450         CriticalSectionScoped lock(&_critSectEventCb);
    451         if (_ptrCbAudioDeviceObserver)
    452         {
    453             WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "=> OnErrorIsReported(kPlayoutError)");
    454             _ptrCbAudioDeviceObserver->OnErrorIsReported(AudioDeviceObserver::kPlayoutError);
    455         }
    456         _ptrAudioDevice->ClearPlayoutError();
    457     }
    458 
    459     // kRecordingWarning
    460     if (_ptrAudioDevice->RecordingWarning())
    461     {
    462         CriticalSectionScoped lock(&_critSectEventCb);
    463         if (_ptrCbAudioDeviceObserver)
    464         {
    465             WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "=> OnWarningIsReported(kRecordingWarning)");
    466             _ptrCbAudioDeviceObserver->OnWarningIsReported(AudioDeviceObserver::kRecordingWarning);
    467         }
    468         _ptrAudioDevice->ClearRecordingWarning();
    469     }
    470 
    471     // kRecordingError
    472     if (_ptrAudioDevice->RecordingError())
    473     {
    474         CriticalSectionScoped lock(&_critSectEventCb);
    475         if (_ptrCbAudioDeviceObserver)
    476         {
    477             WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "=> OnErrorIsReported(kRecordingError)");
    478             _ptrCbAudioDeviceObserver->OnErrorIsReported(AudioDeviceObserver::kRecordingError);
    479         }
    480         _ptrAudioDevice->ClearRecordingError();
    481     }
    482 
    483     return 0;
    484 }
    485 
    486 // ============================================================================
    487 //                                    Public API
    488 // ============================================================================
    489 
    490 // ----------------------------------------------------------------------------
    491 //  ActiveAudioLayer
    492 // ----------------------------------------------------------------------------
    493 
    494 int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const {
    495   AudioLayer activeAudio;
    496   if (_ptrAudioDevice->ActiveAudioLayer(activeAudio) == -1) {
    497     return -1;
    498   }
    499   *audioLayer = activeAudio;
    500   return 0;
    501 }
    502 
    503 // ----------------------------------------------------------------------------
    504 //  LastError
    505 // ----------------------------------------------------------------------------
    506 
    507 AudioDeviceModule::ErrorCode AudioDeviceModuleImpl::LastError() const
    508 {
    509     return _lastError;
    510 }
    511 
    512 // ----------------------------------------------------------------------------
    513 //  Init
    514 // ----------------------------------------------------------------------------
    515 
    516 int32_t AudioDeviceModuleImpl::Init()
    517 {
    518 
    519     if (_initialized)
    520         return 0;
    521 
    522     if (!_ptrAudioDevice)
    523         return -1;
    524 
    525     if (_ptrAudioDevice->Init() == -1)
    526     {
    527         return -1;
    528     }
    529 
    530     _initialized = true;
    531     return 0;
    532 }
    533 
    534 // ----------------------------------------------------------------------------
    535 //  Terminate
    536 // ----------------------------------------------------------------------------
    537 
    538 int32_t AudioDeviceModuleImpl::Terminate()
    539 {
    540 
    541     if (!_initialized)
    542         return 0;
    543 
    544     if (_ptrAudioDevice->Terminate() == -1)
    545     {
    546         return -1;
    547     }
    548 
    549     _initialized = false;
    550     return 0;
    551 }
    552 
    553 // ----------------------------------------------------------------------------
    554 //  Initialized
    555 // ----------------------------------------------------------------------------
    556 
    557 bool AudioDeviceModuleImpl::Initialized() const
    558 {
    559 
    560     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", _initialized);
    561     return (_initialized);
    562 }
    563 
    564 // ----------------------------------------------------------------------------
    565 //  InitSpeaker
    566 // ----------------------------------------------------------------------------
    567 
    568 int32_t AudioDeviceModuleImpl::InitSpeaker()
    569 {
    570     CHECK_INITIALIZED();
    571     return (_ptrAudioDevice->InitSpeaker());
    572 }
    573 
    574 // ----------------------------------------------------------------------------
    575 //  InitMicrophone
    576 // ----------------------------------------------------------------------------
    577 
    578 int32_t AudioDeviceModuleImpl::InitMicrophone()
    579 {
    580     CHECK_INITIALIZED();
    581     return (_ptrAudioDevice->InitMicrophone());
    582 }
    583 
    584 // ----------------------------------------------------------------------------
    585 //  SpeakerVolumeIsAvailable
    586 // ----------------------------------------------------------------------------
    587 
    588 int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available)
    589 {
    590     CHECK_INITIALIZED();
    591 
    592     bool isAvailable(0);
    593 
    594     if (_ptrAudioDevice->SpeakerVolumeIsAvailable(isAvailable) == -1)
    595     {
    596         return -1;
    597     }
    598 
    599     *available = isAvailable;
    600 
    601     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    602     return (0);
    603 }
    604 
    605 // ----------------------------------------------------------------------------
    606 //  SetSpeakerVolume
    607 // ----------------------------------------------------------------------------
    608 
    609 int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume)
    610 {
    611     CHECK_INITIALIZED();
    612     return (_ptrAudioDevice->SetSpeakerVolume(volume));
    613 }
    614 
    615 // ----------------------------------------------------------------------------
    616 //  SpeakerVolume
    617 // ----------------------------------------------------------------------------
    618 
    619 int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const
    620 {
    621     CHECK_INITIALIZED();
    622 
    623     uint32_t level(0);
    624 
    625     if (_ptrAudioDevice->SpeakerVolume(level) == -1)
    626     {
    627         return -1;
    628     }
    629 
    630     *volume = level;
    631 
    632     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: volume=%u", *volume);
    633     return (0);
    634 }
    635 
    636 // ----------------------------------------------------------------------------
    637 //  SetWaveOutVolume
    638 // ----------------------------------------------------------------------------
    639 
    640 int32_t AudioDeviceModuleImpl::SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight)
    641 {
    642     CHECK_INITIALIZED();
    643     return (_ptrAudioDevice->SetWaveOutVolume(volumeLeft, volumeRight));
    644 }
    645 
    646 // ----------------------------------------------------------------------------
    647 //  WaveOutVolume
    648 // ----------------------------------------------------------------------------
    649 
    650 int32_t AudioDeviceModuleImpl::WaveOutVolume(uint16_t* volumeLeft, uint16_t* volumeRight) const
    651 {
    652     CHECK_INITIALIZED();
    653 
    654     uint16_t volLeft(0);
    655     uint16_t volRight(0);
    656 
    657     if (_ptrAudioDevice->WaveOutVolume(volLeft, volRight) == -1)
    658     {
    659         return -1;
    660     }
    661 
    662     *volumeLeft = volLeft;
    663     *volumeRight = volRight;
    664 
    665     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "outputs: volumeLeft=%u, volumeRight=%u",
    666         *volumeLeft, *volumeRight);
    667 
    668     return (0);
    669 }
    670 
    671 // ----------------------------------------------------------------------------
    672 //  SpeakerIsInitialized
    673 // ----------------------------------------------------------------------------
    674 
    675 bool AudioDeviceModuleImpl::SpeakerIsInitialized() const
    676 {
    677     CHECK_INITIALIZED_BOOL();
    678 
    679     bool isInitialized = _ptrAudioDevice->SpeakerIsInitialized();
    680 
    681     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", isInitialized);
    682     return (isInitialized);
    683 }
    684 
    685 // ----------------------------------------------------------------------------
    686 //  MicrophoneIsInitialized
    687 // ----------------------------------------------------------------------------
    688 
    689 bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const
    690 {
    691     CHECK_INITIALIZED_BOOL();
    692 
    693     bool isInitialized = _ptrAudioDevice->MicrophoneIsInitialized();
    694 
    695     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", isInitialized);
    696     return (isInitialized);
    697 }
    698 
    699 // ----------------------------------------------------------------------------
    700 //  MaxSpeakerVolume
    701 // ----------------------------------------------------------------------------
    702 
    703 int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const
    704 {
    705     CHECK_INITIALIZED();
    706 
    707     uint32_t maxVol(0);
    708 
    709     if (_ptrAudioDevice->MaxSpeakerVolume(maxVol) == -1)
    710     {
    711         return -1;
    712     }
    713 
    714     *maxVolume = maxVol;
    715 
    716     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: maxVolume=%d", *maxVolume);
    717     return (0);
    718 }
    719 
    720 // ----------------------------------------------------------------------------
    721 //  MinSpeakerVolume
    722 // ----------------------------------------------------------------------------
    723 
    724 int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const
    725 {
    726     CHECK_INITIALIZED();
    727 
    728     uint32_t minVol(0);
    729 
    730     if (_ptrAudioDevice->MinSpeakerVolume(minVol) == -1)
    731     {
    732         return -1;
    733     }
    734 
    735     *minVolume = minVol;
    736 
    737     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u", *minVolume);
    738     return (0);
    739 }
    740 
    741 // ----------------------------------------------------------------------------
    742 //  SpeakerVolumeStepSize
    743 // ----------------------------------------------------------------------------
    744 
    745 int32_t AudioDeviceModuleImpl::SpeakerVolumeStepSize(uint16_t* stepSize) const
    746 {
    747     CHECK_INITIALIZED();
    748 
    749     uint16_t delta(0);
    750 
    751     if (_ptrAudioDevice->SpeakerVolumeStepSize(delta) == -1)
    752     {
    753         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the speaker-volume step size");
    754         return -1;
    755     }
    756 
    757     *stepSize = delta;
    758 
    759     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u", *stepSize);
    760     return (0);
    761 }
    762 
    763 // ----------------------------------------------------------------------------
    764 //  SpeakerMuteIsAvailable
    765 // ----------------------------------------------------------------------------
    766 
    767 int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available)
    768 {
    769     CHECK_INITIALIZED();
    770 
    771     bool isAvailable(0);
    772 
    773     if (_ptrAudioDevice->SpeakerMuteIsAvailable(isAvailable) == -1)
    774     {
    775         return -1;
    776     }
    777 
    778     *available = isAvailable;
    779 
    780     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    781     return (0);
    782 }
    783 
    784 // ----------------------------------------------------------------------------
    785 //  SetSpeakerMute
    786 // ----------------------------------------------------------------------------
    787 
    788 int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable)
    789 {
    790     CHECK_INITIALIZED();
    791     return (_ptrAudioDevice->SetSpeakerMute(enable));
    792 }
    793 
    794 // ----------------------------------------------------------------------------
    795 //  SpeakerMute
    796 // ----------------------------------------------------------------------------
    797 
    798 int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const
    799 {
    800     CHECK_INITIALIZED();
    801 
    802     bool muted(false);
    803 
    804     if (_ptrAudioDevice->SpeakerMute(muted) == -1)
    805     {
    806         return -1;
    807     }
    808 
    809     *enabled = muted;
    810 
    811     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled);
    812     return (0);
    813 }
    814 
    815 // ----------------------------------------------------------------------------
    816 //  MicrophoneMuteIsAvailable
    817 // ----------------------------------------------------------------------------
    818 
    819 int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available)
    820 {
    821     CHECK_INITIALIZED();
    822 
    823     bool isAvailable(0);
    824 
    825     if (_ptrAudioDevice->MicrophoneMuteIsAvailable(isAvailable) == -1)
    826     {
    827         return -1;
    828     }
    829 
    830     *available = isAvailable;
    831 
    832     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    833     return (0);
    834 }
    835 
    836 // ----------------------------------------------------------------------------
    837 //  SetMicrophoneMute
    838 // ----------------------------------------------------------------------------
    839 
    840 int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable)
    841 {
    842     CHECK_INITIALIZED();
    843     return (_ptrAudioDevice->SetMicrophoneMute(enable));
    844 }
    845 
    846 // ----------------------------------------------------------------------------
    847 //  MicrophoneMute
    848 // ----------------------------------------------------------------------------
    849 
    850 int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const
    851 {
    852     CHECK_INITIALIZED();
    853 
    854     bool muted(false);
    855 
    856     if (_ptrAudioDevice->MicrophoneMute(muted) == -1)
    857     {
    858         return -1;
    859     }
    860 
    861     *enabled = muted;
    862 
    863     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled);
    864     return (0);
    865 }
    866 
    867 // ----------------------------------------------------------------------------
    868 //  MicrophoneBoostIsAvailable
    869 // ----------------------------------------------------------------------------
    870 
    871 int32_t AudioDeviceModuleImpl::MicrophoneBoostIsAvailable(bool* available)
    872 {
    873     CHECK_INITIALIZED();
    874 
    875     bool isAvailable(0);
    876 
    877     if (_ptrAudioDevice->MicrophoneBoostIsAvailable(isAvailable) == -1)
    878     {
    879         return -1;
    880     }
    881 
    882     *available = isAvailable;
    883 
    884     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    885     return (0);
    886 }
    887 
    888 // ----------------------------------------------------------------------------
    889 //  SetMicrophoneBoost
    890 // ----------------------------------------------------------------------------
    891 
    892 int32_t AudioDeviceModuleImpl::SetMicrophoneBoost(bool enable)
    893 {
    894     CHECK_INITIALIZED();
    895     return (_ptrAudioDevice->SetMicrophoneBoost(enable));
    896 }
    897 
    898 // ----------------------------------------------------------------------------
    899 //  MicrophoneBoost
    900 // ----------------------------------------------------------------------------
    901 
    902 int32_t AudioDeviceModuleImpl::MicrophoneBoost(bool* enabled) const
    903 {
    904     CHECK_INITIALIZED();
    905 
    906     bool onOff(false);
    907 
    908     if (_ptrAudioDevice->MicrophoneBoost(onOff) == -1)
    909     {
    910         return -1;
    911     }
    912 
    913     *enabled = onOff;
    914 
    915     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled);
    916     return (0);
    917 }
    918 
    919 // ----------------------------------------------------------------------------
    920 //  MicrophoneVolumeIsAvailable
    921 // ----------------------------------------------------------------------------
    922 
    923 int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available)
    924 {
    925     CHECK_INITIALIZED();
    926 
    927     bool isAvailable(0);
    928 
    929     if (_ptrAudioDevice->MicrophoneVolumeIsAvailable(isAvailable) == -1)
    930     {
    931         return -1;
    932     }
    933 
    934     *available = isAvailable;
    935 
    936     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    937     return (0);
    938 }
    939 
    940 // ----------------------------------------------------------------------------
    941 //  SetMicrophoneVolume
    942 // ----------------------------------------------------------------------------
    943 
    944 int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume)
    945 {
    946     CHECK_INITIALIZED();
    947     return (_ptrAudioDevice->SetMicrophoneVolume(volume));
    948 }
    949 
    950 // ----------------------------------------------------------------------------
    951 //  MicrophoneVolume
    952 // ----------------------------------------------------------------------------
    953 
    954 int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const
    955 {
    956     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
    957     CHECK_INITIALIZED();
    958 
    959     uint32_t level(0);
    960 
    961     if (_ptrAudioDevice->MicrophoneVolume(level) == -1)
    962     {
    963         return -1;
    964     }
    965 
    966     *volume = level;
    967 
    968     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: volume=%u", *volume);
    969     return (0);
    970 }
    971 
    972 // ----------------------------------------------------------------------------
    973 //  StereoRecordingIsAvailable
    974 // ----------------------------------------------------------------------------
    975 
    976 int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(bool* available) const
    977 {
    978     CHECK_INITIALIZED();
    979 
    980     bool isAvailable(0);
    981 
    982     if (_ptrAudioDevice->StereoRecordingIsAvailable(isAvailable) == -1)
    983     {
    984         return -1;
    985     }
    986 
    987     *available = isAvailable;
    988 
    989     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
    990     return (0);
    991 }
    992 
    993 // ----------------------------------------------------------------------------
    994 //  SetStereoRecording
    995 // ----------------------------------------------------------------------------
    996 
    997 int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable)
    998 {
    999     CHECK_INITIALIZED();
   1000 
   1001     if (_ptrAudioDevice->RecordingIsInitialized())
   1002     {
   1003         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "recording in stereo is not supported");
   1004         return -1;
   1005     }
   1006 
   1007     if (_ptrAudioDevice->SetStereoRecording(enable) == -1)
   1008     {
   1009         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to enable stereo recording");
   1010         return -1;
   1011     }
   1012 
   1013     int8_t nChannels(1);
   1014     if (enable)
   1015     {
   1016         nChannels = 2;
   1017     }
   1018     _audioDeviceBuffer.SetRecordingChannels(nChannels);
   1019 
   1020     return 0;
   1021 }
   1022 
   1023 // ----------------------------------------------------------------------------
   1024 //  StereoRecording
   1025 // ----------------------------------------------------------------------------
   1026 
   1027 int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const
   1028 {
   1029     CHECK_INITIALIZED();
   1030 
   1031     bool stereo(false);
   1032 
   1033     if (_ptrAudioDevice->StereoRecording(stereo) == -1)
   1034     {
   1035         return -1;
   1036     }
   1037 
   1038     *enabled = stereo;
   1039 
   1040     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled);
   1041     return (0);
   1042 }
   1043 
   1044 // ----------------------------------------------------------------------------
   1045 //  SetRecordingChannel
   1046 // ----------------------------------------------------------------------------
   1047 
   1048 int32_t AudioDeviceModuleImpl::SetRecordingChannel(const ChannelType channel)
   1049 {
   1050     if (channel == kChannelBoth)
   1051     {
   1052     }
   1053     else if (channel == kChannelLeft)
   1054     {
   1055     }
   1056     else
   1057     {
   1058     }
   1059     CHECK_INITIALIZED();
   1060 
   1061     bool stereo(false);
   1062 
   1063     if (_ptrAudioDevice->StereoRecording(stereo) == -1)
   1064     {
   1065         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "recording in stereo is not supported");
   1066         return -1;
   1067     }
   1068 
   1069     return (_audioDeviceBuffer.SetRecordingChannel(channel));
   1070 }
   1071 
   1072 // ----------------------------------------------------------------------------
   1073 //  RecordingChannel
   1074 // ----------------------------------------------------------------------------
   1075 
   1076 int32_t AudioDeviceModuleImpl::RecordingChannel(ChannelType* channel) const
   1077 {
   1078     CHECK_INITIALIZED();
   1079 
   1080     ChannelType chType;
   1081 
   1082     if (_audioDeviceBuffer.RecordingChannel(chType) == -1)
   1083     {
   1084         return -1;
   1085     }
   1086 
   1087     *channel = chType;
   1088 
   1089     if (*channel == kChannelBoth)
   1090     {
   1091     }
   1092     else if (*channel == kChannelLeft)
   1093     {
   1094     }
   1095     else
   1096     {
   1097     }
   1098 
   1099     return (0);
   1100 }
   1101 
   1102 // ----------------------------------------------------------------------------
   1103 //  StereoPlayoutIsAvailable
   1104 // ----------------------------------------------------------------------------
   1105 
   1106 int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const
   1107 {
   1108     CHECK_INITIALIZED();
   1109 
   1110     bool isAvailable(0);
   1111 
   1112     if (_ptrAudioDevice->StereoPlayoutIsAvailable(isAvailable) == -1)
   1113     {
   1114         return -1;
   1115     }
   1116 
   1117     *available = isAvailable;
   1118 
   1119     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
   1120     return (0);
   1121 }
   1122 
   1123 // ----------------------------------------------------------------------------
   1124 //  SetStereoPlayout
   1125 // ----------------------------------------------------------------------------
   1126 
   1127 int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable)
   1128 {
   1129     CHECK_INITIALIZED();
   1130 
   1131     if (_ptrAudioDevice->PlayoutIsInitialized())
   1132     {
   1133         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "unable to set stereo mode while playing side is initialized");
   1134         return -1;
   1135     }
   1136 
   1137     if (_ptrAudioDevice->SetStereoPlayout(enable))
   1138     {
   1139         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "stereo playout is not supported");
   1140         return -1;
   1141     }
   1142 
   1143     int8_t nChannels(1);
   1144     if (enable)
   1145     {
   1146         nChannels = 2;
   1147     }
   1148     _audioDeviceBuffer.SetPlayoutChannels(nChannels);
   1149 
   1150     return 0;
   1151 }
   1152 
   1153 // ----------------------------------------------------------------------------
   1154 //  StereoPlayout
   1155 // ----------------------------------------------------------------------------
   1156 
   1157 int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const
   1158 {
   1159     CHECK_INITIALIZED();
   1160 
   1161     bool stereo(false);
   1162 
   1163     if (_ptrAudioDevice->StereoPlayout(stereo) == -1)
   1164     {
   1165         return -1;
   1166     }
   1167 
   1168    *enabled = stereo;
   1169 
   1170    WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled);
   1171    return (0);
   1172 }
   1173 
   1174 // ----------------------------------------------------------------------------
   1175 //  SetAGC
   1176 // ----------------------------------------------------------------------------
   1177 
   1178 int32_t AudioDeviceModuleImpl::SetAGC(bool enable)
   1179 {
   1180     CHECK_INITIALIZED();
   1181     return (_ptrAudioDevice->SetAGC(enable));
   1182 }
   1183 
   1184 // ----------------------------------------------------------------------------
   1185 //  AGC
   1186 // ----------------------------------------------------------------------------
   1187 
   1188 bool AudioDeviceModuleImpl::AGC() const
   1189 {
   1190     CHECK_INITIALIZED_BOOL();
   1191     return (_ptrAudioDevice->AGC());
   1192 }
   1193 
   1194 // ----------------------------------------------------------------------------
   1195 //  PlayoutIsAvailable
   1196 // ----------------------------------------------------------------------------
   1197 
   1198 int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available)
   1199 {
   1200     CHECK_INITIALIZED();
   1201 
   1202     bool isAvailable(0);
   1203 
   1204     if (_ptrAudioDevice->PlayoutIsAvailable(isAvailable) == -1)
   1205     {
   1206         return -1;
   1207     }
   1208 
   1209     *available = isAvailable;
   1210 
   1211     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
   1212     return (0);
   1213 }
   1214 
   1215 // ----------------------------------------------------------------------------
   1216 //  RecordingIsAvailable
   1217 // ----------------------------------------------------------------------------
   1218 
   1219 int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available)
   1220 {
   1221     CHECK_INITIALIZED();
   1222 
   1223     bool isAvailable(0);
   1224 
   1225     if (_ptrAudioDevice->RecordingIsAvailable(isAvailable) == -1)
   1226     {
   1227         return -1;
   1228     }
   1229 
   1230     *available = isAvailable;
   1231 
   1232     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available);
   1233     return (0);
   1234 }
   1235 
   1236 // ----------------------------------------------------------------------------
   1237 //  MaxMicrophoneVolume
   1238 // ----------------------------------------------------------------------------
   1239 
   1240 int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const
   1241 {
   1242     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
   1243     CHECK_INITIALIZED();
   1244 
   1245     uint32_t maxVol(0);
   1246 
   1247     if (_ptrAudioDevice->MaxMicrophoneVolume(maxVol) == -1)
   1248     {
   1249         return -1;
   1250     }
   1251 
   1252     *maxVolume = maxVol;
   1253 
   1254     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: maxVolume=%d", *maxVolume);
   1255     return (0);
   1256 }
   1257 
   1258 // ----------------------------------------------------------------------------
   1259 //  MinMicrophoneVolume
   1260 // ----------------------------------------------------------------------------
   1261 
   1262 int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const
   1263 {
   1264     CHECK_INITIALIZED();
   1265 
   1266     uint32_t minVol(0);
   1267 
   1268     if (_ptrAudioDevice->MinMicrophoneVolume(minVol) == -1)
   1269     {
   1270         return -1;
   1271     }
   1272 
   1273     *minVolume = minVol;
   1274 
   1275     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u", *minVolume);
   1276     return (0);
   1277 }
   1278 
   1279 // ----------------------------------------------------------------------------
   1280 //  MicrophoneVolumeStepSize
   1281 // ----------------------------------------------------------------------------
   1282 
   1283 int32_t AudioDeviceModuleImpl::MicrophoneVolumeStepSize(uint16_t* stepSize) const
   1284 {
   1285     CHECK_INITIALIZED();
   1286 
   1287     uint16_t delta(0);
   1288 
   1289     if (_ptrAudioDevice->MicrophoneVolumeStepSize(delta) == -1)
   1290     {
   1291         return -1;
   1292     }
   1293 
   1294     *stepSize = delta;
   1295 
   1296     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u", *stepSize);
   1297     return (0);
   1298 }
   1299 
   1300 // ----------------------------------------------------------------------------
   1301 //  PlayoutDevices
   1302 // ----------------------------------------------------------------------------
   1303 
   1304 int16_t AudioDeviceModuleImpl::PlayoutDevices()
   1305 {
   1306     CHECK_INITIALIZED();
   1307 
   1308     uint16_t nPlayoutDevices = _ptrAudioDevice->PlayoutDevices();
   1309 
   1310     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: #playout devices=%d", nPlayoutDevices);
   1311     return ((int16_t)(nPlayoutDevices));
   1312 }
   1313 
   1314 // ----------------------------------------------------------------------------
   1315 //  SetPlayoutDevice I (II)
   1316 // ----------------------------------------------------------------------------
   1317 
   1318 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index)
   1319 {
   1320     CHECK_INITIALIZED();
   1321     return (_ptrAudioDevice->SetPlayoutDevice(index));
   1322 }
   1323 
   1324 // ----------------------------------------------------------------------------
   1325 //  SetPlayoutDevice II (II)
   1326 // ----------------------------------------------------------------------------
   1327 
   1328 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device)
   1329 {
   1330     if (device == kDefaultDevice)
   1331     {
   1332     }
   1333     else
   1334     {
   1335     }
   1336     CHECK_INITIALIZED();
   1337 
   1338     return (_ptrAudioDevice->SetPlayoutDevice(device));
   1339 }
   1340 
   1341 // ----------------------------------------------------------------------------
   1342 //  PlayoutDeviceName
   1343 // ----------------------------------------------------------------------------
   1344 
   1345 int32_t AudioDeviceModuleImpl::PlayoutDeviceName(
   1346     uint16_t index,
   1347     char name[kAdmMaxDeviceNameSize],
   1348     char guid[kAdmMaxGuidSize])
   1349 {
   1350     CHECK_INITIALIZED();
   1351 
   1352     if (name == NULL)
   1353     {
   1354         _lastError = kAdmErrArgument;
   1355         return -1;
   1356     }
   1357 
   1358     if (_ptrAudioDevice->PlayoutDeviceName(index, name, guid) == -1)
   1359     {
   1360         return -1;
   1361     }
   1362 
   1363     if (name != NULL)
   1364     {
   1365         WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s", name);
   1366     }
   1367     if (guid != NULL)
   1368     {
   1369         WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s", guid);
   1370     }
   1371 
   1372     return (0);
   1373 }
   1374 
   1375 // ----------------------------------------------------------------------------
   1376 //  RecordingDeviceName
   1377 // ----------------------------------------------------------------------------
   1378 
   1379 int32_t AudioDeviceModuleImpl::RecordingDeviceName(
   1380     uint16_t index,
   1381     char name[kAdmMaxDeviceNameSize],
   1382     char guid[kAdmMaxGuidSize])
   1383 {
   1384     CHECK_INITIALIZED();
   1385 
   1386     if (name == NULL)
   1387     {
   1388         _lastError = kAdmErrArgument;
   1389         return -1;
   1390     }
   1391 
   1392     if (_ptrAudioDevice->RecordingDeviceName(index, name, guid) == -1)
   1393     {
   1394         return -1;
   1395     }
   1396 
   1397     if (name != NULL)
   1398     {
   1399         WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s", name);
   1400     }
   1401     if (guid != NULL)
   1402     {
   1403         WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s", guid);
   1404     }
   1405 
   1406     return (0);
   1407 }
   1408 
   1409 // ----------------------------------------------------------------------------
   1410 //  RecordingDevices
   1411 // ----------------------------------------------------------------------------
   1412 
   1413 int16_t AudioDeviceModuleImpl::RecordingDevices()
   1414 {
   1415     CHECK_INITIALIZED();
   1416 
   1417     uint16_t nRecordingDevices = _ptrAudioDevice->RecordingDevices();
   1418 
   1419     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
   1420                  "output: #recording devices=%d", nRecordingDevices);
   1421     return ((int16_t)nRecordingDevices);
   1422 }
   1423 
   1424 // ----------------------------------------------------------------------------
   1425 //  SetRecordingDevice I (II)
   1426 // ----------------------------------------------------------------------------
   1427 
   1428 int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index)
   1429 {
   1430     CHECK_INITIALIZED();
   1431     return (_ptrAudioDevice->SetRecordingDevice(index));
   1432 }
   1433 
   1434 // ----------------------------------------------------------------------------
   1435 //  SetRecordingDevice II (II)
   1436 // ----------------------------------------------------------------------------
   1437 
   1438 int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device)
   1439 {
   1440     if (device == kDefaultDevice)
   1441     {
   1442     }
   1443     else
   1444     {
   1445     }
   1446     CHECK_INITIALIZED();
   1447 
   1448     return (_ptrAudioDevice->SetRecordingDevice(device));
   1449 }
   1450 
   1451 // ----------------------------------------------------------------------------
   1452 //  InitPlayout
   1453 // ----------------------------------------------------------------------------
   1454 
   1455 int32_t AudioDeviceModuleImpl::InitPlayout()
   1456 {
   1457     CHECK_INITIALIZED();
   1458     _audioDeviceBuffer.InitPlayout();
   1459     return (_ptrAudioDevice->InitPlayout());
   1460 }
   1461 
   1462 // ----------------------------------------------------------------------------
   1463 //  InitRecording
   1464 // ----------------------------------------------------------------------------
   1465 
   1466 int32_t AudioDeviceModuleImpl::InitRecording()
   1467 {
   1468     CHECK_INITIALIZED();
   1469     _audioDeviceBuffer.InitRecording();
   1470     return (_ptrAudioDevice->InitRecording());
   1471 }
   1472 
   1473 // ----------------------------------------------------------------------------
   1474 //  PlayoutIsInitialized
   1475 // ----------------------------------------------------------------------------
   1476 
   1477 bool AudioDeviceModuleImpl::PlayoutIsInitialized() const
   1478 {
   1479     CHECK_INITIALIZED_BOOL();
   1480     return (_ptrAudioDevice->PlayoutIsInitialized());
   1481 }
   1482 
   1483 // ----------------------------------------------------------------------------
   1484 //  RecordingIsInitialized
   1485 // ----------------------------------------------------------------------------
   1486 
   1487 bool AudioDeviceModuleImpl::RecordingIsInitialized() const
   1488 {
   1489     CHECK_INITIALIZED_BOOL();
   1490     return (_ptrAudioDevice->RecordingIsInitialized());
   1491 }
   1492 
   1493 // ----------------------------------------------------------------------------
   1494 //  StartPlayout
   1495 // ----------------------------------------------------------------------------
   1496 
   1497 int32_t AudioDeviceModuleImpl::StartPlayout()
   1498 {
   1499     CHECK_INITIALIZED();
   1500     return (_ptrAudioDevice->StartPlayout());
   1501 }
   1502 
   1503 // ----------------------------------------------------------------------------
   1504 //  StopPlayout
   1505 // ----------------------------------------------------------------------------
   1506 
   1507 int32_t AudioDeviceModuleImpl::StopPlayout()
   1508 {
   1509     CHECK_INITIALIZED();
   1510     return (_ptrAudioDevice->StopPlayout());
   1511 }
   1512 
   1513 // ----------------------------------------------------------------------------
   1514 //  Playing
   1515 // ----------------------------------------------------------------------------
   1516 
   1517 bool AudioDeviceModuleImpl::Playing() const
   1518 {
   1519     CHECK_INITIALIZED_BOOL();
   1520     return (_ptrAudioDevice->Playing());
   1521 }
   1522 
   1523 // ----------------------------------------------------------------------------
   1524 //  StartRecording
   1525 // ----------------------------------------------------------------------------
   1526 
   1527 int32_t AudioDeviceModuleImpl::StartRecording()
   1528 {
   1529     CHECK_INITIALIZED();
   1530     return (_ptrAudioDevice->StartRecording());
   1531 }
   1532 // ----------------------------------------------------------------------------
   1533 //  StopRecording
   1534 // ----------------------------------------------------------------------------
   1535 
   1536 int32_t AudioDeviceModuleImpl::StopRecording()
   1537 {
   1538     CHECK_INITIALIZED();
   1539     return (_ptrAudioDevice->StopRecording());
   1540 }
   1541 
   1542 // ----------------------------------------------------------------------------
   1543 //  Recording
   1544 // ----------------------------------------------------------------------------
   1545 
   1546 bool AudioDeviceModuleImpl::Recording() const
   1547 {
   1548     CHECK_INITIALIZED_BOOL();
   1549     return (_ptrAudioDevice->Recording());
   1550 }
   1551 
   1552 // ----------------------------------------------------------------------------
   1553 //  RegisterEventObserver
   1554 // ----------------------------------------------------------------------------
   1555 
   1556 int32_t AudioDeviceModuleImpl::RegisterEventObserver(AudioDeviceObserver* eventCallback)
   1557 {
   1558 
   1559     CriticalSectionScoped lock(&_critSectEventCb);
   1560     _ptrCbAudioDeviceObserver = eventCallback;
   1561 
   1562     return 0;
   1563 }
   1564 
   1565 // ----------------------------------------------------------------------------
   1566 //  RegisterAudioCallback
   1567 // ----------------------------------------------------------------------------
   1568 
   1569 int32_t AudioDeviceModuleImpl::RegisterAudioCallback(AudioTransport* audioCallback)
   1570 {
   1571 
   1572     CriticalSectionScoped lock(&_critSectAudioCb);
   1573     _audioDeviceBuffer.RegisterAudioCallback(audioCallback);
   1574 
   1575     return 0;
   1576 }
   1577 
   1578 // ----------------------------------------------------------------------------
   1579 //  StartRawInputFileRecording
   1580 // ----------------------------------------------------------------------------
   1581 
   1582 int32_t AudioDeviceModuleImpl::StartRawInputFileRecording(
   1583     const char pcmFileNameUTF8[kAdmMaxFileNameSize])
   1584 {
   1585     CHECK_INITIALIZED();
   1586 
   1587     if (NULL == pcmFileNameUTF8)
   1588     {
   1589         return -1;
   1590     }
   1591 
   1592     return (_audioDeviceBuffer.StartInputFileRecording(pcmFileNameUTF8));
   1593 }
   1594 
   1595 // ----------------------------------------------------------------------------
   1596 //  StopRawInputFileRecording
   1597 // ----------------------------------------------------------------------------
   1598 
   1599 int32_t AudioDeviceModuleImpl::StopRawInputFileRecording()
   1600 {
   1601     CHECK_INITIALIZED();
   1602 
   1603     return (_audioDeviceBuffer.StopInputFileRecording());
   1604 }
   1605 
   1606 // ----------------------------------------------------------------------------
   1607 //  StartRawOutputFileRecording
   1608 // ----------------------------------------------------------------------------
   1609 
   1610 int32_t AudioDeviceModuleImpl::StartRawOutputFileRecording(
   1611     const char pcmFileNameUTF8[kAdmMaxFileNameSize])
   1612 {
   1613     CHECK_INITIALIZED();
   1614 
   1615     if (NULL == pcmFileNameUTF8)
   1616     {
   1617         return -1;
   1618     }
   1619 
   1620     return (_audioDeviceBuffer.StartOutputFileRecording(pcmFileNameUTF8));
   1621 }
   1622 
   1623 // ----------------------------------------------------------------------------
   1624 //  StopRawOutputFileRecording
   1625 // ----------------------------------------------------------------------------
   1626 
   1627 int32_t AudioDeviceModuleImpl::StopRawOutputFileRecording()
   1628 {
   1629     CHECK_INITIALIZED();
   1630 
   1631     return (_audioDeviceBuffer.StopOutputFileRecording());
   1632 }
   1633 
   1634 // ----------------------------------------------------------------------------
   1635 //  SetPlayoutBuffer
   1636 // ----------------------------------------------------------------------------
   1637 
   1638 int32_t AudioDeviceModuleImpl::SetPlayoutBuffer(const BufferType type, uint16_t sizeMS)
   1639 {
   1640     CHECK_INITIALIZED();
   1641 
   1642     if (_ptrAudioDevice->PlayoutIsInitialized())
   1643     {
   1644         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "unable to modify the playout buffer while playing side is initialized");
   1645         return -1;
   1646     }
   1647 
   1648     int32_t ret(0);
   1649 
   1650     if (kFixedBufferSize == type)
   1651     {
   1652         if (sizeMS < kAdmMinPlayoutBufferSizeMs || sizeMS > kAdmMaxPlayoutBufferSizeMs)
   1653         {
   1654             WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "size parameter is out of range");
   1655             return -1;
   1656         }
   1657     }
   1658 
   1659     if ((ret = _ptrAudioDevice->SetPlayoutBuffer(type, sizeMS)) == -1)
   1660     {
   1661         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to set the playout buffer (error: %d)", LastError());
   1662     }
   1663 
   1664     return ret;
   1665 }
   1666 
   1667 // ----------------------------------------------------------------------------
   1668 //  PlayoutBuffer
   1669 // ----------------------------------------------------------------------------
   1670 
   1671 int32_t AudioDeviceModuleImpl::PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const
   1672 {
   1673     CHECK_INITIALIZED();
   1674 
   1675     BufferType bufType;
   1676     uint16_t size(0);
   1677 
   1678     if (_ptrAudioDevice->PlayoutBuffer(bufType, size) == -1)
   1679     {
   1680         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the buffer type and size");
   1681         return -1;
   1682     }
   1683 
   1684     *type = bufType;
   1685     *sizeMS = size;
   1686 
   1687     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: type=%u, sizeMS=%u", *type, *sizeMS);
   1688     return (0);
   1689 }
   1690 
   1691 // ----------------------------------------------------------------------------
   1692 //  PlayoutDelay
   1693 // ----------------------------------------------------------------------------
   1694 
   1695 int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const
   1696 {
   1697     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
   1698     CHECK_INITIALIZED();
   1699 
   1700     uint16_t delay(0);
   1701 
   1702     if (_ptrAudioDevice->PlayoutDelay(delay) == -1)
   1703     {
   1704         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the playout delay");
   1705         return -1;
   1706     }
   1707 
   1708     *delayMS = delay;
   1709 
   1710     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u", *delayMS);
   1711     return (0);
   1712 }
   1713 
   1714 // ----------------------------------------------------------------------------
   1715 //  RecordingDelay
   1716 // ----------------------------------------------------------------------------
   1717 
   1718 int32_t AudioDeviceModuleImpl::RecordingDelay(uint16_t* delayMS) const
   1719 {
   1720     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
   1721     CHECK_INITIALIZED();
   1722 
   1723     uint16_t delay(0);
   1724 
   1725     if (_ptrAudioDevice->RecordingDelay(delay) == -1)
   1726     {
   1727         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the recording delay");
   1728         return -1;
   1729     }
   1730 
   1731     *delayMS = delay;
   1732 
   1733     WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u", *delayMS);
   1734     return (0);
   1735 }
   1736 
   1737 // ----------------------------------------------------------------------------
   1738 //  CPULoad
   1739 // ----------------------------------------------------------------------------
   1740 
   1741 int32_t AudioDeviceModuleImpl::CPULoad(uint16_t* load) const
   1742 {
   1743     CHECK_INITIALIZED();
   1744 
   1745     uint16_t cpuLoad(0);
   1746 
   1747     if (_ptrAudioDevice->CPULoad(cpuLoad) == -1)
   1748     {
   1749         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the CPU load");
   1750         return -1;
   1751     }
   1752 
   1753     *load = cpuLoad;
   1754 
   1755     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: load=%u", *load);
   1756     return (0);
   1757 }
   1758 
   1759 // ----------------------------------------------------------------------------
   1760 //  SetRecordingSampleRate
   1761 // ----------------------------------------------------------------------------
   1762 
   1763 int32_t AudioDeviceModuleImpl::SetRecordingSampleRate(const uint32_t samplesPerSec)
   1764 {
   1765     CHECK_INITIALIZED();
   1766 
   1767     if (_ptrAudioDevice->SetRecordingSampleRate(samplesPerSec) != 0)
   1768     {
   1769         return -1;
   1770     }
   1771 
   1772     return (0);
   1773 }
   1774 
   1775 // ----------------------------------------------------------------------------
   1776 //  RecordingSampleRate
   1777 // ----------------------------------------------------------------------------
   1778 
   1779 int32_t AudioDeviceModuleImpl::RecordingSampleRate(uint32_t* samplesPerSec) const
   1780 {
   1781     CHECK_INITIALIZED();
   1782 
   1783     int32_t sampleRate = _audioDeviceBuffer.RecordingSampleRate();
   1784 
   1785     if (sampleRate == -1)
   1786     {
   1787         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the sample rate");
   1788         return -1;
   1789     }
   1790 
   1791     *samplesPerSec = sampleRate;
   1792 
   1793     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: samplesPerSec=%u", *samplesPerSec);
   1794     return (0);
   1795 }
   1796 
   1797 // ----------------------------------------------------------------------------
   1798 //  SetPlayoutSampleRate
   1799 // ----------------------------------------------------------------------------
   1800 
   1801 int32_t AudioDeviceModuleImpl::SetPlayoutSampleRate(const uint32_t samplesPerSec)
   1802 {
   1803     CHECK_INITIALIZED();
   1804 
   1805     if (_ptrAudioDevice->SetPlayoutSampleRate(samplesPerSec) != 0)
   1806     {
   1807         return -1;
   1808     }
   1809 
   1810     return (0);
   1811 }
   1812 
   1813 // ----------------------------------------------------------------------------
   1814 //  PlayoutSampleRate
   1815 // ----------------------------------------------------------------------------
   1816 
   1817 int32_t AudioDeviceModuleImpl::PlayoutSampleRate(uint32_t* samplesPerSec) const
   1818 {
   1819     CHECK_INITIALIZED();
   1820 
   1821     int32_t sampleRate = _audioDeviceBuffer.PlayoutSampleRate();
   1822 
   1823     if (sampleRate == -1)
   1824     {
   1825         WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the sample rate");
   1826         return -1;
   1827     }
   1828 
   1829     *samplesPerSec = sampleRate;
   1830 
   1831     WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: samplesPerSec=%u", *samplesPerSec);
   1832     return (0);
   1833 }
   1834 
   1835 // ----------------------------------------------------------------------------
   1836 //  ResetAudioDevice
   1837 // ----------------------------------------------------------------------------
   1838 
   1839 int32_t AudioDeviceModuleImpl::ResetAudioDevice()
   1840 {
   1841     CHECK_INITIALIZED();
   1842 
   1843 
   1844     if (_ptrAudioDevice->ResetAudioDevice() == -1)
   1845     {
   1846         return -1;
   1847     }
   1848 
   1849     return (0);
   1850 }
   1851 
   1852 // ----------------------------------------------------------------------------
   1853 //  SetLoudspeakerStatus
   1854 // ----------------------------------------------------------------------------
   1855 
   1856 int32_t AudioDeviceModuleImpl::SetLoudspeakerStatus(bool enable)
   1857 {
   1858     CHECK_INITIALIZED();
   1859 
   1860     if (_ptrAudioDevice->SetLoudspeakerStatus(enable) != 0)
   1861     {
   1862         return -1;
   1863     }
   1864 
   1865     return 0;
   1866 }
   1867 
   1868 // ----------------------------------------------------------------------------
   1869 //  GetLoudspeakerStatus
   1870 // ----------------------------------------------------------------------------
   1871 
   1872 int32_t AudioDeviceModuleImpl::GetLoudspeakerStatus(bool* enabled) const {
   1873   CHECK_INITIALIZED();
   1874   if (_ptrAudioDevice->GetLoudspeakerStatus(*enabled) != 0) {
   1875     return -1;
   1876   }
   1877   return 0;
   1878 }
   1879 
   1880 bool AudioDeviceModuleImpl::BuiltInAECIsEnabled() const {
   1881   CHECK_INITIALIZED_BOOL();
   1882   return _ptrAudioDevice->BuiltInAECIsEnabled();
   1883 }
   1884 
   1885 bool AudioDeviceModuleImpl::BuiltInAECIsAvailable() const {
   1886   CHECK_INITIALIZED_BOOL();
   1887   return _ptrAudioDevice->BuiltInAECIsAvailable();
   1888 }
   1889 
   1890 int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) {
   1891   CHECK_INITIALIZED();
   1892   return _ptrAudioDevice->EnableBuiltInAEC(enable);
   1893 }
   1894 
   1895 bool AudioDeviceModuleImpl::BuiltInAGCIsAvailable() const {
   1896   CHECK_INITIALIZED_BOOL();
   1897   return _ptrAudioDevice->BuiltInAGCIsAvailable();
   1898 }
   1899 
   1900 int32_t AudioDeviceModuleImpl::EnableBuiltInAGC(bool enable) {
   1901   CHECK_INITIALIZED();
   1902   return _ptrAudioDevice->EnableBuiltInAGC(enable);
   1903 }
   1904 
   1905 bool AudioDeviceModuleImpl::BuiltInNSIsAvailable() const {
   1906   CHECK_INITIALIZED_BOOL();
   1907   return _ptrAudioDevice->BuiltInNSIsAvailable();
   1908 }
   1909 
   1910 int32_t AudioDeviceModuleImpl::EnableBuiltInNS(bool enable) {
   1911   CHECK_INITIALIZED();
   1912   return _ptrAudioDevice->EnableBuiltInNS(enable);
   1913 }
   1914 
   1915 int AudioDeviceModuleImpl::GetPlayoutAudioParameters(
   1916     AudioParameters* params) const {
   1917   return _ptrAudioDevice->GetPlayoutAudioParameters(params);
   1918 }
   1919 
   1920 int AudioDeviceModuleImpl::GetRecordAudioParameters(
   1921     AudioParameters* params) const {
   1922   return _ptrAudioDevice->GetRecordAudioParameters(params);
   1923 }
   1924 
   1925 // ============================================================================
   1926 //                                 Private Methods
   1927 // ============================================================================
   1928 
   1929 // ----------------------------------------------------------------------------
   1930 //  Platform
   1931 // ----------------------------------------------------------------------------
   1932 
   1933 AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const
   1934 {
   1935     return _platformType;
   1936 }
   1937 
   1938 // ----------------------------------------------------------------------------
   1939 //  PlatformAudioLayer
   1940 // ----------------------------------------------------------------------------
   1941 
   1942 AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer() const
   1943 {
   1944     return _platformAudioLayer;
   1945 }
   1946 
   1947 }  // namespace webrtc
   1948