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