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