summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2013-06-26 19:24:14 +0200
committerStefano Pigozzi <stefano.pigozzi@gmail.com>2013-07-22 21:53:17 +0200
commit065e446e040b679cb70ab20a31d9bd17385f75ce (patch)
tree5b3d5d0edb879c84f60469cb90d6d7eb2aff9fcd /audio
parent838fa07376e3b6c34c2a75535d9f29b9eb1b0db5 (diff)
downloadmpv-065e446e040b679cb70ab20a31d9bd17385f75ce.tar.bz2
mpv-065e446e040b679cb70ab20a31d9bd17385f75ce.tar.xz
ao_coreaudio: extract mixmode set/unset in utility functions
Diffstat (limited to 'audio')
-rw-r--r--audio/out/ao_coreaudio.c53
-rw-r--r--audio/out/ao_coreaudio_common.c51
2 files changed, 58 insertions, 46 deletions
diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c
index 4d11f40d51..32521b4ccf 100644
--- a/audio/out/ao_coreaudio.c
+++ b/audio/out/ao_coreaudio.c
@@ -58,7 +58,7 @@ struct priv_d {
AudioStreamID i_stream_id; /* The StreamID that has a cac3 streamformat */
int i_stream_index; /* The index of i_stream_id in an AudioBufferList */
AudioStreamBasicDescription stream_format; /* The format we changed the stream to */
- int b_changed_mixing; /* Whether we need to set the mixing mode back */
+ bool changed_mixing; /* Whether we need to set the mixing mode back */
int b_stream_format_changed; /* Flag for main thread to reset stream's format to digital and reset buffer */
int b_muted; /* Are we muted in digital mode? */
};
@@ -257,7 +257,7 @@ static int init(struct ao *ao, char *params)
.i_hog_pid = -1,
.i_stream_id = 0,
.i_stream_index = -1,
- .b_changed_mixing = 0,
+ .changed_mixing = false,
};
p->digital = d;
@@ -431,31 +431,10 @@ static int init_digital(struct ao *ao, AudioStreamBasicDescription asbd)
p->b_digital = 1;
err = ca_lock_device(p->i_selected_dev, &d->i_hog_pid);
- CHECK_CA_ERROR("faild to set hogmode");
+ CHECK_CA_WARN("failed to set hogmode");
- p_addr = (AudioObjectPropertyAddress) {
- .mSelector = kAudioDevicePropertySupportsMixing,
- .mScope = kAudioObjectPropertyScopeGlobal,
- .mElement = kAudioObjectPropertyElementMaster,
- };
-
- /* Set mixable to false if we are allowed to. */
- if (AudioObjectHasProperty(p->i_selected_dev, &p_addr)) {
- Boolean b_writeable = 0;
-
- err = IsAudioPropertySettable(p->i_selected_dev,
- kAudioDevicePropertySupportsMixing,
- &b_writeable);
-
- if (b_writeable) {
- uint32_t mix = 0;
- err = SetAudioProperty(p->i_selected_dev,
- kAudioDevicePropertySupportsMixing,
- sizeof(uint32_t), &mix);
- CHECK_CA_ERROR("failed to set mixmode");
- d->b_changed_mixing = 1;
- }
- }
+ err = ca_disable_mixing(p->i_selected_dev, &d->changed_mixing);
+ CHECK_CA_WARN("failed to disable mixing");
AudioStreamID *streams = NULL;
/* Get a list of all the streams on this device. */
@@ -672,26 +651,8 @@ static void uninit(struct ao *ao, bool immed)
ca_msg(MSGL_WARN,
"AudioDeviceRemoveIOProc failed: [%4.4s]\n", (char *)&err);
- if (d->b_changed_mixing) {
- UInt32 b_mix;
- Boolean b_writeable = 0;
- /* Revert mixable to true if we are allowed to. */
- err = IsAudioPropertySettable(p->i_selected_dev,
- kAudioDevicePropertySupportsMixing,
- &b_writeable);
- err = GetAudioProperty(p->i_selected_dev,
- kAudioDevicePropertySupportsMixing,
- sizeof(UInt32), &b_mix);
- if (err == noErr && b_writeable) {
- b_mix = 1;
- err = SetAudioProperty(p->i_selected_dev,
- kAudioDevicePropertySupportsMixing,
- sizeof(UInt32), &b_mix);
- }
- if (err != noErr)
- ca_msg(MSGL_WARN, "failed to set mixmode: [%4.4s]\n",
- (char *)&err);
- }
+ err = ca_enable_mixing(p->i_selected_dev, d->changed_mixing);
+ CHECK_CA_WARN("can't re-enable mixing");
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 c6c56c0323..15281fea01 100644
--- a/audio/out/ao_coreaudio_common.c
+++ b/audio/out/ao_coreaudio_common.c
@@ -331,6 +331,57 @@ static OSStatus ca_unlock_device(AudioDeviceID device, pid_t *pid) {
return noErr;
}
+static OSStatus ca_change_mixing(AudioDeviceID device, uint32_t val,
+ bool *changed) {
+ *changed = false;
+
+ AudioObjectPropertyAddress p_addr = (AudioObjectPropertyAddress) {
+ .mSelector = kAudioDevicePropertySupportsMixing,
+ .mScope = kAudioObjectPropertyScopeGlobal,
+ .mElement = kAudioObjectPropertyElementMaster,
+ };
+
+ if (AudioObjectHasProperty(device, &p_addr)) {
+ OSStatus err;
+ Boolean writeable = 0;
+ err = IsAudioPropertySettable(device, kAudioDevicePropertySupportsMixing,
+ &writeable);
+
+ if (!CHECK_CA_WARN("can't tell if mixing property is settable")) {
+ return err;
+ }
+
+ if (!writeable)
+ return noErr;
+
+ err = SetAudioProperty(device, kAudioDevicePropertySupportsMixing,
+ sizeof(uint32_t), &val);
+ if (err != noErr)
+ return err;
+
+ if (!CHECK_CA_WARN("can't set mix mode")) {
+ return err;
+ }
+
+ *changed = true;
+ }
+
+ return noErr;
+}
+
+static OSStatus ca_disable_mixing(AudioDeviceID device, bool *changed) {
+ return ca_change_mixing(device, 0, changed);
+}
+
+static OSStatus ca_enable_mixing(AudioDeviceID device, bool changed) {
+ if (changed) {
+ bool dont_care = false;
+ return ca_change_mixing(device, 1, &dont_care);
+ }
+
+ return noErr;
+}
+
static int AudioStreamChangeFormat(AudioStreamID i_stream_id,
AudioStreamBasicDescription change_format)
{