Re: [PATCH BlueZ 1/1] client/player: Fix transport.send command's transfer of packets

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

 



Hi Vlad,

On Mon, Mar 25, 2024 at 10:40 AM Vlad Pruteanu <vlad.pruteanu@xxxxxxx> wrote:
>
> The transport.send command sends a number num of packets at intervals
> specified by the transport latency reported by the CIS Establsihed event.
> Num is defined as qos.ucast.out.latency * 1000 / qos.ucast.out.interval.
> Since this latency could be smaller than the SDU interval for some presets,
> the resulting num would be 0, causing the file transfer to stop after the
> first packet. Instead, one packet should be sent at SDU interval distance
> apart.

Please add some output samples showing the wrong interval ends up being used.

> ---
>  client/player.c | 34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/client/player.c b/client/player.c
> index 1f56bfd27..f579d9904 100644
> --- a/client/player.c
> +++ b/client/player.c
> @@ -34,6 +34,7 @@
>
>  #include "lib/bluetooth.h"
>  #include "lib/uuid.h"
> +#include "lib/iso.h"
>
>  #include "profiles/audio/a2dp-codecs.h"
>  #include "src/shared/lc3.h"
> @@ -5007,7 +5008,6 @@ static bool transport_timer_read(struct io *io, void *user_data)
>         struct bt_iso_qos qos;
>         socklen_t len;
>         int ret, fd;
> -       uint32_t num;
>         uint64_t exp;
>
>         if (transport->fd < 0)
> @@ -5031,10 +5031,7 @@ static bool transport_timer_read(struct io *io, void *user_data)
>                 return false;
>         }
>
> -       /* num of packets = latency (ms) / interval (us) */
> -       num = (qos.ucast.out.latency * 1000 / qos.ucast.out.interval);
> -
> -       ret = transport_send_seq(transport, transport->fd, num);
> +       ret = transport_send_seq(transport, transport->fd, 1);
>         if (ret < 0) {
>                 bt_shell_printf("Unable to send: %s (%d)\n",
>                                         strerror(-ret), ret);
> @@ -5052,6 +5049,8 @@ static bool transport_timer_read(struct io *io, void *user_data)
>  static int transport_send(struct transport *transport, int fd,
>                                         struct bt_iso_qos *qos)
>  {
> +       struct sockaddr_iso addr;
> +       socklen_t optlen;
>         struct itimerspec ts;
>         int timer_fd;
>
> @@ -5068,9 +5067,30 @@ static int transport_send(struct transport *transport, int fd,
>                 return -errno;
>
>         memset(&ts, 0, sizeof(ts));
> -       ts.it_value.tv_nsec = qos->ucast.out.latency * 1000000;
> -       ts.it_interval.tv_nsec = qos->ucast.out.latency * 1000000;
>
> +       /* Need to know if the transport on which data is sent is
> +        * broadcast or unicast so that the correct qos structure
> +        * can be accessed. At this point in code there no other
> +        * way of knowing this besides checking the peer address.
> +        * Broadcast will use BDADDR_ANY, while Unicast will use
> +        * the connected peer's actual address.
> +        */
> +       memset(&addr, 0, sizeof(addr));
> +       optlen = sizeof(addr);
> +
> +       if (getpeername(transport->sk, &addr, &optlen) < 0)
> +               return -errno;

The description seems to be suggesting there is a rounding error, but
the code below only deals with the fact we didn't use proper fields
for broadcast, so is it really fixing what is the patch description or
something else?

> +       if (!(bacmp(&addr.iso_bdaddr, BDADDR_ANY))) {
> +               /* Interval is measured in us, multiply by 1000 to get ns */
> +               ts.it_value.tv_nsec = qos->bcast.out.interval * 1000;
> +               ts.it_interval.tv_nsec = qos->bcast.out.interval * 1000;
> +       } else {
> +               /* Interval is measured in us, multiply by 1000 to get ns */
> +               ts.it_value.tv_nsec = qos->ucast.out.interval * 1000;
> +               ts.it_interval.tv_nsec = qos->ucast.out.interval * 1000;
> +
> +       }
>         if (timerfd_settime(timer_fd, TFD_TIMER_ABSTIME, &ts, NULL) < 0)
>                 return -errno;
>
> --
> 2.39.2
>


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