diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 403a22b..e4921b5 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
struct avdtp_state_callback {
avdtp_session_state_cb cb;
+ struct audio_device *dev;
void *user_data;
unsigned int id;
};
for (l = avdtp_callbacks; l != NULL; l = l->next) {
struct avdtp_state_callback *cb = l->data;
+
+ if (dev != cb->dev)
+ continue;
+
cb->cb(dev, session, old_state, new_state, cb->user_data);
}
}
session->device_disconnect = dev_dc;
}
-unsigned int avdtp_add_state_cb(avdtp_session_state_cb cb, void *user_data)
+unsigned int avdtp_add_state_cb(struct audio_device *dev,
+ avdtp_session_state_cb cb, void *user_data)
{
struct avdtp_state_callback *state_cb;
static unsigned int id = 0;
state_cb = g_new(struct avdtp_state_callback, 1);
state_cb->cb = cb;
+ state_cb->dev = dev;
state_cb->user_data = user_data;
state_cb->id = ++id;
diff --git a/profiles/audio/avdtp.h b/profiles/audio/avdtp.h
index 8f0d7e6..437ee03 100644
--- a/profiles/audio/avdtp.h
+++ b/profiles/audio/avdtp.h
struct avdtp_remote_sep *avdtp_stream_get_remote_sep(
struct avdtp_stream *stream);
-unsigned int avdtp_add_state_cb(avdtp_session_state_cb cb, void *user_data);
+unsigned int avdtp_add_state_cb(struct audio_device *dev,
+ avdtp_session_state_cb cb, void *user_data);
gboolean avdtp_remove_state_cb(unsigned int id);
diff --git a/profiles/audio/device.c b/profiles/audio/device.c
index 2aa22bb..67ff697 100644
--- a/profiles/audio/device.c
+++ b/profiles/audio/device.c
guint dc_id;
gboolean disconnecting;
+
+ unsigned int avdtp_callback_id;
};
static unsigned int sink_callback_id = 0;
static unsigned int avctp_callback_id = 0;
-static unsigned int avdtp_callback_id = 0;
static void device_free(struct audio_device *dev)
{
if (priv->dc_id)
device_remove_disconnect_watch(dev->btd_dev,
priv->dc_id);
+
+ avdtp_remove_state_cb(priv->avdtp_callback_id);
+
g_free(priv);
}
if (sink_callback_id == 0)
sink_callback_id = sink_add_state_cb(device_sink_cb, NULL);
- if (avdtp_callback_id == 0)
- avdtp_callback_id = avdtp_add_state_cb(device_avdtp_cb, NULL);
+ dev->priv->avdtp_callback_id = avdtp_add_state_cb(dev, device_avdtp_cb,
+ NULL);
+
if (avctp_callback_id == 0)
avctp_callback_id = avctp_add_state_cb(device_avctp_cb, NULL);
diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
index 8c49961..de15eff 100644
--- a/profiles/audio/sink.c
+++ b/profiles/audio/sink.c
sink_state_t state;
unsigned int connect_id;
unsigned int disconnect_id;
+ unsigned int avdtp_callback_id;
};
struct sink_state_callback {
static GSList *sink_callbacks = NULL;
-static unsigned int avdtp_callback_id = 0;
-
static char *str_state[] = {
"SINK_STATE_DISCONNECTED",
"SINK_STATE_CONNECTING",
{
struct sink *sink = dev->sink;
- if (sink == NULL)
- return;
-
switch (new_state) {
case AVDTP_SESSION_STATE_DISCONNECTED:
sink_set_state(dev, SINK_STATE_DISCONNECTED);
if (sink->retry_id)
g_source_remove(sink->retry_id);
+ avdtp_remove_state_cb(sink->avdtp_callback_id);
+
g_free(sink);
dev->sink = NULL;
}
DBG("%s", device_get_path(dev->btd_dev));
- if (avdtp_callback_id == 0)
- avdtp_callback_id = avdtp_add_state_cb(avdtp_state_callback,
- NULL);
-
sink = g_new0(struct sink, 1);
sink->dev = dev;
+ sink->avdtp_callback_id = avdtp_add_state_cb(dev, avdtp_state_callback,
+ NULL);
+
return sink;
}
diff --git a/profiles/audio/source.c b/profiles/audio/source.c
index 3c9143c..64fbe15 100644
--- a/profiles/audio/source.c
+++ b/profiles/audio/source.c
source_state_t state;
unsigned int connect_id;
unsigned int disconnect_id;
+ unsigned int avdtp_callback_id;
};
struct source_state_callback {
static GSList *source_callbacks = NULL;
-static unsigned int avdtp_callback_id = 0;
-
static char *str_state[] = {
"SOURCE_STATE_DISCONNECTED",
"SOURCE_STATE_CONNECTING",
{
struct source *source = dev->source;
- if (source == NULL)
- return;
-
switch (new_state) {
case AVDTP_SESSION_STATE_DISCONNECTED:
source_set_state(dev, SOURCE_STATE_DISCONNECTED);
if (source->retry_id)
g_source_remove(source->retry_id);
+ avdtp_remove_state_cb(source->avdtp_callback_id);
+
g_free(source);
dev->source = NULL;
}
DBG("%s", device_get_path(dev->btd_dev));
- if (avdtp_callback_id == 0)
- avdtp_callback_id = avdtp_add_state_cb(avdtp_state_callback,
- NULL);
-
source = g_new0(struct source, 1);
source->dev = dev;
+ source->avdtp_callback_id = avdtp_add_state_cb(dev,
+ avdtp_state_callback,
+ NULL);
+
return source;
}