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)
|
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;
|
DBusMessage *r;
|
||||||
const char *transport_path;
|
const char *transport_path;
|
||||||
const char *service_id;
|
const char *service_id;
|
||||||
const char *agent_path;
|
const char *agent_path;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
dbus_error_init(&error);
|
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) {
|
if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) {
|
||||||
spa_log_error(backend->log, "RegisterApplication() failed: %s",
|
spa_log_error(backend->log, "RegisterApplication() failed: %s",
|
||||||
dbus_message_get_error_name(r));
|
dbus_message_get_error_name(r));
|
||||||
|
ret = -EIO;
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!spa_streq(dbus_message_get_sender(r), backend->hsphfpd_service_id)) {
|
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");
|
spa_log_error(backend->log, "Reply for " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() from invalid sender");
|
||||||
|
ret = -EIO;
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_signature(r, "oso")) {
|
if (!check_signature(r, "oso")) {
|
||||||
spa_log_error(backend->log, "Invalid reply signature for " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio()");
|
spa_log_error(backend->log, "Invalid reply signature for " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio()");
|
||||||
|
ret = -EIO;
|
||||||
goto finish;
|
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_OBJECT_PATH, &agent_path,
|
||||||
DBUS_TYPE_INVALID) == FALSE) {
|
DBUS_TYPE_INVALID) == FALSE) {
|
||||||
spa_log_error(backend->log, "Failed to parse " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() reply: %s", error.message);
|
spa_log_error(backend->log, "Failed to parse " HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() reply: %s", error.message);
|
||||||
|
ret = -EIO;
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!spa_streq(service_id, dbus_bus_get_unique_name(backend->conn))) {
|
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");
|
spa_log_warn(backend->log, HSPHFPD_ENDPOINT_INTERFACE ".ConnectAudio() failed: Other audio application took audio socket");
|
||||||
|
ret = -EIO;
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -885,6 +892,11 @@ static void hsphfpd_audio_acquire_reply(DBusPendingCall *pending, void *user_dat
|
||||||
finish:
|
finish:
|
||||||
dbus_message_unref(r);
|
dbus_message_unref(r);
|
||||||
dbus_pending_call_unref(pending);
|
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)
|
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_error_init(&err);
|
||||||
|
|
||||||
dbus_connection_send_with_reply(backend->conn, m, &call, -1);
|
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);
|
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;
|
backend->acquire_in_progress = true;
|
||||||
while (backend->acquire_in_progress && dbus_connection_read_write_dispatch(backend->conn, -1))
|
|
||||||
; // empty loop body
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -941,6 +948,8 @@ static int hsphfpd_audio_release(void *data)
|
||||||
spa_log_debug(backend->log, "transport %p: Release %s",
|
spa_log_debug(backend->log, "transport %p: Release %s",
|
||||||
transport, transport->path);
|
transport, transport->path);
|
||||||
|
|
||||||
|
spa_bt_transport_set_state(transport, SPA_BT_TRANSPORT_STATE_IDLE);
|
||||||
|
|
||||||
if (transport->sco_io) {
|
if (transport->sco_io) {
|
||||||
spa_bt_sco_io_destroy(transport->sco_io);
|
spa_bt_sco_io_destroy(transport->sco_io);
|
||||||
transport->sco_io = NULL;
|
transport->sco_io = NULL;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue