diff --git a/spa/plugins/bluez5/a2dp-codec-aptx.c b/spa/plugins/bluez5/a2dp-codec-aptx.c index 4af804cd1..721b90599 100644 --- a/spa/plugins/bluez5/a2dp-codec-aptx.c +++ b/spa/plugins/bluez5/a2dp-codec-aptx.c @@ -710,6 +710,11 @@ static const struct a2dp_codec aptx_ll_msbc = { .increase_bitpool = msbc_increase_bitpool, }; +static const struct spa_dict_item duplex_info_items[] = { + { "duplex.boost", "true" }, +}; +static const struct spa_dict duplex_info = SPA_DICT_INIT_ARRAY(duplex_info_items); + const struct a2dp_codec a2dp_codec_aptx_ll_duplex_0 = { APTX_LL_COMMON_DEFS, .id = SPA_BLUETOOTH_AUDIO_CODEC_APTX_LL_DUPLEX, @@ -718,6 +723,7 @@ const struct a2dp_codec a2dp_codec_aptx_ll_duplex_0 = { .name = "aptx_ll_duplex", .endpoint_name = "aptx_ll_duplex_0", .duplex_codec = &aptx_ll_msbc, + .info = &duplex_info, }; const struct a2dp_codec a2dp_codec_aptx_ll_duplex_1 = { @@ -728,6 +734,7 @@ const struct a2dp_codec a2dp_codec_aptx_ll_duplex_1 = { .name = "aptx_ll_duplex", .endpoint_name = "aptx_ll_duplex_1", .duplex_codec = &aptx_ll_msbc, + .info = &duplex_info, }; A2DP_CODEC_EXPORT_DEF( diff --git a/spa/plugins/bluez5/a2dp-codec-faststream.c b/spa/plugins/bluez5/a2dp-codec-faststream.c index 7ad415645..03911945c 100644 --- a/spa/plugins/bluez5/a2dp-codec-faststream.c +++ b/spa/plugins/bluez5/a2dp-codec-faststream.c @@ -614,17 +614,23 @@ static const struct a2dp_codec duplex_codec = { .reduce_bitpool = codec_reduce_bitpool, \ .increase_bitpool = codec_increase_bitpool -const struct a2dp_codec a2dp_codec_faststream = { +static const struct a2dp_codec a2dp_codec_faststream = { FASTSTREAM_COMMON_DEFS, .id = SPA_BLUETOOTH_AUDIO_CODEC_FASTSTREAM, .name = "faststream", }; +static const struct spa_dict_item duplex_info_items[] = { + { "duplex.boost", "true" }, +}; +static const struct spa_dict duplex_info = SPA_DICT_INIT_ARRAY(duplex_info_items); + const struct a2dp_codec a2dp_codec_faststream_duplex = { FASTSTREAM_COMMON_DEFS, .id = SPA_BLUETOOTH_AUDIO_CODEC_FASTSTREAM_DUPLEX, .name = "faststream_duplex", .duplex_codec = &duplex_codec, + .info = &duplex_info, }; A2DP_CODEC_EXPORT_DEF( diff --git a/spa/plugins/bluez5/a2dp-codecs.h b/spa/plugins/bluez5/a2dp-codecs.h index 90bca0268..9ec6d7356 100644 --- a/spa/plugins/bluez5/a2dp-codecs.h +++ b/spa/plugins/bluez5/a2dp-codecs.h @@ -43,7 +43,7 @@ #define SPA_TYPE_INTERFACE_Bluez5CodecA2DP SPA_TYPE_INFO_INTERFACE_BASE "Bluez5:Codec:A2DP:Private" -#define SPA_VERSION_BLUEZ5_CODEC_A2DP 3 +#define SPA_VERSION_BLUEZ5_CODEC_A2DP 4 struct spa_bluez5_codec_a2dp { struct spa_interface iface; diff --git a/spa/plugins/bluez5/bluez5-device.c b/spa/plugins/bluez5/bluez5-device.c index c14974dfd..8852e1891 100644 --- a/spa/plugins/bluez5/bluez5-device.c +++ b/spa/plugins/bluez5/bluez5-device.c @@ -301,6 +301,8 @@ static void emit_info(struct impl *this, bool full); static float get_soft_volume_boost(struct node *node) { + const struct a2dp_codec *codec = node->transport ? node->transport->a2dp_codec : NULL; + /* * For A2DP duplex, the duplex microphone channel sometimes does not appear * to have hardware gain, and input volume is very low. @@ -310,7 +312,8 @@ static float get_soft_volume_boost(struct node *node) * If this causes clipping, the user can just reduce the mic volume to * bring SW gain below 1. */ - if (node->a2dp_duplex && node->transport && + if (node->a2dp_duplex && node->transport && codec && codec->info && + spa_atob(spa_dict_lookup(codec->info, "duplex.boost")) && node->id == DEVICE_ID_SOURCE && !node->transport->volumes[SPA_BT_VOLUME_ID_RX].active) return 10.0f; /* 20 dB boost */