ao_coreaudio: extract mixmode set/unset in utility functions

This commit is contained in:
Stefano Pigozzi
2013-07-22 21:53:17 +02:00
parent 838fa07376
commit 065e446e04
2 changed files with 58 additions and 46 deletions
+7 -46
View File
@@ -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");
+51
View File
@@ -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)
{