aboutsummaryrefslogtreecommitdiffstats
path: root/src/mixer_control.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mixer_control.c')
-rw-r--r--src/mixer_control.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/mixer_control.c b/src/mixer_control.c
index 4e86a9aa2..cb3c2a87e 100644
--- a/src/mixer_control.c
+++ b/src/mixer_control.c
@@ -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;