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