avrcp: include all player settings in notif event
authorHoward Chung <howardchung@google.com>
Wed, 5 Aug 2020 02:05:36 +0000 (10:05 +0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:50 +0000 (14:30 +0530)
According to AVRCP 1.6.2 spec section 6.7.2 table 6.39, all player
application settings should be returned to the CT and let CT to
determine which settings have changed. Currently bluez only returns
the changed attribute instead. This patch also addresses a potential
issue on which the number of application settings mismatches with
the actual number returned.

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

index d9d8ba6..9cf1842 100644 (file)
@@ -386,9 +386,9 @@ static uint32_t company_ids[] = {
 };
 
 static void avrcp_register_notification(struct avrcp *session, uint8_t event);
+static GList *player_list_settings(struct avrcp_player *player);
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-static GList *player_list_settings(struct avrcp_player *player);
 void avrcp_stop_position_timer(void);
 unsigned int pos_timer_id = 0;
 #endif
@@ -813,6 +813,35 @@ static int play_status_to_val(const char *status)
        return -EINVAL;
 }
 
+static uint16_t player_settings_changed(struct avrcp_player *player,
+                                               struct avrcp_header *pdu)
+{
+       GList *settings = player_list_settings(player);
+       int size = 2;
+
+       for (; settings; settings = settings->next) {
+               const char *key = settings->data;
+               int attr;
+               int val;
+
+               attr = attr_to_val(key);
+               if (attr < 0)
+                       continue;
+
+               val = player_get_setting(player, attr);
+               if (val < 0)
+                       continue;
+
+               pdu->params[size++] = attr;
+               pdu->params[size++] = val;
+       }
+
+       g_list_free(settings);
+
+       pdu->params[1] = (size - 2) >> 1;
+       return size;
+}
+
 void avrcp_player_event(struct avrcp_player *player, uint8_t id,
                                                        const void *data)
 {
@@ -821,11 +850,8 @@ void avrcp_player_event(struct avrcp_player *player, uint8_t id,
        uint8_t code;
        uint16_t size;
        GSList *l;
-       int attr;
-       int val;
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        uint32_t *position_val = NULL;
-       GList *settings;
 #endif
 
        if (player->sessions == NULL)
@@ -865,37 +891,10 @@ void avrcp_player_event(struct avrcp_player *player, uint8_t id,
                size = 1;
                break;
        case AVRCP_EVENT_SETTINGS_CHANGED:
-               size = 2;
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-               settings = player_list_settings(player);
-               pdu->params[1] = g_list_length(settings);
-               for (; settings; settings = settings->next) {
-                       const char *key = settings->data;
-
-                       attr = attr_to_val(key);
-                       if (attr < 0)
-                               continue;
-
-                       val = player_get_setting(player, attr);
-                       if (val < 0)
-                               continue;
-
-                       pdu->params[size++] = attr;
-                       pdu->params[size++] = val;
-               }
+               size = player_settings_changed(player, pdu);
 #else
-               pdu->params[1] = 1;
-
-               attr = attr_to_val(data);
-               if (attr < 0)
-                       return;
-
-               val = player_get_setting(player, attr);
-               if (val < 0)
-                       return;
-
-               pdu->params[size++] = attr;
-               pdu->params[size++] = val;
+               size = player_settings_changed(player, pdu);
 #endif /* __TIZEN__PATCH__ */
                break;
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
@@ -1757,7 +1756,6 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
        uint32_t playback_position;
        uint8_t play_status;
 #endif
-       GList *settings;
 
        /*
         * 1 byte for EventID, 4 bytes for Playback interval but the latest
@@ -1788,29 +1786,7 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
                len = 1;
                break;
        case AVRCP_EVENT_SETTINGS_CHANGED:
-               len = 1;
-               settings = player_list_settings(player);
-
-               pdu->params[len++] = g_list_length(settings);
-               for (; settings; settings = settings->next) {
-                       const char *key = settings->data;
-                       int attr;
-                       int val;
-
-                       attr = attr_to_val(key);
-                       if (attr < 0)
-                               continue;
-
-                       val = player_get_setting(player, attr);
-                       if (val < 0)
-                               continue;
-
-                       pdu->params[len++] = attr;
-                       pdu->params[len++] = val;
-               }
-
-               g_list_free(settings);
-
+               len = player_settings_changed(player, pdu);
                break;
        case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
                len = 5;