diff --git a/profiles/audio/avctp.c b/profiles/audio/avctp.c
index e7dba37..e56885a 100644
--- a/profiles/audio/avctp.c
+++ b/profiles/audio/avctp.c
#include "adapter.h"
#include "../src/device.h"
+#include "../src/manager.h"
#include "log.h"
#include "error.h"
};
struct avctp_server {
- bdaddr_t src;
+ struct btd_adapter *adapter;
GIOChannel *control_io;
GIOChannel *browsing_io;
GSList *sessions;
struct avctp {
struct avctp_server *server;
- bdaddr_t dst;
+ struct btd_device *device;
avctp_state_t state;
if (session->uinput >= 0) {
char address[18];
- ba2str(&session->dst, address);
+ ba2str(device_get_address(session->device), address);
DBG("AVCTP: closing uinput for %s", address);
ioctl(session->uinput, UI_DEV_DESTROY);
server = session->server;
server->sessions = g_slist_remove(server->sessions, session);
+ btd_device_unref(session->device);
g_free(session);
}
struct audio_device *dev;
avctp_state_t old_state = session->state;
- dev = manager_get_device(&session->server->src, &session->dst, FALSE);
+ dev = manager_get_device(adapter_get_address(session->server->adapter),
+ device_get_address(session->device),
+ FALSE);
if (dev == NULL) {
error("%s(): No matching audio device", __func__);
return;
struct audio_device *dev;
char address[18], name[248 + 1];
- dev = manager_get_device(&session->server->src, &session->dst, FALSE);
+ dev = manager_get_device(adapter_get_address(session->server->adapter),
+ device_get_address(session->device),
+ FALSE);
device_get_name(dev->btd_dev, name, sizeof(name));
if (g_str_equal(name, "Nokia CK-20W")) {
session->key_quirks[AVC_PAUSE] |= QUIRK_NO_RELEASE;
}
- ba2str(&session->dst, address);
+ ba2str(device_get_address(session->device), address);
session->uinput = uinput_create(address);
if (session->uinput < 0)
}
}
-static struct avctp_server *find_server(GSList *list, const bdaddr_t *src)
+static struct avctp_server *find_server(GSList *list, struct btd_adapter *a)
{
for (; list; list = list->next) {
struct avctp_server *server = list->data;
- if (bacmp(&server->src, src) == 0)
+ if (server->adapter == a)
return server;
}
return NULL;
}
-static struct avctp *find_session(GSList *list, const bdaddr_t *dst)
+static struct avctp *find_session(GSList *list, struct btd_device *device)
{
for (; list != NULL; list = g_slist_next(list)) {
struct avctp *s = list->data;
- if (bacmp(dst, &s->dst))
- continue;
-
- return s;
+ if (s->device == device)
+ return s;
}
return NULL;
}
-static struct avctp *avctp_get_internal(const bdaddr_t *src,
- const bdaddr_t *dst)
+static struct avctp *avctp_get_internal(struct btd_device *device)
{
struct avctp_server *server;
struct avctp *session;
- assert(src != NULL);
- assert(dst != NULL);
-
- server = find_server(servers, src);
+ server = find_server(servers, device_get_adapter(device));
if (server == NULL)
return NULL;
- session = find_session(server->sessions, dst);
+ session = find_session(server->sessions, device);
if (session)
return session;
session = g_new0(struct avctp, 1);
session->server = server;
- bacpy(&session->dst, dst);
+ session->device = btd_device_ref(device);
session->state = AVCTP_STATE_DISCONNECTED;
server->sessions = g_slist_append(server->sessions, session);
struct avctp *session;
struct audio_device *dev;
char address[18];
- bdaddr_t src, dst;
+ bdaddr_t src;
GError *err = NULL;
uint16_t psm;
+ struct btd_device *device;
bt_io_get(chan, &err,
BT_IO_OPT_SOURCE_BDADDR, &src,
- BT_IO_OPT_DEST_BDADDR, &dst,
BT_IO_OPT_DEST, address,
BT_IO_OPT_PSM, &psm,
BT_IO_OPT_INVALID);
DBG("AVCTP: incoming connect from %s", address);
- session = avctp_get_internal(&src, &dst);
+ device = adapter_find_device(manager_find_adapter(&src), address);
+ if (!device)
+ return;
+
+ session = avctp_get_internal(device);
if (session == NULL)
return;
- dev = manager_get_device(&src, &dst, FALSE);
+ dev = manager_get_device(&src, device_get_address(device), FALSE);
if (!dev) {
- dev = manager_get_device(&src, &dst, TRUE);
+ dev = manager_get_device(&src, device_get_address(device),
+ TRUE);
if (!dev) {
error("Unable to get audio device object for %s",
address);
return io;
}
-int avctp_register(const bdaddr_t *src, gboolean master)
+int avctp_register(struct btd_adapter *adapter, gboolean master)
{
struct avctp_server *server;
+ const bdaddr_t *src = adapter_get_address(adapter);
server = g_new0(struct avctp_server, 1);
return -1;
}
- bacpy(&server->src, src);
+ server->adapter = btd_adapter_ref(adapter);
servers = g_slist_append(servers, server);
return 0;
}
-void avctp_unregister(const bdaddr_t *src)
+void avctp_unregister(struct btd_adapter *adapter)
{
struct avctp_server *server;
- server = find_server(servers, src);
+ server = find_server(servers, adapter);
if (!server)
return;
g_io_channel_shutdown(server->control_io, TRUE, NULL);
g_io_channel_unref(server->control_io);
+ btd_adapter_unref(server->adapter);
g_free(server);
}
struct avctp *session;
GError *err = NULL;
GIOChannel *io;
- const bdaddr_t *src;
- const bdaddr_t *dst;
- src = adapter_get_address(device_get_adapter(device->btd_dev));
- dst = device_get_address(device->btd_dev);
-
- session = avctp_get_internal(src, dst);
+ session = avctp_get_internal(device->btd_dev);
if (!session)
return NULL;
avctp_set_state(session, AVCTP_STATE_CONNECTING);
io = bt_io_connect(avctp_connect_cb, session, NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR, &session->server->src,
- BT_IO_OPT_DEST_BDADDR, &session->dst,
+ BT_IO_OPT_SOURCE_BDADDR,
+ adapter_get_address(session->server->adapter),
+ BT_IO_OPT_DEST_BDADDR,
+ device_get_address(session->device),
BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
BT_IO_OPT_PSM, AVCTP_CONTROL_PSM,
BT_IO_OPT_INVALID);
return 0;
io = bt_io_connect(avctp_connect_browsing_cb, session, NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR, &session->server->src,
- BT_IO_OPT_DEST_BDADDR, &session->dst,
+ BT_IO_OPT_SOURCE_BDADDR,
+ adapter_get_address(session->server->adapter),
+ BT_IO_OPT_DEST_BDADDR,
+ device_get_address(session->device),
BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
BT_IO_OPT_PSM, AVCTP_BROWSING_PSM,
BT_IO_OPT_MODE, L2CAP_MODE_ERTM,
struct avctp *avctp_get(struct audio_device *device)
{
- const bdaddr_t *src;
- const bdaddr_t *dst;
-
- src = adapter_get_address(device_get_adapter(device->btd_dev));
- dst = device_get_address(device->btd_dev);
-
- return avctp_get_internal(src, dst);
+ return avctp_get_internal(device->btd_dev);
}
diff --git a/profiles/audio/avctp.h b/profiles/audio/avctp.h
index 2597e6e..c25a3b3 100644
--- a/profiles/audio/avctp.h
+++ b/profiles/audio/avctp.h
unsigned int avctp_add_state_cb(avctp_state_cb cb, void *user_data);
gboolean avctp_remove_state_cb(unsigned int id);
-int avctp_register(const bdaddr_t *src, gboolean master);
-void avctp_unregister(const bdaddr_t *src);
+int avctp_register(struct btd_adapter *adapter, gboolean master);
+void avctp_unregister(struct btd_adapter *adapter);
struct avctp *avctp_connect(struct audio_device *device);
struct avctp *avctp_get(struct audio_device *device);
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 668cd87..4e3d31d 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
}
server->ct_record_id = record->handle;
- if (avctp_register(adapter_get_address(adapter), master) < 0) {
+ if (avctp_register(adapter, master) < 0) {
remove_record_from_server(server->ct_record_id);
remove_record_from_server(server->tg_record_id);
g_free(server);
remove_record_from_server(server->ct_record_id);
remove_record_from_server(server->tg_record_id);
- avctp_unregister(adapter_get_address(server->adapter));
+ avctp_unregister(server->adapter);
btd_adapter_unref(server->adapter);
g_free(server);