Hi Frederic, On Thu, Dec 5, 2024 at 10:52 AM Frédéric Danis <frederic.danis@xxxxxxxxxxxxx> wrote: > > The voice setting is used by sco_connect() or sco_conn_defer_accept() > after being set by sco_sock_setsockopt(). > > The PCM part of the voice setting is used for offload mode through PCM > chipset port. > This commits add support for mSBC 16 bits offloading, i.e. audio data > not transported over HCI. > > 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 > v2 -> v3: 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 e6760c11f007..435250c72d56 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 7eb8d3e04ec4..7b54d8826bcc 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) { We might need to allow all valid settings here, since there can be different PCM settings other than just these which is probably why the HCI field is a bitmask, so I suggest we do something like this: https://gist.github.com/Vudentz/ae1502e6e402ae95aca330bae6096941 > 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 > > -- Luiz Augusto von Dentz