The voice setting is used by sco_connect() or sco_conn_defer_accept() after being set by sco_sock_setsockopt(). The BCM4349B1 supports 16 bits transparent data on its I2S port. If BT_VOICE_TRANSPARENT is used when accepting a SCO connection, this gives only garbage audio while using BT_VOICE_TRANSPARENT_16BIT gives correct audio. This has been tested with connection to iPhone 14 and Samsung S24. Signed-off-by: Frédéric Danis <frederic.danis@xxxxxxxxxxxxx> --- v1 -> v2: Enhance commit message include/net/bluetooth/bluetooth.h | 1 + net/bluetooth/sco.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index f66bc85c6411..21e93640c229 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -123,6 +123,7 @@ struct bt_voice { #define BT_VOICE_TRANSPARENT 0x0003 #define BT_VOICE_CVSD_16BIT 0x0060 +#define BT_VOICE_TRANSPARENT_16BIT 0x0063 #define BT_SNDMTU 12 #define BT_RCVMTU 13 diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 1b8e468d24cf..baaac4d65a5a 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -319,7 +319,8 @@ static int sco_connect(struct sock *sk) else type = SCO_LINK; - if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && + if ((sco_pi(sk)->setting == BT_VOICE_TRANSPARENT || + sco_pi(sk)->setting == BT_VOICE_TRANSPARENT_16BIT) && (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) { err = -EOPNOTSUPP; goto unlock; @@ -922,6 +923,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, /* Explicitly check for these values */ if (voice.setting != BT_VOICE_TRANSPARENT && + voice.setting != BT_VOICE_TRANSPARENT_16BIT && voice.setting != BT_VOICE_CVSD_16BIT) { err = -EINVAL; break; @@ -935,7 +937,8 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, break; } if (enhanced_sync_conn_capable(hdev) && - voice.setting == BT_VOICE_TRANSPARENT) + (voice.setting == BT_VOICE_TRANSPARENT || + voice.setting == BT_VOICE_TRANSPARENT_16BIT)) sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; hci_dev_put(hdev); break; -- 2.34.1