summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_coreaudio_properties.c
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2013-07-13 13:01:50 +0200
committerStefano Pigozzi <stefano.pigozzi@gmail.com>2013-07-22 21:53:18 +0200
commit18777ecfe894ec9c7995a69e0786e56f45bc73f8 (patch)
tree70af9d9a5ffe4960a8b1241953dcd5b08513e614 /audio/out/ao_coreaudio_properties.c
parent1ed117563613b0ddaa2a9c598acc632a707b9cc2 (diff)
downloadmpv-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.c99
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);
}