Commit 1fcf09a8 authored by Max Kellermann's avatar Max Kellermann

mixer_control: close mixer on failure

When getting or setting the volume fails, the MPD core close the mixer. Moved the duplicated code from the mixer plugins.
parent 617a4fd2
......@@ -162,7 +162,6 @@ alsa_mixer_get_volume(struct mixer *mixer)
if (err < 0) {
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
snd_strerror(err), "handle_events");
alsa_mixer_close(mixer);
return false;
}
......@@ -172,7 +171,6 @@ alsa_mixer_get_volume(struct mixer *mixer)
if (err < 0) {
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
snd_strerror(err), "selem_get_playback_volume");
alsa_mixer_close(mixer);
return false;
}
......@@ -216,7 +214,6 @@ alsa_mixer_set_volume(struct mixer *mixer, unsigned volume)
if (err < 0) {
g_warning("problems setting alsa volume: %s\n",
snd_strerror(err));
alsa_mixer_close(mixer);
return false;
}
......
......@@ -150,7 +150,6 @@ oss_mixer_get_volume(struct mixer *mixer)
ret = ioctl(om->device_fd, MIXER_READ(om->volume_control), &level);
if (ret < 0) {
oss_mixer_close(mixer);
g_warning("unable to read oss volume\n");
return false;
}
......@@ -184,7 +183,6 @@ oss_mixer_set_volume(struct mixer *mixer, unsigned volume)
ret = ioctl(om->device_fd, MIXER_WRITE(om->volume_control), &level);
if (ret < 0) {
g_warning("unable to set oss volume\n");
oss_mixer_close(mixer);
return false;
}
......
......@@ -110,6 +110,18 @@ mixer_auto_close(struct mixer *mixer)
mixer_close(mixer);
}
/*
* Close the mixer due to failure. The mutex must be locked before
* calling this function.
*/
static void
mixer_failed(struct mixer *mixer)
{
assert(mixer->open);
mixer_close(mixer);
}
int
mixer_get_volume(struct mixer *mixer)
{
......@@ -124,6 +136,8 @@ mixer_get_volume(struct mixer *mixer)
if (mixer->open) {
volume = mixer->plugin->get_volume(mixer);
if (volume < 0)
mixer_failed(mixer);
} else
volume = -1;
......@@ -146,6 +160,8 @@ mixer_set_volume(struct mixer *mixer, unsigned volume)
if (mixer->open) {
success = mixer->plugin->set_volume(mixer, volume);
if (!success)
mixer_failed(mixer);
} else
success = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment