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;
DBusError err;
int ret;
pa_assert(t->device);
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);
pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.bluez.MediaTransport", "Acquire"));
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;
DBusError err;
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);
-void pa_bluetooth_transport_release(pa_bluetooth_transport *t, const char *accesstype);
+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);
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);
char *address;
char *path;
pa_bluetooth_transport *transport;
- char *accesstype;
+ bool transport_acquired;
pa_hook_slot *discovery_slot;
pa_hook_slot *sink_state_changed_slot;
pa_hook_slot *source_state_changed_slot;
}
static bool bt_transport_is_acquired(struct userdata *u) {
- if (u->accesstype == NULL) {
+ if (!u->transport_acquired) {
pa_assert(u->stream_fd < 0);
return FALSE;
} else {
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->accesstype = NULL;
+ u->transport_acquired = false;
teardown_stream(u);
}
static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
- const char *accesstype = "rw";
-
pa_assert(u->transport);
if (bt_transport_is_acquired(u)) {
pa_log_debug("Acquiring transport %s", u->transport->path);
- if (!start) {
- /* 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);
+ u->stream_fd = pa_bluetooth_transport_acquire(u->transport, !start, &u->read_link_mtu, &u->write_link_mtu);
if (u->stream_fd < 0) {
if (start)
pa_log("Failed to acquire transport %s", u->transport->path);
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);
if (!start)