This fixes a bug where pulseaudio would give up the device (due to
a request from JACK), but then immediately grab it again because
the monitor callback fired, telling that the device is now available.

(Note: the protocol does not specify a timeout, i e if pulseaudio
is requested to give its device up but JACK does not grab the dbus name,
at what point is PulseAudio allowed to re-grab it?)

Signed-off-by: David Henningsson <[email protected]>
---
 src/modules/reserve-monitor.c |   30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

Will commit this to stable-3.x and master in a few days if there are
no objections.

@Lennart, would you mind committing this to the upstream reserve.git repo as 
well?

diff --git a/src/modules/reserve-monitor.c b/src/modules/reserve-monitor.c
index ab453e6..ac74849 100644
--- a/src/modules/reserve-monitor.c
+++ b/src/modules/reserve-monitor.c
@@ -59,6 +59,23 @@ struct rm_monitor {
        "member='NameOwnerChanged',"            \
        "arg0='%s'"
 
+/* If we ourselves own the device, then don't consider this 'busy' */
+static unsigned is_really_busy(
+       DBusConnection *c,
+       const char *name) {
+
+       const char *un;
+
+       if (!name || !(*name))
+               return FALSE;
+
+       if ((un = dbus_bus_get_unique_name(c)))
+               if (strcmp(name, un) == 0)
+                       return FALSE;
+
+       return TRUE;
+}
+
 static DBusHandlerResult filter_handler(
        DBusConnection *c,
        DBusMessage *s,
@@ -85,18 +102,9 @@ static DBusHandlerResult filter_handler(
                        goto invalid;
 
                if (strcmp(name, m->service_name) == 0) {
-                       m->busy = !!(new && *new);
-
-                       /* If we ourselves own the device, then don't consider 
this 'busy' */
-                       if (m->busy) {
-                               const char *un;
-
-                               if ((un = dbus_bus_get_unique_name(c)))
-                                       if (strcmp(new, un) == 0)
-                                               m->busy = FALSE;
-                       }
+                       m->busy = is_really_busy(c, new);
 
-                       if (m->change_cb) {
+                       if (m->change_cb && (is_really_busy(c, old) || 
m->busy)) {
                                m->ref++;
                                m->change_cb(m);
                                rm_release(m);
-- 
1.7.9.5

_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to