#include "logging.h"
#include "textfile.h"
+#include "../src/adapter.h"
+#include "../src/device.h"
#include "error.h"
#include "ipc.h"
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);
};
struct audio_device *audio_device_register(DBusConnection *conn,
+ struct btd_device *device,
const char *path, const bdaddr_t *src,
const bdaddr_t *dst)
{
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);
};
struct audio_device *audio_device_register(DBusConnection *conn,
+ struct btd_device *device,
const char *path, const bdaddr_t *src,
const bdaddr_t *dst);
GIOChannel *tmp_rfcomm;
GIOChannel *sco;
guint sco_id;
+ guint dc_id;
gboolean auto_dc;
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;
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,
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,
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;
#include <errno.h>
#include <bluetooth/bluetooth.h>
+#include <bluetooth/sdp.h>
#include <glib.h>
#include <dbus/dbus.h>
#include "error.h"
#include "sink.h"
#include "dbus-common.h"
+#include "../src/adapter.h"
+#include "../src/device.h"
#define STREAM_SETUP_RETRY_TIMER 2
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;
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;
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,
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,