diff options
author | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2013-07-13 13:01:50 +0200 |
---|---|---|
committer | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2013-07-22 21:53:18 +0200 |
commit | 18777ecfe894ec9c7995a69e0786e56f45bc73f8 (patch) | |
tree | 70af9d9a5ffe4960a8b1241953dcd5b08513e614 /audio/out/ao_coreaudio_properties.c | |
parent | 1ed117563613b0ddaa2a9c598acc632a707b9cc2 (diff) | |
download | mpv-18777ecfe894ec9c7995a69e0786e56f45bc73f8.tar.bz2 mpv-18777ecfe894ec9c7995a69e0786e56f45bc73f8.tar.xz |
ao_coreaudio: refactor properties code
Introduce some macros to deal with properties. These allow to work around the
limitation of CoreAudio's API being `void **` based. The macros allow to keep
their client's code DRY, by not asking size and other details which can be
derived by the macro itself. I have no idea why Apple didn't design their API
like this in the first place.
Diffstat (limited to 'audio/out/ao_coreaudio_properties.c')
-rw-r--r-- | audio/out/ao_coreaudio_properties.c | 99 |
1 files changed, 40 insertions, 59 deletions
diff --git a/audio/out/ao_coreaudio_properties.c b/audio/out/ao_coreaudio_properties.c index ee6b06a153..da66f8b9d3 100644 --- a/audio/out/ao_coreaudio_properties.c +++ b/audio/out/ao_coreaudio_properties.c @@ -22,69 +22,65 @@ #include "audio/out/ao_coreaudio_properties.h" #include "audio/out/ao_coreaudio_utils.h" -OSStatus ca_get(AudioObjectID id, AudioObjectPropertySelector selector, +OSStatus ca_get(AudioObjectID id, ca_scope scope, ca_sel selector, uint32_t size, void *data) { AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) { .mSelector = selector, - .mScope = kAudioObjectPropertyScopeGlobal, + .mScope = scope, .mElement = kAudioObjectPropertyElementMaster, }; return AudioObjectGetPropertyData(id, &p_addr, 0, NULL, &size, data); } -uint32_t GetAudioPropertyArray(AudioObjectID id, - AudioObjectPropertySelector selector, - AudioObjectPropertyScope scope, void **data) +OSStatus ca_set(AudioObjectID id, ca_scope scope, ca_sel selector, + uint32_t size, void *data) +{ + AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) { + .mSelector = selector, + .mScope = scope, + .mElement = kAudioObjectPropertyElementMaster, + }; + + return AudioObjectSetPropertyData(id, &p_addr, 0, NULL, size, data); +} + +OSStatus ca_get_ary(AudioObjectID id, ca_scope scope, ca_sel selector, + uint32_t element_size, void **data, size_t *elements) { OSStatus err; - AudioObjectPropertyAddress p_addr; - UInt32 p_size; + uint32_t p_size; - p_addr.mSelector = selector; - p_addr.mScope = scope; - p_addr.mElement = kAudioObjectPropertyElementMaster; + AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) { + .mSelector = selector, + .mScope = scope, + .mElement = kAudioObjectPropertyElementMaster, + }; err = AudioObjectGetPropertyDataSize(id, &p_addr, 0, NULL, &p_size); - CHECK_CA_ERROR("Can't fetch property size"); + CHECK_CA_ERROR("can't fetch property size"); *data = malloc(p_size); + *elements = p_size / element_size; - err = AudioObjectGetPropertyData(id, &p_addr, 0, NULL, &p_size, *data); - CHECK_CA_ERROR_L(coreaudio_error_free, "Can't fetch property data %s"); - - return p_size; + err = ca_get(id, scope, selector, p_size, *data); + CHECK_CA_ERROR_L(coreaudio_error_free, "can't fetch property data"); + return err; coreaudio_error_free: free(*data); coreaudio_error: - return 0; -} - -uint32_t GetGlobalAudioPropertyArray(AudioObjectID id, - AudioObjectPropertySelector selector, - void **data) -{ - return GetAudioPropertyArray(id, selector, kAudioObjectPropertyScopeGlobal, - data); + return err; } -OSStatus GetAudioPropertyString(AudioObjectID id, - AudioObjectPropertySelector selector, - char **data) +OSStatus ca_get_str(AudioObjectID id, ca_scope scope, ca_sel selector, + char **data) { - OSStatus err; - AudioObjectPropertyAddress p_addr; - UInt32 p_size = sizeof(CFStringRef); CFStringRef string; - - p_addr.mSelector = selector; - p_addr.mScope = kAudioObjectPropertyScopeGlobal; - p_addr.mElement = kAudioObjectPropertyElementMaster; - - err = AudioObjectGetPropertyData(id, &p_addr, 0, NULL, &p_size, &string); - CHECK_CA_ERROR("Can't fetch array property"); + OSStatus err = + ca_get(id, scope, selector, sizeof(CFStringRef), (void **)&string); + CHECK_CA_ERROR("Can't fetch string property"); CFIndex size = CFStringGetMaximumSizeForEncoding( @@ -97,29 +93,14 @@ coreaudio_error: return err; } -OSStatus SetAudioProperty(AudioObjectID id, - AudioObjectPropertySelector selector, - uint32_t size, void *data) +Boolean ca_settable(AudioObjectID id, ca_scope scope, ca_sel selector, + Boolean *data) { - AudioObjectPropertyAddress p_addr; - - p_addr.mSelector = selector; - p_addr.mScope = kAudioObjectPropertyScopeGlobal; - p_addr.mElement = kAudioObjectPropertyElementMaster; - - return AudioObjectSetPropertyData(id, &p_addr, 0, NULL, - size, data); -} - -Boolean IsAudioPropertySettable(AudioObjectID id, - AudioObjectPropertySelector selector, - Boolean *data) -{ - AudioObjectPropertyAddress p_addr; - - p_addr.mSelector = selector; - p_addr.mScope = kAudioObjectPropertyScopeGlobal; - p_addr.mElement = kAudioObjectPropertyElementMaster; + AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) { + .mSelector = selector, + .mScope = kAudioObjectPropertyScopeGlobal, + .mElement = kAudioObjectPropertyElementMaster, + }; return AudioObjectIsPropertySettable(id, &p_addr, data); } |