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