Re: [PATCH v3] Bluetooth: SCO: Add support for 16 bits transparent voice setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux