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.
This commit is contained in:
@@ -162,7 +162,6 @@ alsa_mixer_get_volume(struct mixer *mixer)
|
|||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
|
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
|
||||||
snd_strerror(err), "handle_events");
|
snd_strerror(err), "handle_events");
|
||||||
alsa_mixer_close(mixer);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,7 +171,6 @@ alsa_mixer_get_volume(struct mixer *mixer)
|
|||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
|
g_warning("problems getting alsa volume: %s (snd_mixer_%s)\n",
|
||||||
snd_strerror(err), "selem_get_playback_volume");
|
snd_strerror(err), "selem_get_playback_volume");
|
||||||
alsa_mixer_close(mixer);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +214,6 @@ alsa_mixer_set_volume(struct mixer *mixer, unsigned volume)
|
|||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
g_warning("problems setting alsa volume: %s\n",
|
g_warning("problems setting alsa volume: %s\n",
|
||||||
snd_strerror(err));
|
snd_strerror(err));
|
||||||
alsa_mixer_close(mixer);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -150,7 +150,6 @@ oss_mixer_get_volume(struct mixer *mixer)
|
|||||||
|
|
||||||
ret = ioctl(om->device_fd, MIXER_READ(om->volume_control), &level);
|
ret = ioctl(om->device_fd, MIXER_READ(om->volume_control), &level);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
oss_mixer_close(mixer);
|
|
||||||
g_warning("unable to read oss volume\n");
|
g_warning("unable to read oss volume\n");
|
||||||
return false;
|
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);
|
ret = ioctl(om->device_fd, MIXER_WRITE(om->volume_control), &level);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
g_warning("unable to set oss volume\n");
|
g_warning("unable to set oss volume\n");
|
||||||
oss_mixer_close(mixer);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -110,6 +110,18 @@ mixer_auto_close(struct mixer *mixer)
|
|||||||
mixer_close(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
|
int
|
||||||
mixer_get_volume(struct mixer *mixer)
|
mixer_get_volume(struct mixer *mixer)
|
||||||
{
|
{
|
||||||
@@ -124,6 +136,8 @@ mixer_get_volume(struct mixer *mixer)
|
|||||||
|
|
||||||
if (mixer->open) {
|
if (mixer->open) {
|
||||||
volume = mixer->plugin->get_volume(mixer);
|
volume = mixer->plugin->get_volume(mixer);
|
||||||
|
if (volume < 0)
|
||||||
|
mixer_failed(mixer);
|
||||||
} else
|
} else
|
||||||
volume = -1;
|
volume = -1;
|
||||||
|
|
||||||
@@ -146,6 +160,8 @@ mixer_set_volume(struct mixer *mixer, unsigned volume)
|
|||||||
|
|
||||||
if (mixer->open) {
|
if (mixer->open) {
|
||||||
success = mixer->plugin->set_volume(mixer, volume);
|
success = mixer->plugin->set_volume(mixer, volume);
|
||||||
|
if (!success)
|
||||||
|
mixer_failed(mixer);
|
||||||
} else
|
} else
|
||||||
success = false;
|
success = false;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user