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 MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_ 12 #define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_ 13 14 #include "api/scoped_refptr.h" 15 #include "api/task_queue/task_queue_factory.h" 16 #include "modules/audio_device/include/audio_device_defines.h" 17 #include "rtc_base/ref_count.h" 18 19 namespace webrtc { 20 21 class AudioDeviceModuleForTest; 22 23 class AudioDeviceModule : public rtc::RefCountInterface { 24 public: 25 enum AudioLayer { 26 kPlatformDefaultAudio = 0, 27 kWindowsCoreAudio, 28 kWindowsCoreAudio2, 29 kLinuxAlsaAudio, 30 kLinuxPulseAudio, 31 kAndroidJavaAudio, 32 kAndroidOpenSLESAudio, 33 kAndroidJavaInputAndOpenSLESOutputAudio, 34 kAndroidAAudioAudio, 35 kAndroidJavaInputAndAAudioOutputAudio, 36 kDummyAudio, 37 }; 38 39 enum WindowsDeviceType { 40 kDefaultCommunicationDevice = -1, 41 kDefaultDevice = -2 42 }; 43 44 public: 45 // Creates a default ADM for usage in production code. 46 static rtc::scoped_refptr<AudioDeviceModule> Create( 47 AudioLayer audio_layer, 48 TaskQueueFactory* task_queue_factory); 49 // Creates an ADM with support for extra test methods. Don't use this factory 50 // in production code. 51 static rtc::scoped_refptr<AudioDeviceModuleForTest> CreateForTest( 52 AudioLayer audio_layer, 53 TaskQueueFactory* task_queue_factory); 54 55 // Retrieve the currently utilized audio layer 56 virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0; 57 58 // Full-duplex transportation of PCM audio 59 virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0; 60 61 // Main initialization and termination 62 virtual int32_t Init() = 0; 63 virtual int32_t Terminate() = 0; 64 virtual bool Initialized() const = 0; 65 66 // Device enumeration 67 virtual int16_t PlayoutDevices() = 0; 68 virtual int16_t RecordingDevices() = 0; 69 virtual int32_t PlayoutDeviceName(uint16_t index, 70 char name[kAdmMaxDeviceNameSize], 71 char guid[kAdmMaxGuidSize]) = 0; 72 virtual int32_t RecordingDeviceName(uint16_t index, 73 char name[kAdmMaxDeviceNameSize], 74 char guid[kAdmMaxGuidSize]) = 0; 75 76 // Device selection 77 virtual int32_t SetPlayoutDevice(uint16_t index) = 0; 78 virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0; 79 virtual int32_t SetRecordingDevice(uint16_t index) = 0; 80 virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0; 81 82 // Audio transport initialization 83 virtual int32_t PlayoutIsAvailable(bool* available) = 0; 84 virtual int32_t InitPlayout() = 0; 85 virtual bool PlayoutIsInitialized() const = 0; 86 virtual int32_t RecordingIsAvailable(bool* available) = 0; 87 virtual int32_t InitRecording() = 0; 88 virtual bool RecordingIsInitialized() const = 0; 89 90 // Audio transport control 91 virtual int32_t StartPlayout() = 0; 92 virtual int32_t StopPlayout() = 0; 93 virtual bool Playing() const = 0; 94 virtual int32_t StartRecording() = 0; 95 virtual int32_t StopRecording() = 0; 96 virtual bool Recording() const = 0; 97 98 // Audio mixer initialization 99 virtual int32_t InitSpeaker() = 0; 100 virtual bool SpeakerIsInitialized() const = 0; 101 virtual int32_t InitMicrophone() = 0; 102 virtual bool MicrophoneIsInitialized() const = 0; 103 104 // Speaker volume controls 105 virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0; 106 virtual int32_t SetSpeakerVolume(uint32_t volume) = 0; 107 virtual int32_t SpeakerVolume(uint32_t* volume) const = 0; 108 virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0; 109 virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0; 110 111 // Microphone volume controls 112 virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0; 113 virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0; 114 virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0; 115 virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0; 116 virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0; 117 118 // Speaker mute control 119 virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0; 120 virtual int32_t SetSpeakerMute(bool enable) = 0; 121 virtual int32_t SpeakerMute(bool* enabled) const = 0; 122 123 // Microphone mute control 124 virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0; 125 virtual int32_t SetMicrophoneMute(bool enable) = 0; 126 virtual int32_t MicrophoneMute(bool* enabled) const = 0; 127 128 // Stereo support 129 virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0; 130 virtual int32_t SetStereoPlayout(bool enable) = 0; 131 virtual int32_t StereoPlayout(bool* enabled) const = 0; 132 virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0; 133 virtual int32_t SetStereoRecording(bool enable) = 0; 134 virtual int32_t StereoRecording(bool* enabled) const = 0; 135 136 // Playout delay 137 virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0; 138 139 // Only supported on Android. 140 virtual bool BuiltInAECIsAvailable() const = 0; 141 virtual bool BuiltInAGCIsAvailable() const = 0; 142 virtual bool BuiltInNSIsAvailable() const = 0; 143 144 // Enables the built-in audio effects. Only supported on Android. 145 virtual int32_t EnableBuiltInAEC(bool enable) = 0; 146 virtual int32_t EnableBuiltInAGC(bool enable) = 0; 147 virtual int32_t EnableBuiltInNS(bool enable) = 0; 148 149 // Play underrun count. Only supported on Android. 150 // TODO(alexnarest): Make it abstract after upstream projects support it. GetPlayoutUnderrunCount()151 virtual int32_t GetPlayoutUnderrunCount() const { return -1; } 152 153 // Only supported on iOS. 154 #if defined(WEBRTC_IOS) 155 virtual int GetPlayoutAudioParameters(AudioParameters* params) const = 0; 156 virtual int GetRecordAudioParameters(AudioParameters* params) const = 0; 157 #endif // WEBRTC_IOS 158 159 protected: ~AudioDeviceModule()160 ~AudioDeviceModule() override {} 161 }; 162 163 // Extends the default ADM interface with some extra test methods. 164 // Intended for usage in tests only and requires a unique factory method. 165 class AudioDeviceModuleForTest : public AudioDeviceModule { 166 public: 167 // Triggers internal restart sequences of audio streaming. Can be used by 168 // tests to emulate events corresponding to e.g. removal of an active audio 169 // device or other actions which causes the stream to be disconnected. 170 virtual int RestartPlayoutInternally() = 0; 171 virtual int RestartRecordingInternally() = 0; 172 173 virtual int SetPlayoutSampleRate(uint32_t sample_rate) = 0; 174 virtual int SetRecordingSampleRate(uint32_t sample_rate) = 0; 175 }; 176 177 } // namespace webrtc 178 179 #endif // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_ 180