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 #ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
     12 #define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
     13 
     14 #if defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
     15 
     16 #include "webrtc/base/checks.h"
     17 #include "webrtc/base/scoped_ptr.h"
     18 #include "webrtc/modules/audio_device/audio_device_buffer.h"
     19 #include "webrtc/modules/audio_device/include/audio_device.h"
     20 
     21 namespace webrtc {
     22 
     23 class AudioDeviceGeneric;
     24 class AudioManager;
     25 class CriticalSectionWrapper;
     26 
     27 class AudioDeviceModuleImpl : public AudioDeviceModule {
     28  public:
     29   enum PlatformType {
     30     kPlatformNotSupported = 0,
     31     kPlatformWin32 = 1,
     32     kPlatformWinCe = 2,
     33     kPlatformLinux = 3,
     34     kPlatformMac = 4,
     35     kPlatformAndroid = 5,
     36     kPlatformIOS = 6
     37   };
     38 
     39   int32_t CheckPlatform();
     40   int32_t CreatePlatformSpecificObjects();
     41   int32_t AttachAudioBuffer();
     42 
     43   AudioDeviceModuleImpl(const int32_t id, const AudioLayer audioLayer);
     44   virtual ~AudioDeviceModuleImpl();
     45 
     46   int64_t TimeUntilNextProcess() override;
     47   int32_t Process() override;
     48 
     49   // Factory methods (resource allocation/deallocation)
     50   static AudioDeviceModule* Create(
     51       const int32_t id,
     52       const AudioLayer audioLayer = kPlatformDefaultAudio);
     53 
     54   // Retrieve the currently utilized audio layer
     55   int32_t ActiveAudioLayer(AudioLayer* audioLayer) const override;
     56 
     57   // Error handling
     58   ErrorCode LastError() const override;
     59   int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) override;
     60 
     61   // Full-duplex transportation of PCM audio
     62   int32_t RegisterAudioCallback(AudioTransport* audioCallback) override;
     63 
     64   // Main initializaton and termination
     65   int32_t Init() override;
     66   int32_t Terminate() override;
     67   bool Initialized() const override;
     68 
     69   // Device enumeration
     70   int16_t PlayoutDevices() override;
     71   int16_t RecordingDevices() override;
     72   int32_t PlayoutDeviceName(uint16_t index,
     73                             char name[kAdmMaxDeviceNameSize],
     74                             char guid[kAdmMaxGuidSize]) override;
     75   int32_t RecordingDeviceName(uint16_t index,
     76                               char name[kAdmMaxDeviceNameSize],
     77                               char guid[kAdmMaxGuidSize]) override;
     78 
     79   // Device selection
     80   int32_t SetPlayoutDevice(uint16_t index) override;
     81   int32_t SetPlayoutDevice(WindowsDeviceType device) override;
     82   int32_t SetRecordingDevice(uint16_t index) override;
     83   int32_t SetRecordingDevice(WindowsDeviceType device) override;
     84 
     85   // Audio transport initialization
     86   int32_t PlayoutIsAvailable(bool* available) override;
     87   int32_t InitPlayout() override;
     88   bool PlayoutIsInitialized() const override;
     89   int32_t RecordingIsAvailable(bool* available) override;
     90   int32_t InitRecording() override;
     91   bool RecordingIsInitialized() const override;
     92 
     93   // Audio transport control
     94   int32_t StartPlayout() override;
     95   int32_t StopPlayout() override;
     96   bool Playing() const override;
     97   int32_t StartRecording() override;
     98   int32_t StopRecording() override;
     99   bool Recording() const override;
    100 
    101   // Microphone Automatic Gain Control (AGC)
    102   int32_t SetAGC(bool enable) override;
    103   bool AGC() const override;
    104 
    105   // Volume control based on the Windows Wave API (Windows only)
    106   int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight) override;
    107   int32_t WaveOutVolume(uint16_t* volumeLeft,
    108                         uint16_t* volumeRight) const override;
    109 
    110   // Audio mixer initialization
    111   int32_t InitSpeaker() override;
    112   bool SpeakerIsInitialized() const override;
    113   int32_t InitMicrophone() override;
    114   bool MicrophoneIsInitialized() const override;
    115 
    116   // Speaker volume controls
    117   int32_t SpeakerVolumeIsAvailable(bool* available) override;
    118   int32_t SetSpeakerVolume(uint32_t volume) override;
    119   int32_t SpeakerVolume(uint32_t* volume) const override;
    120   int32_t MaxSpeakerVolume(uint32_t* maxVolume) const override;
    121   int32_t MinSpeakerVolume(uint32_t* minVolume) const override;
    122   int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const override;
    123 
    124   // Microphone volume controls
    125   int32_t MicrophoneVolumeIsAvailable(bool* available) override;
    126   int32_t SetMicrophoneVolume(uint32_t volume) override;
    127   int32_t MicrophoneVolume(uint32_t* volume) const override;
    128   int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const override;
    129   int32_t MinMicrophoneVolume(uint32_t* minVolume) const override;
    130   int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const override;
    131 
    132   // Speaker mute control
    133   int32_t SpeakerMuteIsAvailable(bool* available) override;
    134   int32_t SetSpeakerMute(bool enable) override;
    135   int32_t SpeakerMute(bool* enabled) const override;
    136 
    137   // Microphone mute control
    138   int32_t MicrophoneMuteIsAvailable(bool* available) override;
    139   int32_t SetMicrophoneMute(bool enable) override;
    140   int32_t MicrophoneMute(bool* enabled) const override;
    141 
    142   // Microphone boost control
    143   int32_t MicrophoneBoostIsAvailable(bool* available) override;
    144   int32_t SetMicrophoneBoost(bool enable) override;
    145   int32_t MicrophoneBoost(bool* enabled) const override;
    146 
    147   // Stereo support
    148   int32_t StereoPlayoutIsAvailable(bool* available) const override;
    149   int32_t SetStereoPlayout(bool enable) override;
    150   int32_t StereoPlayout(bool* enabled) const override;
    151   int32_t StereoRecordingIsAvailable(bool* available) const override;
    152   int32_t SetStereoRecording(bool enable) override;
    153   int32_t StereoRecording(bool* enabled) const override;
    154   int32_t SetRecordingChannel(const ChannelType channel) override;
    155   int32_t RecordingChannel(ChannelType* channel) const override;
    156 
    157   // Delay information and control
    158   int32_t SetPlayoutBuffer(const BufferType type, uint16_t sizeMS = 0) override;
    159   int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const override;
    160   int32_t PlayoutDelay(uint16_t* delayMS) const override;
    161   int32_t RecordingDelay(uint16_t* delayMS) const override;
    162 
    163   // CPU load
    164   int32_t CPULoad(uint16_t* load) const override;
    165 
    166   // Recording of raw PCM data
    167   int32_t StartRawOutputFileRecording(
    168       const char pcmFileNameUTF8[kAdmMaxFileNameSize]) override;
    169   int32_t StopRawOutputFileRecording() override;
    170   int32_t StartRawInputFileRecording(
    171       const char pcmFileNameUTF8[kAdmMaxFileNameSize]) override;
    172   int32_t StopRawInputFileRecording() override;
    173 
    174   // Native sample rate controls (samples/sec)
    175   int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) override;
    176   int32_t RecordingSampleRate(uint32_t* samplesPerSec) const override;
    177   int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) override;
    178   int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const override;
    179 
    180   // Mobile device specific functions
    181   int32_t ResetAudioDevice() override;
    182   int32_t SetLoudspeakerStatus(bool enable) override;
    183   int32_t GetLoudspeakerStatus(bool* enabled) const override;
    184 
    185   bool BuiltInAECIsEnabled() const override;
    186   bool BuiltInAECIsAvailable() const override;
    187   int32_t EnableBuiltInAEC(bool enable) override;
    188   bool BuiltInAGCIsAvailable() const override;
    189   int32_t EnableBuiltInAGC(bool enable) override;
    190   bool BuiltInNSIsAvailable() const override;
    191   int32_t EnableBuiltInNS(bool enable) override;
    192 
    193   int GetPlayoutAudioParameters(AudioParameters* params) const override;
    194   int GetRecordAudioParameters(AudioParameters* params) const override;
    195 
    196   int32_t Id() { return _id; }
    197 #if defined(WEBRTC_ANDROID)
    198   // Only use this acccessor for test purposes on Android.
    199   AudioManager* GetAndroidAudioManagerForTest() {
    200     return _audioManagerAndroid.get();
    201   }
    202 #endif
    203   AudioDeviceBuffer* GetAudioDeviceBuffer() { return &_audioDeviceBuffer; }
    204 
    205  private:
    206   PlatformType Platform() const;
    207   AudioLayer PlatformAudioLayer() const;
    208 
    209   CriticalSectionWrapper& _critSect;
    210   CriticalSectionWrapper& _critSectEventCb;
    211   CriticalSectionWrapper& _critSectAudioCb;
    212 
    213   AudioDeviceObserver* _ptrCbAudioDeviceObserver;
    214 
    215   AudioDeviceGeneric* _ptrAudioDevice;
    216 
    217   AudioDeviceBuffer _audioDeviceBuffer;
    218 #if defined(WEBRTC_ANDROID)
    219   rtc::scoped_ptr<AudioManager> _audioManagerAndroid;
    220 #endif
    221   int32_t _id;
    222   AudioLayer _platformAudioLayer;
    223   int64_t _lastProcessTime;
    224   PlatformType _platformType;
    225   bool _initialized;
    226   mutable ErrorCode _lastError;
    227 };
    228 
    229 }  // namespace webrtc
    230 
    231 #endif  // defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
    232 
    233 #endif  // WEBRTC_MODULES_INTERFACE_AUDIO_DEVICE_IMPL_H_
    234