mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 08:44:04 +02:00
Core Audio: Fixes to runtime linking.
This commit is contained in:
@@ -1242,7 +1242,7 @@ struct mal_context
|
|||||||
mal_proc AudioObjectGetPropertyDataSize;
|
mal_proc AudioObjectGetPropertyDataSize;
|
||||||
mal_proc AudioObjectSetPropertyData;
|
mal_proc AudioObjectSetPropertyData;
|
||||||
|
|
||||||
mal_handle hAudioToolbox;
|
mal_handle hAudioUnit; // Could possibly be set to AudioToolbox on later versions of macOS.
|
||||||
mal_proc AudioComponentFindNext;
|
mal_proc AudioComponentFindNext;
|
||||||
mal_proc AudioComponentInstanceDispose;
|
mal_proc AudioComponentInstanceDispose;
|
||||||
mal_proc AudioComponentInstanceNew;
|
mal_proc AudioComponentInstanceNew;
|
||||||
@@ -13840,23 +13840,38 @@ mal_result mal_context_init__coreaudio(mal_context* pContext)
|
|||||||
pContext->coreaudio.AudioObjectSetPropertyData = mal_dlsym(pContext->coreaudio.hCoreAudio, "AudioObjectSetPropertyData");
|
pContext->coreaudio.AudioObjectSetPropertyData = mal_dlsym(pContext->coreaudio.hCoreAudio, "AudioObjectSetPropertyData");
|
||||||
|
|
||||||
|
|
||||||
pContext->coreaudio.hAudioToolbox = mal_dlopen("AudioToolbox.framework/AudioToolbox");
|
// It looks like Apple has moved some APIs from AudioUnit into AudioToolbox on more recent versions of macOS. They are still
|
||||||
if (pContext->coreaudio.hAudioToolbox == NULL) {
|
// defined in AudioUnit, but just in case they decided to remove them from there entirely I'm going to do implement a fallback.
|
||||||
|
// The way it'll work is that it'll first try AudioUnit, and if the required symbols are not present there we'll fall back to
|
||||||
|
// AudioToolbox.
|
||||||
|
pContext->coreaudio.hAudioUnit = mal_dlopen("AudioUnit.framework/AudioUnit");
|
||||||
|
if (pContext->coreaudio.hAudioUnit == NULL) {
|
||||||
mal_dlclose(pContext->coreaudio.hCoreAudio);
|
mal_dlclose(pContext->coreaudio.hCoreAudio);
|
||||||
mal_dlclose(pContext->coreaudio.hCoreFoundation);
|
mal_dlclose(pContext->coreaudio.hCoreFoundation);
|
||||||
return MAL_API_NOT_FOUND;
|
return MAL_API_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
pContext->coreaudio.AudioComponentFindNext = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioComponentFindNext");
|
if (mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioComponentFindNext") == NULL) {
|
||||||
pContext->coreaudio.AudioComponentInstanceDispose = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioComponentInstanceDispose");
|
// Couldn't find the required symbols in AudioUnit, so fall back to AudioToolbox.
|
||||||
pContext->coreaudio.AudioComponentInstanceNew = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioComponentInstanceNew");
|
mal_dlclose(pContext->coreaudio.hAudioUnit);
|
||||||
pContext->coreaudio.AudioOutputUnitStart = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioOutputUnitStart");
|
pContext->coreaudio.hAudioUnit = mal_dlopen("AudioToolbox.framework/AudioToolbox");
|
||||||
pContext->coreaudio.AudioOutputUnitStop = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioOutputUnitStop");
|
if (pContext->coreaudio.hAudioUnit == NULL) {
|
||||||
pContext->coreaudio.AudioUnitAddPropertyListener = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioUnitAddPropertyListener");
|
mal_dlclose(pContext->coreaudio.hCoreAudio);
|
||||||
pContext->coreaudio.AudioUnitGetProperty = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioUnitGetProperty");
|
mal_dlclose(pContext->coreaudio.hCoreFoundation);
|
||||||
pContext->coreaudio.AudioUnitSetProperty = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioUnitSetProperty");
|
return MAL_API_NOT_FOUND;
|
||||||
pContext->coreaudio.AudioUnitInitialize = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioUnitInitialize");
|
}
|
||||||
pContext->coreaudio.AudioUnitRender = mal_dlsym(pContext->coreaudio.hAudioToolbox, "AudioUnitRender");
|
}
|
||||||
|
|
||||||
|
pContext->coreaudio.AudioComponentFindNext = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioComponentFindNext");
|
||||||
|
pContext->coreaudio.AudioComponentInstanceDispose = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioComponentInstanceDispose");
|
||||||
|
pContext->coreaudio.AudioComponentInstanceNew = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioComponentInstanceNew");
|
||||||
|
pContext->coreaudio.AudioOutputUnitStart = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioOutputUnitStart");
|
||||||
|
pContext->coreaudio.AudioOutputUnitStop = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioOutputUnitStop");
|
||||||
|
pContext->coreaudio.AudioUnitAddPropertyListener = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioUnitAddPropertyListener");
|
||||||
|
pContext->coreaudio.AudioUnitGetProperty = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioUnitGetProperty");
|
||||||
|
pContext->coreaudio.AudioUnitSetProperty = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioUnitSetProperty");
|
||||||
|
pContext->coreaudio.AudioUnitInitialize = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioUnitInitialize");
|
||||||
|
pContext->coreaudio.AudioUnitRender = mal_dlsym(pContext->coreaudio.hAudioUnit, "AudioUnitRender");
|
||||||
#else
|
#else
|
||||||
pContext->coreaudio.CFStringGetCString = (mal_proc)CFStringGetCString;
|
pContext->coreaudio.CFStringGetCString = (mal_proc)CFStringGetCString;
|
||||||
|
|
||||||
@@ -13891,7 +13906,7 @@ mal_result mal_context_uninit__coreaudio(mal_context* pContext)
|
|||||||
mal_assert(pContext->backend == mal_backend_coreaudio);
|
mal_assert(pContext->backend == mal_backend_coreaudio);
|
||||||
|
|
||||||
#if !defined(MAL_NO_RUNTIME_LINKING) && !defined(MAL_APPLE_MOBILE)
|
#if !defined(MAL_NO_RUNTIME_LINKING) && !defined(MAL_APPLE_MOBILE)
|
||||||
mal_dlclose(pContext->coreaudio.hAudioToolbox);
|
mal_dlclose(pContext->coreaudio.hAudioUnit);
|
||||||
mal_dlclose(pContext->coreaudio.hCoreAudio);
|
mal_dlclose(pContext->coreaudio.hCoreAudio);
|
||||||
mal_dlclose(pContext->coreaudio.hCoreFoundation);
|
mal_dlclose(pContext->coreaudio.hCoreFoundation);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user