@@ -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
@@ -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;
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@collabora.com> --- v1 -> v2: Enhance commit message include/net/bluetooth/bluetooth.h | 1 + net/bluetooth/sco.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-)