avrcp: include all player settings in notif event
[platform/upstream/bluez.git] / 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;