diff options
author | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2013-07-13 09:48:10 +0200 |
---|---|---|
committer | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2013-07-22 21:53:18 +0200 |
commit | 1e379655971b7d263189f5e001a0f5724a8657f7 (patch) | |
tree | 74e9c444e5cd693b9703210fca2a7caf06379576 /audio/out/ao_coreaudio_properties.c | |
parent | 5a195845e3a5b37f1081546e275858bedb85f755 (diff) | |
download | mpv-1e379655971b7d263189f5e001a0f5724a8657f7.tar.bz2 mpv-1e379655971b7d263189f5e001a0f5724a8657f7.tar.xz |
ao_coreaudio: split ao_coreaudio_common in two files
* ao_coreaudio_utils: contains several utility function
* ao_coreaudio_properties: contains functions to set and get audio object
properties.
Conflicts:
audio/out/ao_coreaudio.c
Diffstat (limited to 'audio/out/ao_coreaudio_properties.c')
-rw-r--r-- | audio/out/ao_coreaudio_properties.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/audio/out/ao_coreaudio_properties.c b/audio/out/ao_coreaudio_properties.c new file mode 100644 index 0000000000..ee6b06a153 --- /dev/null +++ b/audio/out/ao_coreaudio_properties.c @@ -0,0 +1,126 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with mpv. If not, see <http://www.gnu.org/licenses/>. + */ + +/* + * Abstractions on the CoreAudio API to make property setting/getting suck les +*/ + +#include "audio/out/ao_coreaudio_properties.h" +#include "audio/out/ao_coreaudio_utils.h" + +OSStatus ca_get(AudioObjectID id, AudioObjectPropertySelector selector, + uint32_t size, void *data) +{ + AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) { + .mSelector = selector, + .mScope = kAudioObjectPropertyScopeGlobal, + .mElement = kAudioObjectPropertyElementMaster, + }; + + return AudioObjectGetPropertyData(id, &p_addr, 0, NULL, &size, data); +} + +uint32_t GetAudioPropertyArray(AudioObjectID id, + AudioObjectPropertySelector selector, + AudioObjectPropertyScope scope, void **data) +{ + OSStatus err; + AudioObjectPropertyAddress p_addr; + UInt32 p_size; + + p_addr.mSelector = selector; + p_addr.mScope = scope; + p_addr.mElement = kAudioObjectPropertyElementMaster; + + err = AudioObjectGetPropertyDataSize(id, &p_addr, 0, NULL, &p_size); + CHECK_CA_ERROR("Can't fetch property size"); + + *data = malloc(p_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; + +coreaudio_error_free: + free(*data); +coreaudio_error: + return 0; +} + +uint32_t GetGlobalAudioPropertyArray(AudioObjectID id, + AudioObjectPropertySelector selector, + void **data) +{ + return GetAudioPropertyArray(id, selector, kAudioObjectPropertyScopeGlobal, + data); +} + +OSStatus GetAudioPropertyString(AudioObjectID id, + AudioObjectPropertySelector 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"); + + CFIndex size = + CFStringGetMaximumSizeForEncoding( + CFStringGetLength(string), CA_CFSTR_ENCODING) + 1; + + *data = malloc(size); + CFStringGetCString(string, *data, size, CA_CFSTR_ENCODING); + CFRelease(string); +coreaudio_error: + return err; +} + +OSStatus SetAudioProperty(AudioObjectID id, + AudioObjectPropertySelector selector, + uint32_t size, void *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; + + return AudioObjectIsPropertySettable(id, &p_addr, data); +} + |