bluetooth: Abstract transport access types inside bluetooth-util

Transports can be acquired with different access rights, but in practice
"rw" was always used inside module-bluetooth-device. In addition, this
feature is removed in BlueZ 5.0 and therefore it is convenient to
abstract all this inside bluetooth-util.
This commit is contained in:
Mikel Astiz 2012-12-14 15:14:34 +01:00 committed by Tanu Kaskinen
parent 0c126bdf5b
commit d2080a59f3
3 changed files with 26 additions and 27 deletions

View file

@ -1087,7 +1087,8 @@ bool pa_bluetooth_device_any_audio_connected(const pa_bluetooth_device *d) {
d->profile_state[PROFILE_HFGW] >= PA_BT_AUDIO_STATE_CONNECTED; d->profile_state[PROFILE_HFGW] >= PA_BT_AUDIO_STATE_CONNECTED;
} }
int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu) { int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) {
const char *accesstype = "rw";
DBusMessage *m, *r; DBusMessage *m, *r;
DBusError err; DBusError err;
int ret; int ret;
@ -1097,6 +1098,20 @@ int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, const char *access
pa_assert(t->device); pa_assert(t->device);
pa_assert(t->device->discovery); pa_assert(t->device->discovery);
if (optional) {
/* FIXME: we are trying to acquire the transport only if the stream is
playing, without actually initiating the stream request from our side
(which is typically undesireable specially for hfgw use-cases.
However this approach is racy, since the stream could have been
suspended in the meantime, so we can't really guarantee that the
stream will not be requested until BlueZ's API supports this
atomically. */
if (t->state < PA_BLUETOOTH_TRANSPORT_STATE_PLAYING) {
pa_log_info("Failed optional acquire of transport %s", t->path);
return -1;
}
}
dbus_error_init(&err); dbus_error_init(&err);
pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.bluez.MediaTransport", "Acquire")); pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.bluez.MediaTransport", "Acquire"));
@ -1126,7 +1141,8 @@ fail:
return ret; return ret;
} }
void pa_bluetooth_transport_release(pa_bluetooth_transport *t, const char *accesstype) { void pa_bluetooth_transport_release(pa_bluetooth_transport *t) {
const char *accesstype = "rw";
DBusMessage *m; DBusMessage *m;
DBusError err; DBusError err;

View file

@ -148,8 +148,8 @@ pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_discover
bool pa_bluetooth_device_any_audio_connected(const pa_bluetooth_device *d); bool pa_bluetooth_device_any_audio_connected(const pa_bluetooth_device *d);
int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu); int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu);
void pa_bluetooth_transport_release(pa_bluetooth_transport *t, const char *accesstype); void pa_bluetooth_transport_release(pa_bluetooth_transport *t);
void pa_bluetooth_transport_set_microphone_gain(pa_bluetooth_transport *t, uint16_t value); void pa_bluetooth_transport_set_microphone_gain(pa_bluetooth_transport *t, uint16_t value);
void pa_bluetooth_transport_set_speaker_gain(pa_bluetooth_transport *t, uint16_t value); void pa_bluetooth_transport_set_speaker_gain(pa_bluetooth_transport *t, uint16_t value);

View file

@ -141,7 +141,7 @@ struct userdata {
char *address; char *address;
char *path; char *path;
pa_bluetooth_transport *transport; pa_bluetooth_transport *transport;
char *accesstype; bool transport_acquired;
pa_hook_slot *discovery_slot; pa_hook_slot *discovery_slot;
pa_hook_slot *sink_state_changed_slot; pa_hook_slot *sink_state_changed_slot;
pa_hook_slot *source_state_changed_slot; pa_hook_slot *source_state_changed_slot;
@ -322,7 +322,7 @@ static void setup_stream(struct userdata *u) {
} }
static bool bt_transport_is_acquired(struct userdata *u) { static bool bt_transport_is_acquired(struct userdata *u) {
if (u->accesstype == NULL) { if (!u->transport_acquired) {
pa_assert(u->stream_fd < 0); pa_assert(u->stream_fd < 0);
return FALSE; return FALSE;
} else { } else {
@ -359,17 +359,14 @@ static void bt_transport_release(struct userdata *u) {
pa_log_debug("Releasing transport %s", u->transport->path); pa_log_debug("Releasing transport %s", u->transport->path);
pa_bluetooth_transport_release(u->transport, u->accesstype); pa_bluetooth_transport_release(u->transport);
pa_xfree(u->accesstype); u->transport_acquired = false;
u->accesstype = NULL;
teardown_stream(u); teardown_stream(u);
} }
static int bt_transport_acquire(struct userdata *u, pa_bool_t start) { static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
const char *accesstype = "rw";
pa_assert(u->transport); pa_assert(u->transport);
if (bt_transport_is_acquired(u)) { if (bt_transport_is_acquired(u)) {
@ -380,21 +377,7 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
pa_log_debug("Acquiring transport %s", u->transport->path); pa_log_debug("Acquiring transport %s", u->transport->path);
if (!start) { u->stream_fd = pa_bluetooth_transport_acquire(u->transport, !start, &u->read_link_mtu, &u->write_link_mtu);
/* FIXME: we are trying to acquire the transport only if the stream is
playing, without actually initiating the stream request from our side
(which is typically undesireable specially for hfgw use-cases.
However this approach is racy, since the stream could have been
suspended in the meantime, so we can't really guarantee that the
stream will not be requested until BlueZ's API supports this
atomically. */
if (u->device->profile_state[u->profile] < PA_BT_AUDIO_STATE_PLAYING) {
pa_log_info("Failed optional acquire of transport %s", u->transport->path);
return -1;
}
}
u->stream_fd = pa_bluetooth_transport_acquire(u->transport, accesstype, &u->read_link_mtu, &u->write_link_mtu);
if (u->stream_fd < 0) { if (u->stream_fd < 0) {
if (start) if (start)
pa_log("Failed to acquire transport %s", u->transport->path); pa_log("Failed to acquire transport %s", u->transport->path);
@ -404,7 +387,7 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
return -1; return -1;
} }
u->accesstype = pa_xstrdup(accesstype); u->transport_acquired = true;
pa_log_info("Transport %s acquired: fd %d", u->transport->path, u->stream_fd); pa_log_info("Transport %s acquired: fd %d", u->transport->path, u->stream_fd);
if (!start) if (!start)