From c4f895daf4bcfcda2ea892896f999911f37cec26 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Fri, 23 Oct 2009 10:32:25 +0200
Subject: mixer_plugin: get_volume() may return -1 if unavailable

If the method get_volume() returns -1 and no error object is set, then
the volume is currently unavailable, but the mixer should not be
closed immediately.
---
 src/mixer_control.c | 8 ++++++--
 src/mixer_plugin.h  | 4 ++--
 2 files changed, 8 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/mixer_control.c b/src/mixer_control.c
index 7def51cb2..7a8ba48e4 100644
--- a/src/mixer_control.c
+++ b/src/mixer_control.c
@@ -140,9 +140,13 @@ mixer_get_volume(struct mixer *mixer, GError **error_r)
 	g_mutex_lock(mixer->mutex);
 
 	if (mixer->open) {
-		volume = mixer->plugin->get_volume(mixer, error_r);
-		if (volume < 0)
+		GError *error = NULL;
+
+		volume = mixer->plugin->get_volume(mixer, &error);
+		if (volume < 0 && error != NULL) {
+			g_propagate_error(error_r, error);
 			mixer_failed(mixer);
+		}
 	} else
 		volume = -1;
 
diff --git a/src/mixer_plugin.h b/src/mixer_plugin.h
index 648c3280c..b6e67e8ff 100644
--- a/src/mixer_plugin.h
+++ b/src/mixer_plugin.h
@@ -72,8 +72,8 @@ struct mixer_plugin {
 	 *
 	 * @param error_r location to store the error occuring, or
 	 * NULL to ignore errors
-	 * @return the current volume (0..100 including) or -1 on
-	 * error
+	 * @return the current volume (0..100 including) or -1 if
+	 * unavailable or on error (error_r set, mixer will be closed)
 	 */
 	int (*get_volume)(struct mixer *mixer, GError **error_r);
 
-- 
cgit v1.2.3