mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
bluez5: hsphfpd: make transport acquire async
Now that sinks/sources can do transport acquire asynchronously, remove the workaround that made it synchronous. Do release still synchronously however.
This commit is contained in:
parent
4d844ee1c6
commit
3236d706ba
1 changed files with 16 additions and 7 deletions
|
|
@ -835,12 +835,14 @@ static DBusHandlerResult application_object_manager_handler(DBusConnection *c, D
|
|||
|
||||
static void hsphfpd_audio_acquire_reply(DBusPendingCall *pending, void *user_data)
|
||||
{
|
||||
struct impl *backend = user_data;
|
||||
struct spa_bt_transport *transport = user_data;
|
||||
struct impl *backend = SPA_CONTAINER_OF(transport->backend, struct impl, this);
|
||||
DBusMessage *r;
|
||||
const char *transport_path;
|
||||
const char *service_id;
|
||||
const char *agent_path;
|
||||
DBusError error;
|
||||
int ret = 0;
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
|
|
@ -853,16 +855,19 @@ static void hsphfpd_audio_acquire_reply(DBusPendingCall *pending, void *user_dat
|
|||
if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) {
|
||||
spa_log_error(backend->log, "RegisterApplication() failed: %s",
|
||||
dbus_message_get_error_name(r));
|
||||
ret = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!spa_streq(dbus_message_get_sender(r), backend->hsphfpd_service_id)) {
|
||||
spa_log_error(backend->log, "Reply for " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() from invalid sender");
|
||||
ret = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!check_signature(r, "oso")) {
|
||||
spa_log_error(backend->log, "Invalid reply signature for " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio()");
|
||||
ret = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
|
@ -872,11 +877,13 @@ static void hsphfpd_audio_acquire_reply(DBusPendingCall *pending, void *user_dat
|
|||
DBUS_TYPE_OBJECT_PATH, &agent_path,
|
||||
DBUS_TYPE_INVALID) == FALSE) {
|
||||
spa_log_error(backend->log, "Failed to parse " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() reply: %s", error.message);
|
||||
ret = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!spa_streq(service_id, dbus_bus_get_unique_name(backend->conn))) {
|
||||
spa_log_warn(backend->log, HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() failed: Other audio application took audio socket");
|
||||
ret = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
|
@ -885,6 +892,11 @@ static void hsphfpd_audio_acquire_reply(DBusPendingCall *pending, void *user_dat
|
|||
finish:
|
||||
dbus_message_unref(r);
|
||||
dbus_pending_call_unref(pending);
|
||||
|
||||
if (ret < 0)
|
||||
spa_bt_transport_set_state(transport, SPA_BT_TRANSPORT_STATE_ERROR);
|
||||
else
|
||||
spa_bt_transport_set_state(transport, SPA_BT_TRANSPORT_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
static int hsphfpd_audio_acquire(void *data, bool optional)
|
||||
|
|
@ -919,15 +931,10 @@ static int hsphfpd_audio_acquire(void *data, bool optional)
|
|||
dbus_error_init(&err);
|
||||
|
||||
dbus_connection_send_with_reply(backend->conn, m, &call, -1);
|
||||
dbus_pending_call_set_notify(call, hsphfpd_audio_acquire_reply, backend, NULL);
|
||||
dbus_pending_call_set_notify(call, hsphfpd_audio_acquire_reply, transport, NULL);
|
||||
dbus_message_unref(m);
|
||||
|
||||
/* The ConnectAudio method triggers Introspect and NewConnection calls,
|
||||
which will set the fd to use for the SCO data.
|
||||
We need to run the DBus loop to be able to reply to those method calls */
|
||||
backend->acquire_in_progress = true;
|
||||
while (backend->acquire_in_progress && dbus_connection_read_write_dispatch(backend->conn, -1))
|
||||
; // empty loop body
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -941,6 +948,8 @@ static int hsphfpd_audio_release(void *data)
|
|||
spa_log_debug(backend->log, "transport %p: Release %s",
|
||||
transport, transport->path);
|
||||
|
||||
spa_bt_transport_set_state(transport, SPA_BT_TRANSPORT_STATE_IDLE);
|
||||
|
||||
if (transport->sco_io) {
|
||||
spa_bt_sco_io_destroy(transport->sco_io);
|
||||
transport->sco_io = NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue