summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>2010-12-02 14:11:13 +0200
committerLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>2011-03-14 13:36:55 -0300
commit8c982a4afece524fec5d928425477f3e7a56b817 (patch)
tree6040913f80d46e290b4083bd25f713b2ef6e7957
parentdda564f50b55340ff4bfbaa8d6d6fc6427f764f4 (diff)
bluetooth: handle Acquire API change
Acquire now return input and output MTU of the file descriptor so it is no longer necessary to get those after acquiring the fd, which less round trips and faster response time when switching profiles.
-rw-r--r--src/modules/bluetooth/bluetooth-util.c11
-rw-r--r--src/modules/bluetooth/bluetooth-util.h2
-rw-r--r--src/modules/bluetooth/module-bluetooth-device.c46
3 files changed, 12 insertions, 47 deletions
diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index e6f6e17e..17ba1302 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -934,10 +934,11 @@ const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetoo
return NULL;
}
-int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype) {
+int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu) {
DBusMessage *m, *r;
DBusError err;
int ret;
+ uint16_t i, o;
pa_assert(t);
pa_assert(t->y);
@@ -955,7 +956,7 @@ int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *
}
#ifdef DBUS_TYPE_UNIX_FD
- if (!dbus_message_get_args(r, &err, DBUS_TYPE_UNIX_FD, &ret, DBUS_TYPE_INVALID)) {
+ if (!dbus_message_get_args(r, &err, DBUS_TYPE_UNIX_FD, &ret, DBUS_TYPE_UINT16, &i, DBUS_TYPE_UINT16, &o, DBUS_TYPE_INVALID)) {
pa_log("Failed to parse org.bluez.MediaTransport.Acquire(): %s", err.message);
ret = -1;
dbus_error_free(&err);
@@ -963,6 +964,12 @@ int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *
}
#endif
+ if (imtu)
+ *imtu = i;
+
+ if (omtu)
+ *omtu = o;
+
fail:
dbus_message_unref(r);
return ret;
diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h
index f141209d..b471c34d 100644
--- a/src/modules/bluetooth/bluetooth-util.h
+++ b/src/modules/bluetooth/bluetooth-util.h
@@ -126,7 +126,7 @@ const pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_di
const pa_bluetooth_transport* pa_bluetooth_discovery_get_transport(pa_bluetooth_discovery *y, const char *path);
const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetooth_device *d, enum profile profile);
-int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype);
+int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu);
void pa_bluetooth_transport_release(const pa_bluetooth_transport *t, const char *accesstype);
pa_hook* pa_bluetooth_discovery_hook(pa_bluetooth_discovery *d);
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 936d3c77..34ff8f8c 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -910,7 +910,8 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
return -1;
}
- u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype);
+ /* FIXME: Handle in/out MTU properly when unix socket is not longer supported */
+ u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype, NULL, &u->link_mtu);
if (u->stream_fd < 0)
return -1;
@@ -2164,53 +2165,10 @@ static int parse_transport_property(struct userdata *u, DBusMessageIter *i) {
/* Run from main thread */
static int bt_transport_open(struct userdata *u) {
- DBusMessage *m, *r;
- DBusMessageIter arg_i, element_i;
- DBusError err;
-
if (bt_transport_acquire(u, FALSE) < 0)
return -1;
- dbus_error_init(&err);
-
- pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->transport, "org.bluez.MediaTransport", "GetProperties"));
- r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->connection), m, -1, &err);
-
- if (dbus_error_is_set(&err) || !r) {
- pa_log("Failed to get transport properties: %s", err.message);
- goto fail;
- }
-
- if (!dbus_message_iter_init(r, &arg_i)) {
- pa_log("GetProperties reply has no arguments.");
- goto fail;
- }
-
- if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
- pa_log("GetProperties argument is not an array.");
- goto fail;
- }
-
- dbus_message_iter_recurse(&arg_i, &element_i);
- while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
-
- if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter dict_i;
-
- dbus_message_iter_recurse(&element_i, &dict_i);
-
- parse_transport_property(u, &dict_i);
- }
-
- if (!dbus_message_iter_next(&element_i))
- break;
- }
-
return bt_transport_config(u);
-
-fail:
- dbus_message_unref(r);
- return -1;
}
/* Run from main thread */