OSDN Git Service

Make audio plugin to use disconnect watches.
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>
Wed, 22 Apr 2009 18:41:53 +0000 (15:41 -0300)
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>
Wed, 22 Apr 2009 18:41:53 +0000 (15:41 -0300)
audio/device.c
audio/device.h
audio/headset.c
audio/manager.c
audio/sink.c

index a1c58d2..acc679a 100644 (file)
@@ -45,6 +45,8 @@
 
 #include "logging.h"
 #include "textfile.h"
+#include "../src/adapter.h"
+#include "../src/device.h"
 
 #include "error.h"
 #include "ipc.h"
@@ -96,6 +98,8 @@ static void device_free(struct audio_device *dev)
        if (dev->conn)
                dbus_connection_unref(dev->conn);
 
+       btd_device_unref(dev->btd_dev);
+
        if (priv) {
                if (priv->control_timer)
                        g_source_remove(priv->control_timer);
@@ -535,6 +539,7 @@ static GDBusSignalTable dev_signals[] = {
 };
 
 struct audio_device *audio_device_register(DBusConnection *conn,
+                                       struct btd_device *device,
                                        const char *path, const bdaddr_t *src,
                                        const bdaddr_t *dst)
 {
@@ -545,6 +550,7 @@ struct audio_device *audio_device_register(DBusConnection *conn,
 
        dev = g_new0(struct audio_device, 1);
 
+       dev->btd_dev = btd_device_ref(device);
        dev->path = g_strdup(path);
        bacpy(&dev->dst, dst);
        bacpy(&dev->src, src);
index c9b9e76..714a8ad 100644 (file)
@@ -71,6 +71,7 @@ struct audio_device {
 };
 
 struct audio_device *audio_device_register(DBusConnection *conn,
+                                       struct btd_device *device,
                                        const char *path, const bdaddr_t *src,
                                        const bdaddr_t *dst);
 
index 9ee367c..686d727 100644 (file)
@@ -137,6 +137,7 @@ struct headset {
        GIOChannel *tmp_rfcomm;
        GIOChannel *sco;
        guint sco_id;
+       guint dc_id;
 
        gboolean auto_dc;
 
@@ -2386,6 +2387,15 @@ static int headset_close_rfcomm(struct audio_device *dev)
        return 0;
 }
 
+static void disconnect_cb(struct btd_device *btd_dev, void *user_data)
+{
+       struct audio_device *device = user_data;
+
+       info("Headset: disconnect %s", device->path);
+
+       headset_set_state(device, HEADSET_STATE_DISCONNECTED);
+}
+
 void headset_set_state(struct audio_device *dev, headset_state_t state)
 {
        struct headset *hs = dev->headset;
@@ -2418,6 +2428,7 @@ void headset_set_state(struct audio_device *dev, headset_state_t state)
 
                telephony_device_disconnected(dev);
                active_devices = g_slist_remove(active_devices, dev);
+               device_remove_disconnect_watch(dev->btd_dev, hs->dc_id);
                break;
        case HEADSET_STATE_CONNECT_IN_PROGRESS:
                emit_property_changed(dev->conn, dev->path,
@@ -2442,6 +2453,9 @@ void headset_set_state(struct audio_device *dev, headset_state_t state)
                                                DBUS_TYPE_BOOLEAN, &value);
                        active_devices = g_slist_append(active_devices, dev);
                        telephony_device_connected(dev);
+                       hs->dc_id = device_add_disconnect_watch(dev->btd_dev,
+                                                               disconnect_cb,
+                                                               dev, NULL);
                } else if (hs->state == HEADSET_STATE_PLAYING) {
                        value = FALSE;
                        g_dbus_emit_signal(dev->conn, dev->path,
index 473b576..30ad8c0 100644 (file)
@@ -1168,12 +1168,10 @@ struct audio_device *manager_get_device(const bdaddr_t *src,
 
        path = device_get_path(device);
 
-       dev = audio_device_register(connection, path, src, dst);
+       dev = audio_device_register(connection, device, path, src, dst);
        if (!dev)
                return NULL;
 
-       dev->btd_dev = device;
-
        devices = g_slist_append(devices, dev);
 
        return dev;
index 056d1a5..cab78c5 100644 (file)
@@ -30,6 +30,7 @@
 #include <errno.h>
 
 #include <bluetooth/bluetooth.h>
+#include <bluetooth/sdp.h>
 
 #include <glib.h>
 #include <dbus/dbus.h>
@@ -43,6 +44,8 @@
 #include "error.h"
 #include "sink.h"
 #include "dbus-common.h"
+#include "../src/adapter.h"
+#include "../src/device.h"
 
 #define STREAM_SETUP_RETRY_TIMER 2
 
@@ -57,6 +60,7 @@ struct sink {
        struct avdtp *session;
        struct avdtp_stream *stream;
        unsigned int cb_id;
+       guint dc_id;
        avdtp_session_state_t session_state;
        avdtp_state_t stream_state;
        sink_state_t state;
@@ -134,6 +138,8 @@ static void avdtp_state_callback(struct audio_device *dev,
                        emit_property_changed(dev->conn, dev->path,
                                        AUDIO_SINK_INTERFACE, "Connected",
                                        DBUS_TYPE_BOOLEAN, &value);
+                       device_remove_disconnect_watch(dev->btd_dev,
+                                                       sink->dc_id);
                }
                sink_set_state(dev, SINK_STATE_DISCONNECTED);
                break;
@@ -160,6 +166,16 @@ static void pending_request_free(struct audio_device *dev,
        g_free(pending);
 }
 
+static void disconnect_cb(struct btd_device *btd_dev, void *user_data)
+{
+       struct audio_device *device = user_data;
+       struct sink *sink = device->sink;
+
+       debug("Sink: disconnect %s", device->path);
+
+       avdtp_close(sink->session, sink->stream);
+}
+
 static void stream_state_changed(struct avdtp_stream *stream,
                                        avdtp_state_t old_state,
                                        avdtp_state_t new_state,
@@ -206,6 +222,9 @@ static void stream_state_changed(struct avdtp_stream *stream,
                                                AUDIO_SINK_INTERFACE,
                                                "Connected",
                                                DBUS_TYPE_BOOLEAN, &value);
+                       sink->dc_id = device_add_disconnect_watch(dev->btd_dev,
+                                                               disconnect_cb,
+                                                               dev, NULL);
                } else if (old_state == AVDTP_STATE_STREAMING) {
                        value = FALSE;
                        g_dbus_emit_signal(dev->conn, dev->path,