From 123f93770110ebf6ddd0255bb0fcabf8d22e4bf8 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 7 Jun 2025 21:04:19 +0300 Subject: [PATCH] bluez5: backend-hsphfpd: set media_codec on created transports Set media_codec on created transports. Also avoid using the HFP codec id in spa_bt_transport::codec --- spa/plugins/bluez5/backend-hsphfpd.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/spa/plugins/bluez5/backend-hsphfpd.c b/spa/plugins/bluez5/backend-hsphfpd.c index ddbae1c3c..39b4916c8 100644 --- a/spa/plugins/bluez5/backend-hsphfpd.c +++ b/spa/plugins/bluez5/backend-hsphfpd.c @@ -19,6 +19,7 @@ #include #include "defs.h" +#include "media-codecs.h" SPA_LOG_TOPIC_DEFINE_STATIC(log_topic, "spa.bluez5.hsphfpd"); #undef SPA_LOG_TOPIC_DEFAULT @@ -659,8 +660,11 @@ static DBusHandlerResult hsphfpd_new_audio_connection(DBusConnection *conn, DBus goto fail; } - if (transport->codec != codec) - spa_log_warn(backend->log, "Expecting codec to be %d, got %d", transport->codec, codec); + if (transport->media_codec->codec_id != codec) { + spa_log_warn(backend->log, "Expecting codec to be %d, got %d", transport->media_codec->codec_id, codec); + r = dbus_message_new_error_printf(m, HSPHFPD_ERROR_REJECTED, "Endpoint %s has wrong codec", endpoint_path); + goto fail; + } if (transport->fd >= 0) { spa_log_error(backend->log, "Endpoint %s has already active transport", endpoint_path); @@ -879,7 +883,7 @@ static int hsphfpd_audio_acquire(void *data, bool optional) if (backend->acquire_in_progress) return -EINPROGRESS; - if (transport->codec == HFP_AUDIO_CODEC_MSBC) { + if (transport->media_codec->codec_id == HFP_AUDIO_CODEC_MSBC) { air_codec = HSPHFP_AIR_CODEC_MSBC; agent_codec = HSPHFP_AGENT_CODEC_MSBC; } @@ -953,6 +957,7 @@ static DBusHandlerResult hsphfpd_parse_endpoint_properties(struct impl *backend, DBusMessageIter element_i; struct spa_bt_device *d; struct spa_bt_transport *t; + const struct media_codec *codec; dbus_message_iter_recurse(i, &element_i); while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { @@ -1046,7 +1051,8 @@ static DBusHandlerResult hsphfpd_parse_endpoint_properties(struct impl *backend, if ((t = spa_bt_transport_find(backend->monitor, endpoint->path)) != NULL) { /* Release transport on disconnection, or when mSBC is supported if there is an update of the remote codecs */ - if (!endpoint->connected || (backend->msbc_supported && (endpoint->air_codecs & HFP_AUDIO_CODEC_MSBC) && t->codec == HFP_AUDIO_CODEC_CVSD)) { + if (!endpoint->connected || (backend->msbc_supported && (endpoint->air_codecs & HFP_AUDIO_CODEC_MSBC) && + t->media_codec->codec_id == HFP_AUDIO_CODEC_CVSD)) { spa_bt_transport_free(t); spa_bt_device_check_profiles(d, false); spa_log_debug(backend->log, "Transport released for %s", endpoint->path); @@ -1059,6 +1065,15 @@ static DBusHandlerResult hsphfpd_parse_endpoint_properties(struct impl *backend, if (!endpoint->valid || !endpoint->connected) return DBUS_HANDLER_RESULT_HANDLED; + if (backend->msbc_supported && (endpoint->air_codecs & HFP_AUDIO_CODEC_MSBC)) + codec = spa_bt_get_hfp_codec(backend->monitor, HFP_AUDIO_CODEC_MSBC); + else + codec = spa_bt_get_hfp_codec(backend->monitor, HFP_AUDIO_CODEC_CVSD); + if (!codec) { + spa_log_error(backend->log, "cannot get codec for %s", endpoint->path); + return DBUS_HANDLER_RESULT_HANDLED; + } + char *t_path = strdup(endpoint->path); t = spa_bt_transport_create(backend->monitor, t_path, sizeof(struct hsphfpd_transport_data)); if (t == NULL) { @@ -1083,11 +1098,8 @@ static DBusHandlerResult hsphfpd_parse_endpoint_properties(struct impl *backend, else if (endpoint->role == HSPHFPD_ROLE_GATEWAY) t->profile = SPA_BT_PROFILE_HFP_AG; } - if (backend->msbc_supported && (endpoint->air_codecs & HFP_AUDIO_CODEC_MSBC)) - t->codec = HFP_AUDIO_CODEC_MSBC; - else - t->codec = HFP_AUDIO_CODEC_CVSD; + t->media_codec = codec; t->n_channels = 1; t->channels[0] = SPA_AUDIO_CHANNEL_MONO;