Commit df2c0239 authored by David Reid's avatar David Reid

Core Audio: Remove requirement to link to CoreFoundation.

parent df58a2e4
...@@ -1233,8 +1233,23 @@ struct mal_context ...@@ -1233,8 +1233,23 @@ struct mal_context
struct struct
{ {
mal_handle hCoreFoundation; mal_handle hCoreFoundation;
mal_proc CFStringGetCString;
mal_handle hCoreAudio; mal_handle hCoreAudio;
mal_proc AudioObjectGetPropertyData;
mal_proc AudioObjectGetPropertyDataSize;
mal_proc AudioObjectSetPropertyData;
mal_handle hAudioToolbox; mal_handle hAudioToolbox;
mal_proc AudioComponentFindNext;
mal_proc AudioComponentInstanceDispose;
mal_proc AudioComponentInstanceNew;
mal_proc AudioOutputUnitStart;
mal_proc AudioOutputUnitStop;
mal_proc AudioUnitAddPropertyListener;
mal_proc AudioUnitGetProperty;
mal_proc AudioUnitInitialize;
mal_proc AudioUnitRender;
} coreaudio; } coreaudio;
#endif #endif
#ifdef MAL_SUPPORT_OSS #ifdef MAL_SUPPORT_OSS
...@@ -12551,6 +12566,14 @@ mal_result mal_device__stop_backend__jack(mal_device* pDevice) ...@@ -12551,6 +12566,14 @@ mal_result mal_device__stop_backend__jack(mal_device* pDevice)
#define MAL_APPLE_MOBILE #define MAL_APPLE_MOBILE
#endif #endif
// CoreFoundation
typedef Boolean (* mal_CFStringGetCString_proc)(CFStringRef theString, char* buffer, CFIndex bufferSize, CFStringEncoding encoding);
// CoreAudio
// AudioToolbox
// Core Audio // Core Audio
// //
// So far, Core Audio has been the worst backend to work with due to being both unintuitive and having almost no documentation // So far, Core Audio has been the worst backend to work with due to being both unintuitive and having almost no documentation
...@@ -12842,23 +12865,27 @@ mal_result mal_get_AudioObject_uid_as_CFStringRef(AudioObjectID objectID, CFStri ...@@ -12842,23 +12865,27 @@ mal_result mal_get_AudioObject_uid_as_CFStringRef(AudioObjectID objectID, CFStri
return MAL_SUCCESS; return MAL_SUCCESS;
} }
mal_result mal_get_AudioObject_uid(AudioObjectID objectID, size_t bufferSize, char* bufferOut) mal_result mal_get_AudioObject_uid(mal_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)
{ {
mal_assert(pContext != NULL);
CFStringRef uid; CFStringRef uid;
mal_result result = mal_get_AudioObject_uid_as_CFStringRef(objectID, &uid); mal_result result = mal_get_AudioObject_uid_as_CFStringRef(objectID, &uid);
if (result != MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return result; return result;
} }
if (!CFStringGetCString(uid, bufferOut, bufferSize, kCFStringEncodingUTF8)) { if (!((mal_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(uid, bufferOut, bufferSize, kCFStringEncodingUTF8)) {
return MAL_ERROR; return MAL_ERROR;
} }
return MAL_SUCCESS; return MAL_SUCCESS;
} }
mal_result mal_get_AudioObject_name(AudioObjectID objectID, size_t bufferSize, char* bufferOut) mal_result mal_get_AudioObject_name(mal_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)
{ {
mal_assert(pContext != NULL);
AudioObjectPropertyAddress propAddress; AudioObjectPropertyAddress propAddress;
propAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; propAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;
propAddress.mScope = kAudioObjectPropertyScopeGlobal; propAddress.mScope = kAudioObjectPropertyScopeGlobal;
...@@ -12871,7 +12898,7 @@ mal_result mal_get_AudioObject_name(AudioObjectID objectID, size_t bufferSize, c ...@@ -12871,7 +12898,7 @@ mal_result mal_get_AudioObject_name(AudioObjectID objectID, size_t bufferSize, c
return mal_result_from_OSStatus(status); return mal_result_from_OSStatus(status);
} }
if (!CFStringGetCString(deviceName, bufferOut, bufferSize, kCFStringEncodingUTF8)) { if (!((mal_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(deviceName, bufferOut, bufferSize, kCFStringEncodingUTF8)) {
return MAL_ERROR; return MAL_ERROR;
} }
...@@ -13311,7 +13338,7 @@ mal_result mal_find_AudioObjectID(mal_context* pContext, mal_device_type type, c ...@@ -13311,7 +13338,7 @@ mal_result mal_find_AudioObjectID(mal_context* pContext, mal_device_type type, c
AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice]; AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];
char uid[256]; char uid[256];
if (mal_get_AudioObject_uid(deviceObjectID, sizeof(uid), uid) != MAL_SUCCESS) { if (mal_get_AudioObject_uid(pContext, deviceObjectID, sizeof(uid), uid) != MAL_SUCCESS) {
continue; continue;
} }
...@@ -13544,10 +13571,10 @@ mal_result mal_context_enumerate_devices__coreaudio(mal_context* pContext, mal_e ...@@ -13544,10 +13571,10 @@ mal_result mal_context_enumerate_devices__coreaudio(mal_context* pContext, mal_e
mal_device_info info; mal_device_info info;
mal_zero_object(&info); mal_zero_object(&info);
if (mal_get_AudioObject_uid(deviceObjectID, sizeof(info.id.coreaudio), info.id.coreaudio) != MAL_SUCCESS) { if (mal_get_AudioObject_uid(pContext, deviceObjectID, sizeof(info.id.coreaudio), info.id.coreaudio) != MAL_SUCCESS) {
continue; continue;
} }
if (mal_get_AudioObject_name(deviceObjectID, sizeof(info.name), info.name) != MAL_SUCCESS) { if (mal_get_AudioObject_name(pContext, deviceObjectID, sizeof(info.name), info.name) != MAL_SUCCESS) {
continue; continue;
} }
...@@ -13579,12 +13606,12 @@ mal_result mal_context_get_device_info__coreaudio(mal_context* pContext, mal_dev ...@@ -13579,12 +13606,12 @@ mal_result mal_context_get_device_info__coreaudio(mal_context* pContext, mal_dev
return result; return result;
} }
result = mal_get_AudioObject_uid(deviceObjectID, sizeof(pDeviceInfo->id.coreaudio), pDeviceInfo->id.coreaudio); result = mal_get_AudioObject_uid(pContext, deviceObjectID, sizeof(pDeviceInfo->id.coreaudio), pDeviceInfo->id.coreaudio);
if (result != MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return result; return result;
} }
result = mal_get_AudioObject_name(deviceObjectID, sizeof(pDeviceInfo->name), pDeviceInfo->name); result = mal_get_AudioObject_name(pContext, deviceObjectID, sizeof(pDeviceInfo->name), pDeviceInfo->name);
if (result != MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return result; return result;
} }
...@@ -13665,18 +13692,24 @@ mal_result mal_context_init__coreaudio(mal_context* pContext) ...@@ -13665,18 +13692,24 @@ mal_result mal_context_init__coreaudio(mal_context* pContext)
return MAL_API_NOT_FOUND; return MAL_API_NOT_FOUND;
} }
pContext->coreaudio.CFStringGetCString = mal_dlsym(pContext->coreaudio.hCoreFoundation, "CFStringGetCString");
pContext->coreaudio.hCoreAudio = mal_dlopen("CoreAudio.framework/CoreAudio"); pContext->coreaudio.hCoreAudio = mal_dlopen("CoreAudio.framework/CoreAudio");
if (pContext->coreaudio.hCoreAudio == NULL) { if (pContext->coreaudio.hCoreAudio == NULL) {
mal_dlclose(pContext->coreaudio.hCoreFoundation); mal_dlclose(pContext->coreaudio.hCoreFoundation);
return MAL_API_NOT_FOUND; return MAL_API_NOT_FOUND;
} }
pContext->coreaudio.hAudioToolbox = mal_dlopen("AudioToolbox.framework/AudioToolbox"); pContext->coreaudio.hAudioToolbox = mal_dlopen("AudioToolbox.framework/AudioToolbox");
if (pContext->coreaudio.hAudioToolbox == NULL) { if (pContext->coreaudio.hAudioToolbox == 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;
} }
#else
pContext->coreaudio.CFStringGetCString = CFStringGetCString;
#endif #endif
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__coreaudio; pContext->onDeviceIDEqual = mal_context_is_device_id_equal__coreaudio;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment