Re: [Bluez PATCH v3 1/2] audio/transport: change volume to 8bit

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

 



Hi Archie,

On Tue, Jul 21, 2020 at 8:37 PM Archie Pusaka <apusaka@xxxxxxxxxx> wrote:
>
> From: Archie Pusaka <apusaka@xxxxxxxxxxxx>
>
> The valid range of volume is 0 - 127, yet it is stored in 16bit
> data type. This patch modifies it so we use 8bit data type to
> store volume instead.
>
> Furthermore, this patch introduces helper function and defined
> values to check for volume validity, to prevent numbers
> scattered all over.
>
> Reviewed-by: Michael Sun <michaelfsun@xxxxxxxxxx>
> ---
>
> Changes in v3: None
> Changes in v2: None
>
>  profiles/audio/avrcp.c     |  2 +-
>  profiles/audio/avrcp.h     |  1 -
>  profiles/audio/transport.c | 46 ++++++++++++++++++++++----------------
>  profiles/audio/transport.h |  3 ++-
>  4 files changed, 30 insertions(+), 22 deletions(-)
>
> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> index 1bf85041e..b312b70b9 100644
> --- a/profiles/audio/avrcp.c
> +++ b/profiles/audio/avrcp.c
> @@ -1660,7 +1660,7 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
>                 break;
>         case AVRCP_EVENT_VOLUME_CHANGED:
>                 pdu->params[1] = media_transport_get_device_volume(dev);
> -               if (pdu->params[1] > 127)
> +               if (!media_transport_volume_valid(pdu->params[1]))
>                         goto err;
>
>                 len = 2;
> diff --git a/profiles/audio/avrcp.h b/profiles/audio/avrcp.h
> index 86d310c73..3fd74e18a 100644
> --- a/profiles/audio/avrcp.h
> +++ b/profiles/audio/avrcp.h
> @@ -114,6 +114,5 @@ void avrcp_unregister_player(struct avrcp_player *player);
>  void avrcp_player_event(struct avrcp_player *player, uint8_t id,
>                                                         const void *data);
>
> -
>  size_t avrcp_handle_vendor_reject(uint8_t *code, uint8_t *operands);
>  size_t avrcp_browsing_general_reject(uint8_t *operands);
> diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
> index 48fabba9b..a32073380 100644
> --- a/profiles/audio/transport.c
> +++ b/profiles/audio/transport.c
> @@ -55,6 +55,8 @@
>
>  #define MEDIA_TRANSPORT_INTERFACE "org.bluez.MediaTransport1"
>
> +#define UNINITIALIZED_VOLUME_VALUE     128
> +
>  typedef enum {
>         TRANSPORT_STATE_IDLE,           /* Not acquired and suspended */
>         TRANSPORT_STATE_PENDING,        /* Playing but not acquired */
> @@ -86,7 +88,7 @@ struct media_owner {
>  struct a2dp_transport {
>         struct avdtp            *session;
>         uint16_t                delay;
> -       uint16_t                volume;
> +       uint8_t                 volume;

It might be simpler to just have it as int8_t so we can keep the
current logic of negative means invalid.

>  };
>
>  struct media_transport {
> @@ -634,7 +636,7 @@ static gboolean volume_exists(const GDBusPropertyTable *property, void *data)
>         struct media_transport *transport = data;
>         struct a2dp_transport *a2dp = transport->data;
>
> -       return a2dp->volume <= 127;
> +       return media_transport_volume_valid(a2dp->volume);
>  }
>
>  static gboolean get_volume(const GDBusPropertyTable *property,
> @@ -654,24 +656,20 @@ static void set_volume(const GDBusPropertyTable *property,
>  {
>         struct media_transport *transport = data;
>         struct a2dp_transport *a2dp = transport->data;
> -       uint16_t volume;
> +       uint16_t arg;
> +       uint8_t volume;
>         bool notify;
>
> -       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16) {
> -               g_dbus_pending_property_error(id,
> -                                       ERROR_INTERFACE ".InvalidArguments",
> -                                       "Invalid arguments in method call");
> -               return;
> -       }
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16)
> +               goto error;
>
> -       dbus_message_iter_get_basic(iter, &volume);
> +       dbus_message_iter_get_basic(iter, &arg);
> +       if (arg > UINT8_MAX)
> +               goto error;
>
> -       if (volume > 127) {
> -               g_dbus_pending_property_error(id,
> -                                       ERROR_INTERFACE ".InvalidArguments",
> -                                       "Invalid arguments in method call");
> -               return;
> -       }
> +       volume = (uint8_t)arg;
> +       if (!media_transport_volume_valid(volume))
> +               goto error;
>
>         g_dbus_pending_property_success(id);
>
> @@ -688,6 +686,11 @@ static void set_volume(const GDBusPropertyTable *property,
>                                                 "Volume");
>
>         avrcp_set_volume(transport->device, volume, notify);
> +       return;
> +
> +error:
> +       g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments",
> +                                       "Invalid arguments in method call");
>  }
>
>  static gboolean endpoint_exists(const GDBusPropertyTable *property, void *data)
> @@ -824,7 +827,7 @@ static int media_transport_init_source(struct media_transport *transport)
>         transport->data = a2dp;
>         transport->destroy = destroy_a2dp;
>
> -       a2dp->volume = -1;
> +       a2dp->volume = UNINITIALIZED_VOLUME_VALUE;
>         transport->sink_watch = sink_add_state_cb(service, sink_state_changed,
>                                                                 transport);
>
> @@ -931,7 +934,7 @@ struct btd_device *media_transport_get_dev(struct media_transport *transport)
>         return transport->device;
>  }
>
> -uint16_t media_transport_get_volume(struct media_transport *transport)
> +uint8_t media_transport_get_volume(struct media_transport *transport)
>  {
>         struct a2dp_transport *a2dp = transport->data;
>         return a2dp->volume;
> @@ -958,7 +961,7 @@ uint8_t media_transport_get_device_volume(struct btd_device *dev)
>         GSList *l;
>
>         if (dev == NULL)
> -               return 128;
> +               return UNINITIALIZED_VOLUME_VALUE;
>
>         for (l = transports; l; l = l->next) {
>                 struct media_transport *transport = l->data;
> @@ -991,3 +994,8 @@ void media_transport_update_device_volume(struct btd_device *dev,
>                         media_transport_update_volume(transport, volume);
>         }
>  }
> +
> +bool media_transport_volume_valid(uint8_t volume)
> +{
> +       return volume < 128;
> +}
> diff --git a/profiles/audio/transport.h b/profiles/audio/transport.h
> index ac542bf6c..c430515f2 100644
> --- a/profiles/audio/transport.h
> +++ b/profiles/audio/transport.h
> @@ -32,7 +32,7 @@ struct media_transport *media_transport_create(struct btd_device *device,
>  void media_transport_destroy(struct media_transport *transport);
>  const char *media_transport_get_path(struct media_transport *transport);
>  struct btd_device *media_transport_get_dev(struct media_transport *transport);
> -uint16_t media_transport_get_volume(struct media_transport *transport);
> +uint8_t media_transport_get_volume(struct media_transport *transport);
>  void media_transport_update_delay(struct media_transport *transport,
>                                                         uint16_t delay);
>  void media_transport_update_volume(struct media_transport *transport,
> @@ -43,3 +43,4 @@ void transport_get_properties(struct media_transport *transport,
>  uint8_t media_transport_get_device_volume(struct btd_device *dev);
>  void media_transport_update_device_volume(struct btd_device *dev,
>                                                                 uint8_t volume);
> +bool media_transport_volume_valid(uint8_t volume);
> --
> 2.28.0.rc0.105.gf9edc3c819-goog
>


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