|
@@ -331,55 +331,57 @@ bool AudioDriverCoreAudio::try_lock() {
|
|
}
|
|
}
|
|
|
|
|
|
void AudioDriverCoreAudio::finish() {
|
|
void AudioDriverCoreAudio::finish() {
|
|
- OSStatus result;
|
|
|
|
|
|
+ if (audio_unit) {
|
|
|
|
+ OSStatus result;
|
|
|
|
|
|
- lock();
|
|
|
|
|
|
+ lock();
|
|
|
|
|
|
- AURenderCallbackStruct callback;
|
|
|
|
- zeromem(&callback, sizeof(AURenderCallbackStruct));
|
|
|
|
- result = AudioUnitSetProperty(audio_unit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, kOutputBus, &callback, sizeof(callback));
|
|
|
|
- if (result != noErr) {
|
|
|
|
- ERR_PRINT("AudioUnitSetProperty failed");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (active) {
|
|
|
|
- result = AudioOutputUnitStop(audio_unit);
|
|
|
|
|
|
+ AURenderCallbackStruct callback;
|
|
|
|
+ zeromem(&callback, sizeof(AURenderCallbackStruct));
|
|
|
|
+ result = AudioUnitSetProperty(audio_unit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, kOutputBus, &callback, sizeof(callback));
|
|
if (result != noErr) {
|
|
if (result != noErr) {
|
|
- ERR_PRINT("AudioOutputUnitStop failed");
|
|
|
|
|
|
+ ERR_PRINT("AudioUnitSetProperty failed");
|
|
}
|
|
}
|
|
|
|
|
|
- active = false;
|
|
|
|
- }
|
|
|
|
|
|
+ if (active) {
|
|
|
|
+ result = AudioOutputUnitStop(audio_unit);
|
|
|
|
+ if (result != noErr) {
|
|
|
|
+ ERR_PRINT("AudioOutputUnitStop failed");
|
|
|
|
+ }
|
|
|
|
|
|
- result = AudioUnitUninitialize(audio_unit);
|
|
|
|
- if (result != noErr) {
|
|
|
|
- ERR_PRINT("AudioUnitUninitialize failed");
|
|
|
|
- }
|
|
|
|
|
|
+ active = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ result = AudioUnitUninitialize(audio_unit);
|
|
|
|
+ if (result != noErr) {
|
|
|
|
+ ERR_PRINT("AudioUnitUninitialize failed");
|
|
|
|
+ }
|
|
|
|
|
|
#ifdef OSX_ENABLED
|
|
#ifdef OSX_ENABLED
|
|
- AudioObjectPropertyAddress prop;
|
|
|
|
- prop.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
|
|
|
|
- prop.mScope = kAudioObjectPropertyScopeGlobal;
|
|
|
|
- prop.mElement = kAudioObjectPropertyElementMaster;
|
|
|
|
|
|
+ AudioObjectPropertyAddress prop;
|
|
|
|
+ prop.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
|
|
|
|
+ prop.mScope = kAudioObjectPropertyScopeGlobal;
|
|
|
|
+ prop.mElement = kAudioObjectPropertyElementMaster;
|
|
|
|
|
|
- result = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &prop, &output_device_address_cb, this);
|
|
|
|
- if (result != noErr) {
|
|
|
|
- ERR_PRINT("AudioObjectRemovePropertyListener failed");
|
|
|
|
- }
|
|
|
|
|
|
+ result = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &prop, &output_device_address_cb, this);
|
|
|
|
+ if (result != noErr) {
|
|
|
|
+ ERR_PRINT("AudioObjectRemovePropertyListener failed");
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- result = AudioComponentInstanceDispose(audio_unit);
|
|
|
|
- if (result != noErr) {
|
|
|
|
- ERR_PRINT("AudioComponentInstanceDispose failed");
|
|
|
|
- }
|
|
|
|
|
|
+ result = AudioComponentInstanceDispose(audio_unit);
|
|
|
|
+ if (result != noErr) {
|
|
|
|
+ ERR_PRINT("AudioComponentInstanceDispose failed");
|
|
|
|
+ }
|
|
|
|
|
|
- unlock();
|
|
|
|
|
|
+ unlock();
|
|
|
|
+ }
|
|
|
|
|
|
if (mutex) {
|
|
if (mutex) {
|
|
memdelete(mutex);
|
|
memdelete(mutex);
|
|
mutex = NULL;
|
|
mutex = NULL;
|
|
}
|
|
}
|
|
-};
|
|
|
|
|
|
+}
|
|
|
|
|
|
Error AudioDriverCoreAudio::capture_start() {
|
|
Error AudioDriverCoreAudio::capture_start() {
|
|
|
|
|
|
@@ -576,6 +578,7 @@ String AudioDriverCoreAudio::capture_get_device() {
|
|
#endif
|
|
#endif
|
|
|
|
|
|
AudioDriverCoreAudio::AudioDriverCoreAudio() {
|
|
AudioDriverCoreAudio::AudioDriverCoreAudio() {
|
|
|
|
+ audio_unit = NULL;
|
|
active = false;
|
|
active = false;
|
|
mutex = NULL;
|
|
mutex = NULL;
|
|
|
|
|