#include "lib/uuid.h"
#include "../src/adapter.h"
#include "../src/device.h"
+#include "../src/profile.h"
+#include "../src/service.h"
#include "log.h"
#include "error.h"
struct control {
struct avctp *session;
- gboolean target;
+ struct btd_service *target;
+ struct btd_service *remote;
unsigned int avctp_id;
};
avctp_remove_state_cb(control->avctp_id);
+ if (control->target)
+ btd_service_unref(control->target);
+
+ if (control->remote)
+ btd_service_unref(control->remote);
+
g_free(control);
dev->control = NULL;
}
AUDIO_CONTROL_INTERFACE);
}
-void control_update(struct control *control, const char *uuid)
+void control_update(struct control *control, struct btd_service *service)
{
- if (bt_uuid_strcmp(uuid, AVRCP_TARGET_UUID) == 0)
- control->target = TRUE;
+ struct btd_profile *p = btd_service_get_profile(service);
+ const char *uuid = p->remote_uuid;
+
+ if (!control->target && bt_uuid_strcmp(uuid, AVRCP_TARGET_UUID) == 0)
+ control->target = btd_service_ref(service);
+ else if (!control->remote &&
+ bt_uuid_strcmp(uuid, AVRCP_REMOTE_UUID) == 0)
+ control->remote = btd_service_ref(service);
}
-struct control *control_init(struct audio_device *dev, const char *uuid)
+struct control *control_init(struct audio_device *dev,
+ struct btd_service *service)
{
struct control *control;
control = g_new0(struct control, 1);
- control_update(control, uuid);
+ control_update(control, service);
control->avctp_id = avctp_add_state_cb(dev, state_changed);
#define AUDIO_CONTROL_INTERFACE "org.bluez.MediaControl1"
-struct control *control_init(struct audio_device *dev, const char *uuid);
-void control_update(struct control *control, const char *uuid);
+struct btd_service;
+
+struct control *control_init(struct audio_device *dev,
+ struct btd_service *service);
+void control_update(struct control *control, struct btd_service *service);
void control_unregister(struct audio_device *dev);
gboolean control_is_active(struct audio_device *dev);
return -1;
}
- audio_dev->source = source_init(audio_dev);
+ audio_dev->source = source_init(audio_dev, service);
return 0;
}
return -1;
}
- audio_dev->sink = sink_init(audio_dev);
+ audio_dev->sink = sink_init(audio_dev, service);
return 0;
}
static int avrcp_probe(struct btd_service *service)
{
struct btd_device *device = btd_service_get_device(service);
- struct btd_profile *p = btd_service_get_profile(service);
struct audio_device *audio_dev;
audio_dev = get_audio_dev(device);
}
if (audio_dev->control)
- control_update(audio_dev->control, p->remote_uuid);
+ control_update(audio_dev->control, service);
else
- audio_dev->control = control_init(audio_dev, p->remote_uuid);
+ audio_dev->control = control_init(audio_dev, service);
if (audio_dev->sink && sink_is_active(audio_dev))
avrcp_connect(audio_dev);
#include "../src/adapter.h"
#include "../src/device.h"
+#include "../src/service.h"
#include "device.h"
#include "avdtp.h"
struct sink {
struct audio_device *dev;
+ struct btd_service *service;
struct avdtp *session;
struct avdtp_stream *stream;
unsigned int cb_id;
g_source_remove(sink->retry_id);
avdtp_remove_state_cb(sink->avdtp_callback_id);
+ btd_service_unref(sink->service);
g_free(sink);
dev->sink = NULL;
sink_free(dev);
}
-struct sink *sink_init(struct audio_device *dev)
+struct sink *sink_init(struct audio_device *dev, struct btd_service *service)
{
struct sink *sink;
sink = g_new0(struct sink, 1);
sink->dev = dev;
+ sink->service = btd_service_ref(service);
sink->avdtp_callback_id = avdtp_add_state_cb(dev, avdtp_state_callback);
sink_state_t new_state,
void *user_data);
+struct btd_service;
+
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);
+struct sink *sink_init(struct audio_device *dev, struct btd_service *service);
void sink_unregister(struct audio_device *dev);
gboolean sink_is_active(struct audio_device *dev);
int sink_connect(struct audio_device *dev);
#include "../src/adapter.h"
#include "../src/device.h"
+#include "../src/service.h"
#include "device.h"
#include "avdtp.h"
struct source {
struct audio_device *dev;
+ struct btd_service *service;
struct avdtp *session;
struct avdtp_stream *stream;
unsigned int cb_id;
g_source_remove(source->retry_id);
avdtp_remove_state_cb(source->avdtp_callback_id);
+ btd_service_unref(source->service);
g_free(source);
dev->source = NULL;
source_free(dev);
}
-struct source *source_init(struct audio_device *dev)
+struct source *source_init(struct audio_device *dev,
+ struct btd_service *service)
{
struct source *source;
source = g_new0(struct source, 1);
source->dev = dev;
+ source->service = btd_service_ref(service);
source->avdtp_callback_id = avdtp_add_state_cb(dev,
avdtp_state_callback);
source_state_t new_state,
void *user_data);
+struct btd_service;
+
unsigned int source_add_state_cb(struct audio_device *dev, source_state_cb cb,
void *user_data);
gboolean source_remove_state_cb(unsigned int id);
-struct source *source_init(struct audio_device *dev);
+struct source *source_init(struct audio_device *dev,
+ struct btd_service *service);
void source_unregister(struct audio_device *dev);
int source_connect(struct audio_device *dev);
gboolean source_new_stream(struct audio_device *dev, struct avdtp *session,