audio/transport: change volume to 8bit
authorArchie Pusaka <apusaka@chromium.org>
Thu, 23 Jul 2020 07:23:39 +0000 (15:23 +0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:50 +0000 (14:30 +0530)
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 we also use signed type, so
negative values can be used to indicate invalid volume.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
profiles/audio/avrcp.c
profiles/audio/avrcp.h
profiles/audio/media.c
profiles/audio/transport.c
profiles/audio/transport.h

index 1ce23a1..a81b46e 100644 (file)
@@ -1750,6 +1750,7 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
        struct btd_device *dev = session->dev;
        uint16_t len = ntohs(pdu->params_len);
        uint64_t uid;
+       int8_t volume;
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        uint32_t playback_interval;
        uint32_t playback_position;
@@ -1819,10 +1820,11 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
                len = 1;
                break;
        case AVRCP_EVENT_VOLUME_CHANGED:
-               pdu->params[1] = media_transport_get_device_volume(dev);
-               if (pdu->params[1] > 127)
+               volume = media_transport_get_device_volume(dev);
+               if (volume < 0)
                        goto err;
 
+               pdu->params[1] = volume;
                len = 2;
 
                break;
@@ -1951,7 +1953,7 @@ static uint8_t avrcp_handle_set_absolute_volume(struct avrcp *session,
                                                uint8_t transaction)
 {
        uint16_t len = ntohs(pdu->params_len);
-       uint8_t volume;
+       int8_t volume;
 
        if (len != 1)
                goto err;
@@ -4026,7 +4028,7 @@ static void avrcp_volume_changed(struct avrcp *session,
                                                struct avrcp_header *pdu)
 {
        struct avrcp_player *player = target_get_player(session);
-       uint8_t volume;
+       int8_t volume;
 
        volume = pdu->params[1] & 0x7F;
 
@@ -4899,7 +4901,7 @@ static gboolean avrcp_handle_set_volume(struct avctp *conn, uint8_t code,
        struct avrcp *session = user_data;
        struct avrcp_player *player = target_get_player(session);
        struct avrcp_header *pdu = (void *) operands;
-       uint8_t volume;
+       int8_t volume;
 
        if (code == AVC_CTYPE_REJECTED || code == AVC_CTYPE_NOT_IMPLEMENTED ||
                                                                pdu == NULL)
@@ -4962,13 +4964,16 @@ static int avrcp_event(struct avrcp *session, uint8_t id, const void *data)
        return err;
 }
 
-int avrcp_set_volume(struct btd_device *dev, uint8_t volume, bool notify)
+int avrcp_set_volume(struct btd_device *dev, int8_t volume, bool notify)
 {
        struct avrcp_server *server;
        struct avrcp *session;
        uint8_t buf[AVRCP_HEADER_LENGTH + 1];
        struct avrcp_header *pdu = (void *) buf;
 
+       if (volume < 0)
+               return -EINVAL;
+
        server = find_server(servers, device_get_adapter(dev));
        if (server == NULL)
                return -EINVAL;
index 66a40bd..e186da9 100644 (file)
 #define AVRCP_EVENT_LAST                       AVRCP_EVENT_VOLUME_CHANGED
 
 struct avrcp_player_cb {
-       GList *(*list_settings) (void *user_data);
-       const char *(*get_setting) (const char *key, void *user_data);
-       int (*set_setting) (const char *key, const char *value,
+       GList *(*list_settings)(void *user_data);
+       const char *(*get_setting)(const char *key, void *user_data);
+       int (*set_setting)(const char *key, const char *value,
                                                        void *user_data);
-       uint64_t (*get_uid) (void *user_data);
-       const char *(*get_metadata) (const char *key, void *user_data);
-       GList *(*list_metadata) (void *user_data);
-       const char *(*get_status) (void *user_data);
-       uint32_t (*get_position) (void *user_data);
-       uint32_t (*get_duration) (void *user_data);
-       const char *(*get_name) (void *user_data);
-       void (*set_volume) (uint8_t volume, struct btd_device *dev,
+       uint64_t (*get_uid)(void *user_data);
+       const char *(*get_metadata)(const char *key, void *user_data);
+       GList *(*list_metadata)(void *user_data);
+       const char *(*get_status)(void *user_data);
+       uint32_t (*get_position)(void *user_data);
+       uint32_t (*get_duration)(void *user_data);
+       const char *(*get_name)(void *user_data);
+       void (*set_volume)(int8_t volume, struct btd_device *dev,
                                                        void *user_data);
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        uint8_t (*get_volume) (struct btd_device *dev, void *user_data);
 #endif
-       bool (*play) (void *user_data);
-       bool (*stop) (void *user_data);
-       bool (*pause) (void *user_data);
-       bool (*next) (void *user_data);
-       bool (*previous) (void *user_data);
+       bool (*play)(void *user_data);
+       bool (*stop)(void *user_data);
+       bool (*pause)(void *user_data);
+       bool (*next)(void *user_data);
+       bool (*previous)(void *user_data);
 };
 
-int avrcp_set_volume(struct btd_device *dev, uint8_t volume, bool notify);
+int avrcp_set_volume(struct btd_device *dev, int8_t volume, bool notify);
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
 int avrcp_get_target_volume(struct btd_device *dev, uint8_t* volume);
@@ -125,6 +125,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);
index de7bbdc..847a99f 100644 (file)
@@ -142,7 +142,7 @@ struct media_player {
        char                    *status;
        uint32_t                position;
        uint32_t                duration;
-       uint8_t                 volume;
+       int8_t                  volume;
        GTimer                  *timer;
        bool                    play;
        bool                    pause;
@@ -1528,7 +1528,7 @@ static uint32_t get_duration(void *user_data)
        return mp->duration;
 }
 
-static void set_volume(uint8_t volume, struct btd_device *dev, void *user_data)
+static void set_volume(int8_t volume, struct btd_device *dev, void *user_data)
 {
        struct media_player *mp = user_data;
 
index 21c8a1f..d0f986d 100644 (file)
@@ -91,7 +91,7 @@ struct media_owner {
 struct a2dp_transport {
        struct avdtp            *session;
        uint16_t                delay;
-       uint16_t                volume;
+       int8_t          volume;
 };
 
 struct media_transport {
@@ -677,7 +677,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 a2dp->volume >= 0;
 }
 #endif
 
@@ -686,8 +686,9 @@ static gboolean get_volume(const GDBusPropertyTable *property,
 {
        struct media_transport *transport = data;
        struct a2dp_transport *a2dp = transport->data;
+       uint16_t volume = (uint16_t)a2dp->volume;
 
-       dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &a2dp->volume);
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &volume);
 
        return TRUE;
 }
@@ -698,27 +699,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;
+       int8_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);
-
-       if (volume > 127) {
-               g_dbus_pending_property_error(id,
-                                       ERROR_INTERFACE ".InvalidArguments",
-                                       "Invalid arguments in method call");
-               return;
-       }
+       dbus_message_iter_get_basic(iter, &arg);
+       if (arg > INT8_MAX)
+               goto error;
 
        g_dbus_pending_property_success(id);
 
+       volume = (int8_t)arg;
        if (a2dp->volume == volume)
                return;
 
@@ -732,6 +726,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)
@@ -1026,7 +1025,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)
+int8_t media_transport_get_volume(struct media_transport *transport)
 {
        struct a2dp_transport *a2dp = transport->data;
        return a2dp->volume;
@@ -1066,7 +1065,7 @@ static int media_transport_set_volume_level(uint32_t volume)
 #endif
 
 void media_transport_update_volume(struct media_transport *transport,
-                                                               uint8_t volume)
+                                                               int8_t volume)
 {
        struct a2dp_transport *a2dp = transport->data;
 
@@ -1093,12 +1092,12 @@ void media_transport_update_volume(struct media_transport *transport,
 #endif
 }
 
-uint8_t media_transport_get_device_volume(struct btd_device *dev)
+int8_t media_transport_get_device_volume(struct btd_device *dev)
 {
        GSList *l;
 
        if (dev == NULL)
-               return 128;
+               return -1;
 
        for (l = transports; l; l = l->next) {
                struct media_transport *transport = l->data;
@@ -1114,7 +1113,7 @@ uint8_t media_transport_get_device_volume(struct btd_device *dev)
 }
 
 void media_transport_update_device_volume(struct btd_device *dev,
-                                                               uint8_t volume)
+                                                               int8_t volume)
 {
        GSList *l;
 
index 3ce75a1..0c72d47 100755 (executable)
@@ -32,17 +32,17 @@ 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);
+int8_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,
-                                                               uint8_t volume);
+                                                               int8_t volume);
 void transport_get_properties(struct media_transport *transport,
                                                        DBusMessageIter *iter);
 
-uint8_t media_transport_get_device_volume(struct btd_device *dev);
+int8_t media_transport_get_device_volume(struct btd_device *dev);
 void media_transport_update_device_volume(struct btd_device *dev,
-                                                               uint8_t volume);
+                                                               int8_t volume);
 
 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && defined(TIZEN_FEATURE_BLUEZ_A2DP_MULTISTREAM)
 void media_transport_set_stream_status(struct btd_device *device, bool pause);