2a48845e6e867997508b3b8974cd16b206f14b0f
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_device / ios / audio_device_ios.h
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
19 namespace webrtc {
20 class ThreadWrapper;
21
22 const uint32_t N_REC_SAMPLES_PER_SEC = 44000;
23 const uint32_t N_PLAY_SAMPLES_PER_SEC = 44000;
24
25 const uint32_t N_REC_CHANNELS = 1;  // default is mono recording
26 const uint32_t N_PLAY_CHANNELS = 1;  // default is mono playout
27 const uint32_t N_DEVICE_CHANNELS = 8;
28
29 const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = (N_REC_SAMPLES_PER_SEC / 100);
30 const 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
33 const uint16_t N_REC_BUFFERS = 20;
34
35 class 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