• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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 AudioDeviceIPhone : public AudioDeviceGeneric {
36 public:
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 
150 public:
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 
160 public:
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 
170 private:
Lock()171     void Lock() {
172         _critSect.Enter();
173     }
174 
UnLock()175     void UnLock() {
176         _critSect.Leave();
177     }
178 
Id()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 
215 private:
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 
227 private:
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