bluez5: enable A2DP duplex volume boost only if codec asks for it

Make A2DP volume boost conditional on a flag the codec sets.

Bump codec API version.
This commit is contained in:
Pauli Virtanen 2022-05-22 18:22:55 +03:00 committed by Wim Taymans
parent 92b2b44954
commit d29aafd857
4 changed files with 19 additions and 3 deletions

View file

@ -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(

View file

@ -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(

View file

@ -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;

View file

@ -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 */