diff --git a/profiles/audio/device.c b/profiles/audio/device.c
index bca4bbd..907221d 100644
--- a/profiles/audio/device.c
+++ b/profiles/audio/device.c
unsigned int avdtp_callback_id;
unsigned int avctp_callback_id;
+ unsigned int sink_callback_id;
};
-static unsigned int sink_callback_id = 0;
-
static void device_free(struct audio_device *dev)
{
struct dev_priv *priv = dev->priv;
avdtp_remove_state_cb(priv->avdtp_callback_id);
avctp_remove_state_cb(priv->avctp_callback_id);
+ sink_remove_state_cb(priv->sink_callback_id);
g_free(priv);
}
dev->priv = g_new0(struct dev_priv, 1);
dev->priv->state = AUDIO_STATE_DISCONNECTED;
- if (sink_callback_id == 0)
- sink_callback_id = sink_add_state_cb(device_sink_cb, NULL);
-
+ dev->priv->sink_callback_id = sink_add_state_cb(dev, device_sink_cb,
+ NULL);
dev->priv->avdtp_callback_id = avdtp_add_state_cb(dev, device_avdtp_cb);
dev->priv->avctp_callback_id = avctp_add_state_cb(dev, device_avctp_cb);
diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
index 2bbd9ee..f023307 100644
--- a/profiles/audio/sink.c
+++ b/profiles/audio/sink.c
struct sink_state_callback {
sink_state_cb cb;
+ struct audio_device *dev;
void *user_data;
unsigned int id;
};
for (l = sink_callbacks; l != NULL; l = l->next) {
struct sink_state_callback *cb = l->data;
+
+ if (cb->dev != dev)
+ continue;
+
cb->cb(dev, old_state, new_state, cb->user_data);
}
return avdtp_close(sink->session, sink->stream, FALSE);
}
-unsigned int sink_add_state_cb(sink_state_cb cb, void *user_data)
+unsigned int sink_add_state_cb(struct audio_device *dev, sink_state_cb cb,
+ void *user_data)
{
struct sink_state_callback *state_cb;
static unsigned int id = 0;
state_cb = g_new(struct sink_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/sink.h b/profiles/audio/sink.h
index fc7ed92..ba0dde8 100644
--- a/profiles/audio/sink.h
+++ b/profiles/audio/sink.h
sink_state_t new_state,
void *user_data);
-unsigned int sink_add_state_cb(sink_state_cb cb, void *user_data);
+unsigned int sink_add_state_cb(struct audio_device *dev, sink_state_cb cb,
+ void *user_data);
gboolean sink_remove_state_cb(unsigned int id);
struct sink *sink_init(struct audio_device *dev);
diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 32ba50b..98106a2 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
{
struct media_transport *transport = user_data;
- if (dev != transport->device)
- return;
-
if (new_state == SINK_STATE_PLAYING)
transport_update_playing(transport, TRUE);
else
if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0) {
a2dp->volume = -1;
- transport->sink_watch = sink_add_state_cb(
+ transport->sink_watch = sink_add_state_cb(device,
sink_state_changed,
transport);
} else {