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_IOS_H 12#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IOS_H 13 14#include <AudioUnit/AudioUnit.h> 15 16#include "webrtc/modules/audio_device/audio_device_generic.h" 17#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 18 19namespace webrtc { 20class ThreadWrapper; 21 22const uint32_t N_REC_SAMPLES_PER_SEC = 44000; 23const uint32_t N_PLAY_SAMPLES_PER_SEC = 44000; 24 25const uint32_t N_REC_CHANNELS = 1; // default is mono recording 26const uint32_t N_PLAY_CHANNELS = 1; // default is mono playout 27const uint32_t N_DEVICE_CHANNELS = 8; 28 29const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = (N_REC_SAMPLES_PER_SEC / 100); 30const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES = (N_PLAY_SAMPLES_PER_SEC / 100); 31 32// Number of 10 ms recording blocks in recording buffer 33const uint16_t N_REC_BUFFERS = 20; 34 35class AudioDeviceIOS : public AudioDeviceGeneric { 36 public: 37 AudioDeviceIOS(const int32_t id); 38 ~AudioDeviceIOS(); 39 40 // Retrieve the currently utilized audio layer 41 virtual int32_t ActiveAudioLayer( 42 AudioDeviceModule::AudioLayer& audioLayer) const; 43 44 // Main initializaton and termination 45 virtual int32_t Init(); 46 virtual int32_t Terminate(); 47 virtual bool Initialized() const; 48 49 // Device enumeration 50 virtual int16_t PlayoutDevices(); 51 virtual int16_t RecordingDevices(); 52 virtual int32_t PlayoutDeviceName(uint16_t index, 53 char name[kAdmMaxDeviceNameSize], 54 char guid[kAdmMaxGuidSize]); 55 virtual int32_t RecordingDeviceName(uint16_t index, 56 char name[kAdmMaxDeviceNameSize], 57 char guid[kAdmMaxGuidSize]); 58 59 // Device selection 60 virtual int32_t SetPlayoutDevice(uint16_t index); 61 virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device); 62 virtual int32_t SetRecordingDevice(uint16_t index); 63 virtual int32_t SetRecordingDevice( 64 AudioDeviceModule::WindowsDeviceType device); 65 66 // Audio transport initialization 67 virtual int32_t PlayoutIsAvailable(bool& available); 68 virtual int32_t InitPlayout(); 69 virtual bool PlayoutIsInitialized() const; 70 virtual int32_t RecordingIsAvailable(bool& available); 71 virtual int32_t InitRecording(); 72 virtual bool RecordingIsInitialized() const; 73 74 // Audio transport control 75 virtual int32_t StartPlayout(); 76 virtual int32_t StopPlayout(); 77 virtual bool Playing() const; 78 virtual int32_t StartRecording(); 79 virtual int32_t StopRecording(); 80 virtual bool Recording() const; 81 82 // Microphone Automatic Gain Control (AGC) 83 virtual int32_t SetAGC(bool enable); 84 virtual bool AGC() const; 85 86 // Volume control based on the Windows Wave API (Windows only) 87 virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); 88 virtual int32_t WaveOutVolume(uint16_t& volumeLeft, 89 uint16_t& volumeRight) const; 90 91 // Audio mixer initialization 92 virtual int32_t InitSpeaker(); 93 virtual bool SpeakerIsInitialized() const; 94 virtual int32_t InitMicrophone(); 95 virtual bool MicrophoneIsInitialized() const; 96 97 // Speaker volume controls 98 virtual int32_t SpeakerVolumeIsAvailable(bool& available); 99 virtual int32_t SetSpeakerVolume(uint32_t volume); 100 virtual int32_t SpeakerVolume(uint32_t& volume) const; 101 virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; 102 virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; 103 virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; 104 105 // Microphone volume controls 106 virtual int32_t MicrophoneVolumeIsAvailable(bool& available); 107 virtual int32_t SetMicrophoneVolume(uint32_t volume); 108 virtual int32_t MicrophoneVolume(uint32_t& volume) const; 109 virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; 110 virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; 111 virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; 112 113 // Microphone mute control 114 virtual int32_t MicrophoneMuteIsAvailable(bool& available); 115 virtual int32_t SetMicrophoneMute(bool enable); 116 virtual int32_t MicrophoneMute(bool& enabled) const; 117 118 // Speaker mute control 119 virtual int32_t SpeakerMuteIsAvailable(bool& available); 120 virtual int32_t SetSpeakerMute(bool enable); 121 virtual int32_t SpeakerMute(bool& enabled) const; 122 123 // Microphone boost control 124 virtual int32_t MicrophoneBoostIsAvailable(bool& available); 125 virtual int32_t SetMicrophoneBoost(bool enable); 126 virtual int32_t MicrophoneBoost(bool& enabled) const; 127 128 // Stereo support 129 virtual int32_t StereoPlayoutIsAvailable(bool& available); 130 virtual int32_t SetStereoPlayout(bool enable); 131 virtual int32_t StereoPlayout(bool& enabled) const; 132 virtual int32_t StereoRecordingIsAvailable(bool& available); 133 virtual int32_t SetStereoRecording(bool enable); 134 virtual int32_t StereoRecording(bool& enabled) const; 135 136 // Delay information and control 137 virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, 138 uint16_t sizeMS); 139 virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, 140 uint16_t& sizeMS) const; 141 virtual int32_t PlayoutDelay(uint16_t& delayMS) const; 142 virtual int32_t RecordingDelay(uint16_t& delayMS) const; 143 144 // CPU load 145 virtual int32_t CPULoad(uint16_t& load) const; 146 147 public: 148 virtual bool PlayoutWarning() const; 149 virtual bool PlayoutError() const; 150 virtual bool RecordingWarning() const; 151 virtual bool RecordingError() const; 152 virtual void ClearPlayoutWarning(); 153 virtual void ClearPlayoutError(); 154 virtual void ClearRecordingWarning(); 155 virtual void ClearRecordingError(); 156 157 public: 158 virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); 159 160 // Reset Audio Device (for mobile devices only) 161 virtual int32_t ResetAudioDevice(); 162 163 // enable or disable loud speaker (for iphone only) 164 virtual int32_t SetLoudspeakerStatus(bool enable); 165 virtual int32_t GetLoudspeakerStatus(bool& enabled) const; 166 167 private: 168 void Lock() { 169 _critSect.Enter(); 170 } 171 172 void UnLock() { 173 _critSect.Leave(); 174 } 175 176 int32_t Id() { 177 return _id; 178 } 179 180 // Init and shutdown 181 int32_t InitPlayOrRecord(); 182 int32_t ShutdownPlayOrRecord(); 183 184 void UpdateRecordingDelay(); 185 void UpdatePlayoutDelay(); 186 187 static OSStatus RecordProcess(void *inRefCon, 188 AudioUnitRenderActionFlags *ioActionFlags, 189 const AudioTimeStamp *timeStamp, 190 UInt32 inBusNumber, 191 UInt32 inNumberFrames, 192 AudioBufferList *ioData); 193 194 static OSStatus PlayoutProcess(void *inRefCon, 195 AudioUnitRenderActionFlags *ioActionFlags, 196 const AudioTimeStamp *timeStamp, 197 UInt32 inBusNumber, 198 UInt32 inNumberFrames, 199 AudioBufferList *ioData); 200 201 OSStatus RecordProcessImpl(AudioUnitRenderActionFlags *ioActionFlags, 202 const AudioTimeStamp *timeStamp, 203 uint32_t inBusNumber, 204 uint32_t inNumberFrames); 205 206 OSStatus PlayoutProcessImpl(uint32_t inNumberFrames, 207 AudioBufferList *ioData); 208 209 static bool RunCapture(void* ptrThis); 210 bool CaptureWorkerThread(); 211 212 private: 213 AudioDeviceBuffer* _ptrAudioBuffer; 214 215 CriticalSectionWrapper& _critSect; 216 217 ThreadWrapper* _captureWorkerThread; 218 uint32_t _captureWorkerThreadId; 219 220 int32_t _id; 221 222 AudioUnit _auVoiceProcessing; 223 void* _audioInterruptionObserver; 224 225 private: 226 bool _initialized; 227 bool _isShutDown; 228 bool _recording; 229 bool _playing; 230 bool _recIsInitialized; 231 bool _playIsInitialized; 232 233 bool _recordingDeviceIsSpecified; 234 bool _playoutDeviceIsSpecified; 235 bool _micIsInitialized; 236 bool _speakerIsInitialized; 237 238 bool _AGC; 239 240 // The sampling rate to use with Audio Device Buffer 241 uint32_t _adbSampFreq; 242 243 // Delay calculation 244 uint32_t _recordingDelay; 245 uint32_t _playoutDelay; 246 uint32_t _playoutDelayMeasurementCounter; 247 uint32_t _recordingDelayHWAndOS; 248 uint32_t _recordingDelayMeasurementCounter; 249 250 // Errors and warnings count 251 uint16_t _playWarning; 252 uint16_t _playError; 253 uint16_t _recWarning; 254 uint16_t _recError; 255 256 // Playout buffer, needed for 44.0 / 44.1 kHz mismatch 257 int16_t _playoutBuffer[ENGINE_PLAY_BUF_SIZE_IN_SAMPLES]; 258 uint32_t _playoutBufferUsed; // How much is filled 259 260 // Recording buffers 261 int16_t _recordingBuffer[N_REC_BUFFERS][ENGINE_REC_BUF_SIZE_IN_SAMPLES]; 262 uint32_t _recordingLength[N_REC_BUFFERS]; 263 uint32_t _recordingSeqNumber[N_REC_BUFFERS]; 264 uint32_t _recordingCurrentSeq; 265 266 // Current total size all data in buffers, used for delay estimate 267 uint32_t _recordingBufferTotalSize; 268}; 269 270} // namespace webrtc 271 272#endif // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IOS_H 273