From 40f6e2e041b7c0d690b1a22d4bb706feef991022 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Tue, 25 Jun 2013 08:24:14 +0200 Subject: ao_coreaudio: extract methods to lock/unlock device for digital output --- audio/out/ao_coreaudio.c | 35 +++++++---------------------------- audio/out/ao_coreaudio_common.c | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index ff4fb62602..a633849aca 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -431,16 +431,8 @@ static int init_digital(struct ao *ao, AudioStreamBasicDescription asbd) p->b_digital = 1; - d->i_hog_pid = getpid(); - - err = SetAudioProperty(p->i_selected_dev, - kAudioDevicePropertyHogMode, - sizeof(d->i_hog_pid), &d->i_hog_pid); - - if (! CHECK_CA_WARN("faild to set hogmode")) { - d->i_hog_pid = -1; - goto coreaudio_error; - } + err = ca_lock_device(p->i_selected_dev, &d->i_hog_pid); + CHECK_CA_ERROR("faild to set hogmode"); p_addr = (AudioObjectPropertyAddress) { .mSelector = kAudioDevicePropertySupportsMixing, @@ -586,15 +578,8 @@ static int init_digital(struct ao *ao, AudioStreamBasicDescription asbd) return CONTROL_TRUE; coreaudio_error: - if (d->i_hog_pid == getpid()) { - d->i_hog_pid = -1; - err = SetAudioProperty(p->i_selected_dev, - kAudioDevicePropertyHogMode, - sizeof(d->i_hog_pid), &d->i_hog_pid); - if (err != noErr) - ca_msg(MSGL_WARN, "Could not release hogmode: [%4.4s]\n", - (char *)&err); - } + err = ca_unlock_device(p->i_selected_dev, &d->i_hog_pid); + CHECK_CA_WARN("can't release hog mode"); return CONTROL_FALSE; } @@ -793,15 +778,9 @@ static void uninit(struct ao *ao, bool immed) ca_msg(MSGL_WARN, "failed to set mixmode: [%4.4s]\n", (char *)&err); } - if (d->i_hog_pid == getpid()) { - d->i_hog_pid = -1; - err = SetAudioProperty(p->i_selected_dev, - kAudioDevicePropertyHogMode, - sizeof(d->i_hog_pid), &d->i_hog_pid); - if (err != noErr) - ca_msg(MSGL_WARN, - "Could not release hogmode: [%4.4s]\n", (char *)&err); - } + + err = ca_unlock_device(p->i_selected_dev, &d->i_hog_pid); + CHECK_CA_WARN("can't release hog mode"); } } diff --git a/audio/out/ao_coreaudio_common.c b/audio/out/ao_coreaudio_common.c index 1755004f3f..289fa93b64 100644 --- a/audio/out/ao_coreaudio_common.c +++ b/audio/out/ao_coreaudio_common.c @@ -310,3 +310,22 @@ static OSStatus ca_device_listener(AudioObjectID object, uint32_t n_addresses, return ca_property_listener(kAudioDevicePropertyDeviceHasChanged, object, n_addresses, addresses, data); } + +static OSStatus ca_lock_device(AudioDeviceID device, pid_t *pid) { + *pid = getpid(); + OSStatus err = SetAudioProperty(device, kAudioDevicePropertyHogMode, + sizeof(*pid), pid); + if (err != noErr) + *pid = -1; + + return err; +} + +static OSStatus ca_unlock_device(AudioDeviceID device, pid_t *pid) { + if (*pid == getpid()) { + *pid = -1; + return SetAudioProperty(device, kAudioDevicePropertyHogMode, + sizeof(*pid), &pid); + } + return noErr; +} -- cgit v1.2.3