summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-10-09 15:00:09 +0200
committerJohan Hedberg <johan.hedberg@nokia.com>2008-10-09 15:13:28 +0200
commit17541956196b13ee083852fd4124cd8cfd0928a4 (patch)
treecc258c9f0ff98572036eea7879e79fb443053913 /audio
parent548026e08bd9b83b3685d515a916e2cf674184f3 (diff)
Add mechanism for adding new UUIDs from the driver side
With this patch drivers can notify the core daemon that a device supports some UUID. This is useful in case we don't have a service record for a profile which the remote device initiates a connection for.
Diffstat (limited to 'audio')
-rw-r--r--audio/avdtp.c10
-rw-r--r--audio/control.c2
-rw-r--r--audio/manager.c51
-rw-r--r--audio/manager.h3
4 files changed, 32 insertions, 34 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c
index 1c6f8e67..affc7fe7 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -42,7 +42,9 @@
#include "logging.h"
-#include "adapter.h"
+#include "../src/adapter.h"
+#include "../src/device.h"
+
#include "device.h"
#include "manager.h"
#include "control.h"
@@ -1061,7 +1063,7 @@ static gboolean avdtp_setconf_cmd(struct avdtp *session,
}
avdtp_get_peers(session, &src, &dst);
- dev = manager_get_device(&src, &dst, NULL);
+ dev = manager_get_device(&src, &dst);
if (!dev) {
error("Unable to get a audio device object");
goto failed;
@@ -1070,7 +1072,7 @@ static gboolean avdtp_setconf_cmd(struct avdtp *session,
switch (sep->info.type) {
case AVDTP_SEP_TYPE_SOURCE:
if (!dev->sink)
- dev->sink = sink_init(dev);
+ btd_device_add_uuid(dev->btd_dev, A2DP_SINK_UUID);
break;
case AVDTP_SEP_TYPE_SINK:
/* Do source_init() here when it's implemented */
@@ -2804,7 +2806,7 @@ static void avdtp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,
goto drop;
}
- dev = manager_get_device(src, dst, NULL);
+ dev = manager_get_device(src, dst);
if (!dev) {
error("Unable to get audio device object for %s", address);
goto drop;
diff --git a/audio/control.c b/audio/control.c
index 8b3b2d8a..c8480197 100644
--- a/audio/control.c
+++ b/audio/control.c
@@ -686,7 +686,7 @@ static void avctp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,
goto drop;
}
- dev = manager_get_device(src, dst, NULL);
+ dev = manager_get_device(src, dst);
if (!dev) {
error("Unable to get audio device object for %s", address);
goto drop;
diff --git a/audio/manager.c b/audio/manager.c
index bb7a457a..a73d7e0c 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -476,12 +476,12 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src,
svclass = HANDSFREE_SVCLASS_ID;
}
- device = manager_get_device(src, dst, NULL);
+ device = manager_get_device(src, dst);
if (!device)
goto drop;
if (!device->headset)
- device->headset = headset_init(device, svclass, remote_uuid);
+ btd_device_add_uuid(device->btd_dev, remote_uuid);
if (headset_get_state(device) > HEADSET_STATE_DISCONNECTED) {
debug("Refusing new connection since one already exists");
@@ -666,21 +666,18 @@ static int gateway_server_init(struct audio_adapter *adapter)
static int audio_probe(struct btd_device *device, GSList *uuids)
{
struct btd_adapter *adapter = device_get_adapter(device);
- const gchar *path = device_get_path(device);
bdaddr_t src, dst;
struct audio_device *audio_dev;
adapter_get_address(adapter, &src);
device_get_address(device, &dst);
- audio_dev = manager_get_device(&src, &dst, path);
+ audio_dev = manager_get_device(&src, &dst);
if (!audio_dev) {
debug("audio_probe: unable to get a device object");
return -1;
}
- audio_dev->btd_dev = device;
-
g_slist_foreach(uuids, (GFunc) handle_uuid, audio_dev);
return 0;
@@ -1048,44 +1045,44 @@ struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interf
}
struct audio_device *manager_get_device(const bdaddr_t *src,
- const bdaddr_t *dst,
- const char *path)
+ const bdaddr_t *dst)
{
struct audio_device *dev;
+ struct btd_adapter *adapter;
+ struct btd_device *device;
+ char addr[18];
+ const char *path;
dev = manager_find_device(dst, NULL, FALSE);
if (dev)
return dev;
- if (!path) {
- struct btd_adapter *adapter;
- struct btd_device *device;
- char addr[18];
- ba2str(src, addr);
+ ba2str(src, addr);
- adapter = manager_find_adapter(src);
- if (!adapter) {
- error("Unable to get a btd_adapter object for %s",
- addr);
- return NULL;
- }
+ adapter = manager_find_adapter(src);
+ if (!adapter) {
+ error("Unable to get a btd_adapter object for %s",
+ addr);
+ return NULL;
+ }
- ba2str(dst, addr);
+ ba2str(dst, addr);
- device = adapter_get_device(connection, adapter, addr);
- if (!device) {
- error("Unable to get btd_device object for %s", addr);
- return NULL;
- }
-
- path = device_get_path(device);
+ device = adapter_get_device(connection, adapter, addr);
+ if (!device) {
+ error("Unable to get btd_device object for %s", addr);
+ return NULL;
}
+ path = device_get_path(device);
+
dev = device_register(connection, path, src, dst);
if (!dev)
return NULL;
+ dev->btd_dev = device;
+
devices = g_slist_append(devices, dev);
return dev;
diff --git a/audio/manager.h b/audio/manager.h
index 3d712f41..3af580ff 100644
--- a/audio/manager.h
+++ b/audio/manager.h
@@ -39,5 +39,4 @@ struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interf
gboolean connected);
struct audio_device *manager_get_device(const bdaddr_t *src,
- const bdaddr_t *dst,
- const char *path);
+ const bdaddr_t *dst);