OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H | 11 #ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H |
12 #define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H | 12 #define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H |
13 | 13 |
14 #include "webrtc/base/scoped_ptr.h" | 14 #include "webrtc/base/scoped_ptr.h" |
15 #include "webrtc/base/thread_annotations.h" | 15 #include "webrtc/base/thread_annotations.h" |
16 #include "webrtc/modules/audio_device/audio_device_generic.h" | 16 #include "webrtc/modules/audio_device/audio_device_generic.h" |
17 #include "webrtc/modules/audio_device/mac/audio_mixer_manager_mac.h" | 17 #include "webrtc/modules/audio_device/mac/audio_mixer_manager_mac.h" |
18 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 18 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
19 | 19 |
20 #include <AudioToolbox/AudioConverter.h> | 20 #include <AudioToolbox/AudioConverter.h> |
21 #include <CoreAudio/CoreAudio.h> | 21 #include <CoreAudio/CoreAudio.h> |
22 #include <mach/semaphore.h> | 22 #include <mach/semaphore.h> |
23 | 23 |
24 struct PaUtilRingBuffer; | 24 struct PaUtilRingBuffer; |
25 | 25 |
26 namespace rtc { | 26 namespace rtc { |
27 class PlatformThread; | 27 class PlatformThread; |
28 } // namespace rtc | 28 } // namespace rtc |
29 | 29 |
30 namespace webrtc | 30 namespace webrtc { |
31 { | |
32 class EventWrapper; | 31 class EventWrapper; |
33 | 32 |
34 const uint32_t N_REC_SAMPLES_PER_SEC = 48000; | 33 const uint32_t N_REC_SAMPLES_PER_SEC = 48000; |
35 const uint32_t N_PLAY_SAMPLES_PER_SEC = 48000; | 34 const uint32_t N_PLAY_SAMPLES_PER_SEC = 48000; |
36 | 35 |
37 const uint32_t N_REC_CHANNELS = 1; // default is mono recording | 36 const uint32_t N_REC_CHANNELS = 1; // default is mono recording |
38 const uint32_t N_PLAY_CHANNELS = 2; // default is stereo playout | 37 const uint32_t N_PLAY_CHANNELS = 2; // default is stereo playout |
39 const uint32_t N_DEVICE_CHANNELS = 64; | 38 const uint32_t N_DEVICE_CHANNELS = 64; |
40 | 39 |
41 const int kBufferSizeMs = 10; | 40 const int kBufferSizeMs = 10; |
42 | 41 |
43 const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = | 42 const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = |
44 N_REC_SAMPLES_PER_SEC * kBufferSizeMs / 1000; | 43 N_REC_SAMPLES_PER_SEC * kBufferSizeMs / 1000; |
45 const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES = | 44 const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES = |
46 N_PLAY_SAMPLES_PER_SEC * kBufferSizeMs / 1000; | 45 N_PLAY_SAMPLES_PER_SEC * kBufferSizeMs / 1000; |
47 | 46 |
48 const int N_BLOCKS_IO = 2; | 47 const int N_BLOCKS_IO = 2; |
49 const int N_BUFFERS_IN = 2; // Must be at least N_BLOCKS_IO. | 48 const int N_BUFFERS_IN = 2; // Must be at least N_BLOCKS_IO. |
50 const int N_BUFFERS_OUT = 3; // Must be at least N_BLOCKS_IO. | 49 const int N_BUFFERS_OUT = 3; // Must be at least N_BLOCKS_IO. |
51 | 50 |
52 const uint32_t TIMER_PERIOD_MS = 2 * 10 * N_BLOCKS_IO * 1000000; | 51 const uint32_t TIMER_PERIOD_MS = 2 * 10 * N_BLOCKS_IO * 1000000; |
53 | 52 |
54 const uint32_t REC_BUF_SIZE_IN_SAMPLES = | 53 const uint32_t REC_BUF_SIZE_IN_SAMPLES = |
55 ENGINE_REC_BUF_SIZE_IN_SAMPLES * N_DEVICE_CHANNELS * N_BUFFERS_IN; | 54 ENGINE_REC_BUF_SIZE_IN_SAMPLES * N_DEVICE_CHANNELS * N_BUFFERS_IN; |
56 const uint32_t PLAY_BUF_SIZE_IN_SAMPLES = | 55 const uint32_t PLAY_BUF_SIZE_IN_SAMPLES = |
57 ENGINE_PLAY_BUF_SIZE_IN_SAMPLES * N_PLAY_CHANNELS * N_BUFFERS_OUT; | 56 ENGINE_PLAY_BUF_SIZE_IN_SAMPLES * N_PLAY_CHANNELS * N_BUFFERS_OUT; |
58 | 57 |
59 const int kGetMicVolumeIntervalMs = 1000; | 58 const int kGetMicVolumeIntervalMs = 1000; |
60 | 59 |
61 class AudioDeviceMac: public AudioDeviceGeneric | 60 class AudioDeviceMac : public AudioDeviceGeneric { |
62 { | 61 public: |
63 public: | 62 AudioDeviceMac(const int32_t id); |
64 AudioDeviceMac(const int32_t id); | 63 ~AudioDeviceMac(); |
65 ~AudioDeviceMac(); | 64 |
66 | 65 // Retrieve the currently utilized audio layer |
67 // Retrieve the currently utilized audio layer | 66 virtual int32_t ActiveAudioLayer( |
68 virtual int32_t | 67 AudioDeviceModule::AudioLayer& audioLayer) const; |
69 ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const; | 68 |
70 | 69 // Main initializaton and termination |
71 // Main initializaton and termination | 70 virtual int32_t Init(); |
72 virtual int32_t Init(); | 71 virtual int32_t Terminate(); |
73 virtual int32_t Terminate(); | 72 virtual bool Initialized() const; |
74 virtual bool Initialized() const; | 73 |
75 | 74 // Device enumeration |
76 // Device enumeration | 75 virtual int16_t PlayoutDevices(); |
77 virtual int16_t PlayoutDevices(); | 76 virtual int16_t RecordingDevices(); |
78 virtual int16_t RecordingDevices(); | 77 virtual int32_t PlayoutDeviceName(uint16_t index, |
79 virtual int32_t PlayoutDeviceName( | 78 char name[kAdmMaxDeviceNameSize], |
80 uint16_t index, | 79 char guid[kAdmMaxGuidSize]); |
81 char name[kAdmMaxDeviceNameSize], | 80 virtual int32_t RecordingDeviceName(uint16_t index, |
82 char guid[kAdmMaxGuidSize]); | 81 char name[kAdmMaxDeviceNameSize], |
83 virtual int32_t RecordingDeviceName( | 82 char guid[kAdmMaxGuidSize]); |
84 uint16_t index, | 83 |
85 char name[kAdmMaxDeviceNameSize], | 84 // Device selection |
86 char guid[kAdmMaxGuidSize]); | 85 virtual int32_t SetPlayoutDevice(uint16_t index); |
87 | 86 virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device); |
88 // Device selection | 87 virtual int32_t SetRecordingDevice(uint16_t index); |
89 virtual int32_t SetPlayoutDevice(uint16_t index); | 88 virtual int32_t SetRecordingDevice( |
90 virtual int32_t SetPlayoutDevice( | 89 AudioDeviceModule::WindowsDeviceType device); |
91 AudioDeviceModule::WindowsDeviceType device); | 90 |
92 virtual int32_t SetRecordingDevice(uint16_t index); | 91 // Audio transport initialization |
93 virtual int32_t SetRecordingDevice( | 92 virtual int32_t PlayoutIsAvailable(bool& available); |
94 AudioDeviceModule::WindowsDeviceType device); | 93 virtual int32_t InitPlayout(); |
95 | 94 virtual bool PlayoutIsInitialized() const; |
96 // Audio transport initialization | 95 virtual int32_t RecordingIsAvailable(bool& available); |
97 virtual int32_t PlayoutIsAvailable(bool& available); | 96 virtual int32_t InitRecording(); |
98 virtual int32_t InitPlayout(); | 97 virtual bool RecordingIsInitialized() const; |
99 virtual bool PlayoutIsInitialized() const; | 98 |
100 virtual int32_t RecordingIsAvailable(bool& available); | 99 // Audio transport control |
101 virtual int32_t InitRecording(); | 100 virtual int32_t StartPlayout(); |
102 virtual bool RecordingIsInitialized() const; | 101 virtual int32_t StopPlayout(); |
103 | 102 virtual bool Playing() const; |
104 // Audio transport control | 103 virtual int32_t StartRecording(); |
105 virtual int32_t StartPlayout(); | 104 virtual int32_t StopRecording(); |
106 virtual int32_t StopPlayout(); | 105 virtual bool Recording() const; |
107 virtual bool Playing() const; | 106 |
108 virtual int32_t StartRecording(); | 107 // Microphone Automatic Gain Control (AGC) |
109 virtual int32_t StopRecording(); | 108 virtual int32_t SetAGC(bool enable); |
110 virtual bool Recording() const; | 109 virtual bool AGC() const; |
111 | 110 |
112 // Microphone Automatic Gain Control (AGC) | 111 // Volume control based on the Windows Wave API (Windows only) |
113 virtual int32_t SetAGC(bool enable); | 112 virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); |
114 virtual bool AGC() const; | 113 virtual int32_t WaveOutVolume(uint16_t& volumeLeft, |
115 | 114 uint16_t& volumeRight) const; |
116 // Volume control based on the Windows Wave API (Windows only) | 115 |
117 virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); | 116 // Audio mixer initialization |
118 virtual int32_t WaveOutVolume(uint16_t& volumeLeft, | 117 virtual int32_t InitSpeaker(); |
119 uint16_t& volumeRight) const; | 118 virtual bool SpeakerIsInitialized() const; |
120 | 119 virtual int32_t InitMicrophone(); |
121 // Audio mixer initialization | 120 virtual bool MicrophoneIsInitialized() const; |
122 virtual int32_t InitSpeaker(); | 121 |
123 virtual bool SpeakerIsInitialized() const; | 122 // Speaker volume controls |
124 virtual int32_t InitMicrophone(); | 123 virtual int32_t SpeakerVolumeIsAvailable(bool& available); |
125 virtual bool MicrophoneIsInitialized() const; | 124 virtual int32_t SetSpeakerVolume(uint32_t volume); |
126 | 125 virtual int32_t SpeakerVolume(uint32_t& volume) const; |
127 // Speaker volume controls | 126 virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; |
128 virtual int32_t SpeakerVolumeIsAvailable(bool& available); | 127 virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; |
129 virtual int32_t SetSpeakerVolume(uint32_t volume); | 128 virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; |
130 virtual int32_t SpeakerVolume(uint32_t& volume) const; | 129 |
131 virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; | 130 // Microphone volume controls |
132 virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; | 131 virtual int32_t MicrophoneVolumeIsAvailable(bool& available); |
133 virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; | 132 virtual int32_t SetMicrophoneVolume(uint32_t volume); |
134 | 133 virtual int32_t MicrophoneVolume(uint32_t& volume) const; |
135 // Microphone volume controls | 134 virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; |
136 virtual int32_t MicrophoneVolumeIsAvailable(bool& available); | 135 virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; |
137 virtual int32_t SetMicrophoneVolume(uint32_t volume); | 136 virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; |
138 virtual int32_t MicrophoneVolume(uint32_t& volume) const; | 137 |
139 virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; | 138 // Microphone mute control |
140 virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; | 139 virtual int32_t MicrophoneMuteIsAvailable(bool& available); |
141 virtual int32_t | 140 virtual int32_t SetMicrophoneMute(bool enable); |
142 MicrophoneVolumeStepSize(uint16_t& stepSize) const; | 141 virtual int32_t MicrophoneMute(bool& enabled) const; |
143 | 142 |
144 // Microphone mute control | 143 // Speaker mute control |
145 virtual int32_t MicrophoneMuteIsAvailable(bool& available); | 144 virtual int32_t SpeakerMuteIsAvailable(bool& available); |
146 virtual int32_t SetMicrophoneMute(bool enable); | 145 virtual int32_t SetSpeakerMute(bool enable); |
147 virtual int32_t MicrophoneMute(bool& enabled) const; | 146 virtual int32_t SpeakerMute(bool& enabled) const; |
148 | 147 |
149 // Speaker mute control | 148 // Microphone boost control |
150 virtual int32_t SpeakerMuteIsAvailable(bool& available); | 149 virtual int32_t MicrophoneBoostIsAvailable(bool& available); |
151 virtual int32_t SetSpeakerMute(bool enable); | 150 virtual int32_t SetMicrophoneBoost(bool enable); |
152 virtual int32_t SpeakerMute(bool& enabled) const; | 151 virtual int32_t MicrophoneBoost(bool& enabled) const; |
153 | 152 |
154 // Microphone boost control | 153 // Stereo support |
155 virtual int32_t MicrophoneBoostIsAvailable(bool& available); | 154 virtual int32_t StereoPlayoutIsAvailable(bool& available); |
156 virtual int32_t SetMicrophoneBoost(bool enable); | 155 virtual int32_t SetStereoPlayout(bool enable); |
157 virtual int32_t MicrophoneBoost(bool& enabled) const; | 156 virtual int32_t StereoPlayout(bool& enabled) const; |
158 | 157 virtual int32_t StereoRecordingIsAvailable(bool& available); |
159 // Stereo support | 158 virtual int32_t SetStereoRecording(bool enable); |
160 virtual int32_t StereoPlayoutIsAvailable(bool& available); | 159 virtual int32_t StereoRecording(bool& enabled) const; |
161 virtual int32_t SetStereoPlayout(bool enable); | 160 |
162 virtual int32_t StereoPlayout(bool& enabled) const; | 161 // Delay information and control |
163 virtual int32_t StereoRecordingIsAvailable(bool& available); | 162 virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, |
164 virtual int32_t SetStereoRecording(bool enable); | 163 uint16_t sizeMS); |
165 virtual int32_t StereoRecording(bool& enabled) const; | 164 virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, |
166 | 165 uint16_t& sizeMS) const; |
167 // Delay information and control | 166 virtual int32_t PlayoutDelay(uint16_t& delayMS) const; |
168 virtual int32_t | 167 virtual int32_t RecordingDelay(uint16_t& delayMS) const; |
169 SetPlayoutBuffer(const AudioDeviceModule::BufferType type, | 168 |
170 uint16_t sizeMS); | 169 // CPU load |
171 virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, | 170 virtual int32_t CPULoad(uint16_t& load) const; |
172 uint16_t& sizeMS) const; | 171 |
173 virtual int32_t PlayoutDelay(uint16_t& delayMS) const; | 172 virtual bool PlayoutWarning() const; |
174 virtual int32_t RecordingDelay(uint16_t& delayMS) const; | 173 virtual bool PlayoutError() const; |
175 | 174 virtual bool RecordingWarning() const; |
176 // CPU load | 175 virtual bool RecordingError() const; |
177 virtual int32_t CPULoad(uint16_t& load) const; | 176 virtual void ClearPlayoutWarning(); |
178 | 177 virtual void ClearPlayoutError(); |
179 virtual bool PlayoutWarning() const; | 178 virtual void ClearRecordingWarning(); |
180 virtual bool PlayoutError() const; | 179 virtual void ClearRecordingError(); |
181 virtual bool RecordingWarning() const; | 180 |
182 virtual bool RecordingError() const; | 181 virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); |
183 virtual void ClearPlayoutWarning(); | 182 |
184 virtual void ClearPlayoutError(); | 183 private: |
185 virtual void ClearRecordingWarning(); | 184 virtual int32_t MicrophoneIsAvailable(bool& available); |
186 virtual void ClearRecordingError(); | 185 virtual int32_t SpeakerIsAvailable(bool& available); |
187 | 186 |
188 virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); | 187 static void AtomicSet32(int32_t* theValue, int32_t newValue); |
189 | 188 static int32_t AtomicGet32(int32_t* theValue); |
190 private: | 189 |
191 virtual int32_t MicrophoneIsAvailable(bool& available); | 190 static void logCAMsg(const TraceLevel level, |
192 virtual int32_t SpeakerIsAvailable(bool& available); | 191 const TraceModule module, |
193 | 192 const int32_t id, |
194 static void AtomicSet32(int32_t* theValue, int32_t newValue); | 193 const char* msg, |
195 static int32_t AtomicGet32(int32_t* theValue); | 194 const char* err); |
196 | 195 |
197 static void logCAMsg(const TraceLevel level, | 196 int32_t GetNumberDevices(const AudioObjectPropertyScope scope, |
198 const TraceModule module, | 197 AudioDeviceID scopedDeviceIds[], |
199 const int32_t id, const char *msg, | 198 const uint32_t deviceListLength); |
200 const char *err); | 199 |
201 | 200 int32_t GetDeviceName(const AudioObjectPropertyScope scope, |
202 int32_t GetNumberDevices(const AudioObjectPropertyScope scope, | 201 const uint16_t index, |
203 AudioDeviceID scopedDeviceIds[], | 202 char* name); |
204 const uint32_t deviceListLength); | 203 |
205 | 204 int32_t InitDevice(uint16_t userDeviceIndex, |
206 int32_t GetDeviceName(const AudioObjectPropertyScope scope, | 205 AudioDeviceID& deviceId, |
207 const uint16_t index, char* name); | 206 bool isInput); |
208 | 207 |
209 int32_t InitDevice(uint16_t userDeviceIndex, | 208 // Always work with our preferred playout format inside VoE. |
210 AudioDeviceID& deviceId, bool isInput); | 209 // Then convert the output to the OS setting using an AudioConverter. |
211 | 210 OSStatus SetDesiredPlayoutFormat(); |
212 // Always work with our preferred playout format inside VoE. | 211 |
213 // Then convert the output to the OS setting using an AudioConverter. | 212 static OSStatus objectListenerProc( |
214 OSStatus SetDesiredPlayoutFormat(); | 213 AudioObjectID objectId, |
215 | 214 UInt32 numberAddresses, |
216 static OSStatus | 215 const AudioObjectPropertyAddress addresses[], |
217 objectListenerProc(AudioObjectID objectId, UInt32 numberAddresses, | 216 void* clientData); |
218 const AudioObjectPropertyAddress addresses[], | 217 |
219 void* clientData); | 218 OSStatus implObjectListenerProc(AudioObjectID objectId, |
220 | 219 UInt32 numberAddresses, |
221 OSStatus | 220 const AudioObjectPropertyAddress addresses[]); |
222 implObjectListenerProc(AudioObjectID objectId, UInt32 numberAddresses, | 221 |
223 const AudioObjectPropertyAddress addresses[]); | 222 int32_t HandleDeviceChange(); |
224 | 223 |
225 int32_t HandleDeviceChange(); | 224 int32_t HandleStreamFormatChange(AudioObjectID objectId, |
226 | 225 AudioObjectPropertyAddress propertyAddress); |
227 int32_t | 226 |
228 HandleStreamFormatChange(AudioObjectID objectId, | 227 int32_t HandleDataSourceChange(AudioObjectID objectId, |
229 AudioObjectPropertyAddress propertyAddress); | 228 AudioObjectPropertyAddress propertyAddress); |
230 | 229 |
231 int32_t | 230 int32_t HandleProcessorOverload(AudioObjectPropertyAddress propertyAddress); |
232 HandleDataSourceChange(AudioObjectID objectId, | 231 |
233 AudioObjectPropertyAddress propertyAddress); | 232 static OSStatus deviceIOProc(AudioDeviceID device, |
234 | 233 const AudioTimeStamp* now, |
235 int32_t | 234 const AudioBufferList* inputData, |
236 HandleProcessorOverload(AudioObjectPropertyAddress propertyAddress); | 235 const AudioTimeStamp* inputTime, |
237 | 236 AudioBufferList* outputData, |
238 static OSStatus deviceIOProc(AudioDeviceID device, | 237 const AudioTimeStamp* outputTime, |
239 const AudioTimeStamp *now, | 238 void* clientData); |
240 const AudioBufferList *inputData, | 239 |
241 const AudioTimeStamp *inputTime, | 240 static OSStatus outConverterProc( |
242 AudioBufferList *outputData, | 241 AudioConverterRef audioConverter, |
| 242 UInt32* numberDataPackets, |
| 243 AudioBufferList* data, |
| 244 AudioStreamPacketDescription** dataPacketDescription, |
| 245 void* userData); |
| 246 |
| 247 static OSStatus inDeviceIOProc(AudioDeviceID device, |
| 248 const AudioTimeStamp* now, |
| 249 const AudioBufferList* inputData, |
| 250 const AudioTimeStamp* inputTime, |
| 251 AudioBufferList* outputData, |
243 const AudioTimeStamp* outputTime, | 252 const AudioTimeStamp* outputTime, |
244 void *clientData); | 253 void* clientData); |
245 | 254 |
246 static OSStatus | 255 static OSStatus inConverterProc( |
247 outConverterProc(AudioConverterRef audioConverter, | 256 AudioConverterRef audioConverter, |
248 UInt32 *numberDataPackets, AudioBufferList *data, | 257 UInt32* numberDataPackets, |
249 AudioStreamPacketDescription **dataPacketDescription, | 258 AudioBufferList* data, |
250 void *userData); | 259 AudioStreamPacketDescription** dataPacketDescription, |
251 | 260 void* inUserData); |
252 static OSStatus inDeviceIOProc(AudioDeviceID device, | 261 |
253 const AudioTimeStamp *now, | 262 OSStatus implDeviceIOProc(const AudioBufferList* inputData, |
254 const AudioBufferList *inputData, | 263 const AudioTimeStamp* inputTime, |
255 const AudioTimeStamp *inputTime, | 264 AudioBufferList* outputData, |
256 AudioBufferList *outputData, | 265 const AudioTimeStamp* outputTime); |
257 const AudioTimeStamp *outputTime, | 266 |
258 void *clientData); | 267 OSStatus implOutConverterProc(UInt32* numberDataPackets, |
259 | 268 AudioBufferList* data); |
260 static OSStatus | 269 |
261 inConverterProc(AudioConverterRef audioConverter, | 270 OSStatus implInDeviceIOProc(const AudioBufferList* inputData, |
262 UInt32 *numberDataPackets, AudioBufferList *data, | 271 const AudioTimeStamp* inputTime); |
263 AudioStreamPacketDescription **dataPacketDescription, | 272 |
264 void *inUserData); | 273 OSStatus implInConverterProc(UInt32* numberDataPackets, |
265 | 274 AudioBufferList* data); |
266 OSStatus implDeviceIOProc(const AudioBufferList *inputData, | 275 |
267 const AudioTimeStamp *inputTime, | 276 static bool RunCapture(void*); |
268 AudioBufferList *outputData, | 277 static bool RunRender(void*); |
269 const AudioTimeStamp *outputTime); | 278 bool CaptureWorkerThread(); |
270 | 279 bool RenderWorkerThread(); |
271 OSStatus implOutConverterProc(UInt32 *numberDataPackets, | 280 |
272 AudioBufferList *data); | 281 bool KeyPressed(); |
273 | 282 |
274 OSStatus implInDeviceIOProc(const AudioBufferList *inputData, | 283 AudioDeviceBuffer* _ptrAudioBuffer; |
275 const AudioTimeStamp *inputTime); | 284 |
276 | 285 CriticalSectionWrapper& _critSect; |
277 OSStatus implInConverterProc(UInt32 *numberDataPackets, | 286 |
278 AudioBufferList *data); | 287 EventWrapper& _stopEventRec; |
279 | 288 EventWrapper& _stopEvent; |
280 static bool RunCapture(void*); | 289 |
281 static bool RunRender(void*); | 290 // TODO(pbos): Replace with direct members, just start/stop, no need to |
282 bool CaptureWorkerThread(); | 291 // recreate the thread. |
283 bool RenderWorkerThread(); | 292 // Only valid/running between calls to StartRecording and StopRecording. |
284 | 293 rtc::scoped_ptr<rtc::PlatformThread> capture_worker_thread_; |
285 bool KeyPressed(); | 294 |
286 | 295 // Only valid/running between calls to StartPlayout and StopPlayout. |
287 AudioDeviceBuffer* _ptrAudioBuffer; | 296 rtc::scoped_ptr<rtc::PlatformThread> render_worker_thread_; |
288 | 297 |
289 CriticalSectionWrapper& _critSect; | 298 int32_t _id; |
290 | 299 |
291 EventWrapper& _stopEventRec; | 300 AudioMixerManagerMac _mixerManager; |
292 EventWrapper& _stopEvent; | 301 |
293 | 302 uint16_t _inputDeviceIndex; |
294 // TODO(pbos): Replace with direct members, just start/stop, no need to | 303 uint16_t _outputDeviceIndex; |
295 // recreate the thread. | 304 AudioDeviceID _inputDeviceID; |
296 // Only valid/running between calls to StartRecording and StopRecording. | 305 AudioDeviceID _outputDeviceID; |
297 rtc::scoped_ptr<rtc::PlatformThread> capture_worker_thread_; | |
298 | |
299 // Only valid/running between calls to StartPlayout and StopPlayout. | |
300 rtc::scoped_ptr<rtc::PlatformThread> render_worker_thread_; | |
301 | |
302 int32_t _id; | |
303 | |
304 AudioMixerManagerMac _mixerManager; | |
305 | |
306 uint16_t _inputDeviceIndex; | |
307 uint16_t _outputDeviceIndex; | |
308 AudioDeviceID _inputDeviceID; | |
309 AudioDeviceID _outputDeviceID; | |
310 #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 | 306 #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 |
311 AudioDeviceIOProcID _inDeviceIOProcID; | 307 AudioDeviceIOProcID _inDeviceIOProcID; |
312 AudioDeviceIOProcID _deviceIOProcID; | 308 AudioDeviceIOProcID _deviceIOProcID; |
313 #endif | 309 #endif |
314 bool _inputDeviceIsSpecified; | 310 bool _inputDeviceIsSpecified; |
315 bool _outputDeviceIsSpecified; | 311 bool _outputDeviceIsSpecified; |
316 | 312 |
317 uint8_t _recChannels; | 313 uint8_t _recChannels; |
318 uint8_t _playChannels; | 314 uint8_t _playChannels; |
319 | 315 |
320 Float32* _captureBufData; | 316 Float32* _captureBufData; |
321 SInt16* _renderBufData; | 317 SInt16* _renderBufData; |
322 | 318 |
323 SInt16 _renderConvertData[PLAY_BUF_SIZE_IN_SAMPLES]; | 319 SInt16 _renderConvertData[PLAY_BUF_SIZE_IN_SAMPLES]; |
324 | 320 |
325 AudioDeviceModule::BufferType _playBufType; | 321 AudioDeviceModule::BufferType _playBufType; |
326 | 322 |
327 bool _initialized; | 323 bool _initialized; |
328 bool _isShutDown; | 324 bool _isShutDown; |
329 bool _recording; | 325 bool _recording; |
330 bool _playing; | 326 bool _playing; |
331 bool _recIsInitialized; | 327 bool _recIsInitialized; |
332 bool _playIsInitialized; | 328 bool _playIsInitialized; |
333 bool _AGC; | 329 bool _AGC; |
334 | 330 |
335 // Atomically set varaibles | 331 // Atomically set varaibles |
336 int32_t _renderDeviceIsAlive; | 332 int32_t _renderDeviceIsAlive; |
337 int32_t _captureDeviceIsAlive; | 333 int32_t _captureDeviceIsAlive; |
338 | 334 |
339 bool _twoDevices; | 335 bool _twoDevices; |
340 bool _doStop; // For play if not shared device or play+rec if shared device | 336 bool _doStop; // For play if not shared device or play+rec if shared device |
341 bool _doStopRec; // For rec if not shared device | 337 bool _doStopRec; // For rec if not shared device |
342 bool _macBookPro; | 338 bool _macBookPro; |
343 bool _macBookProPanRight; | 339 bool _macBookProPanRight; |
344 | 340 |
345 AudioConverterRef _captureConverter; | 341 AudioConverterRef _captureConverter; |
346 AudioConverterRef _renderConverter; | 342 AudioConverterRef _renderConverter; |
347 | 343 |
348 AudioStreamBasicDescription _outStreamFormat; | 344 AudioStreamBasicDescription _outStreamFormat; |
349 AudioStreamBasicDescription _outDesiredFormat; | 345 AudioStreamBasicDescription _outDesiredFormat; |
350 AudioStreamBasicDescription _inStreamFormat; | 346 AudioStreamBasicDescription _inStreamFormat; |
351 AudioStreamBasicDescription _inDesiredFormat; | 347 AudioStreamBasicDescription _inDesiredFormat; |
352 | 348 |
353 uint32_t _captureLatencyUs; | 349 uint32_t _captureLatencyUs; |
354 uint32_t _renderLatencyUs; | 350 uint32_t _renderLatencyUs; |
355 | 351 |
356 // Atomically set variables | 352 // Atomically set variables |
357 mutable int32_t _captureDelayUs; | 353 mutable int32_t _captureDelayUs; |
358 mutable int32_t _renderDelayUs; | 354 mutable int32_t _renderDelayUs; |
359 | 355 |
360 int32_t _renderDelayOffsetSamples; | 356 int32_t _renderDelayOffsetSamples; |
361 | 357 |
362 uint16_t _playBufDelayFixed; // fixed playback delay | 358 uint16_t _playBufDelayFixed; // fixed playback delay |
363 | 359 |
364 uint16_t _playWarning; | 360 uint16_t _playWarning; |
365 uint16_t _playError; | 361 uint16_t _playError; |
366 uint16_t _recWarning; | 362 uint16_t _recWarning; |
367 uint16_t _recError; | 363 uint16_t _recError; |
368 | 364 |
369 PaUtilRingBuffer* _paCaptureBuffer; | 365 PaUtilRingBuffer* _paCaptureBuffer; |
370 PaUtilRingBuffer* _paRenderBuffer; | 366 PaUtilRingBuffer* _paRenderBuffer; |
371 | 367 |
372 semaphore_t _renderSemaphore; | 368 semaphore_t _renderSemaphore; |
373 semaphore_t _captureSemaphore; | 369 semaphore_t _captureSemaphore; |
374 | 370 |
375 int _captureBufSizeSamples; | 371 int _captureBufSizeSamples; |
376 int _renderBufSizeSamples; | 372 int _renderBufSizeSamples; |
377 | 373 |
378 // Typing detection | 374 // Typing detection |
379 // 0x5c is key "9", after that comes function keys. | 375 // 0x5c is key "9", after that comes function keys. |
380 bool prev_key_state_[0x5d]; | 376 bool prev_key_state_[0x5d]; |
381 | 377 |
382 int get_mic_volume_counter_ms_; | 378 int get_mic_volume_counter_ms_; |
383 }; | 379 }; |
384 | 380 |
385 } // namespace webrtc | 381 } // namespace webrtc |
386 | 382 |
387 #endif // MODULES_AUDIO_DEVICE_MAIN_SOURCE_MAC_AUDIO_DEVICE_MAC_H_ | 383 #endif // MODULES_AUDIO_DEVICE_MAIN_SOURCE_MAC_AUDIO_DEVICE_MAC_H_ |
OLD | NEW |