diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 4e7ff75..5d0256c 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
};
static void avrcp_register_notification(struct avrcp *session, uint8_t event);
+static GList *player_list_settings(struct avrcp_player *player);
static sdp_record_t *avrcp_ct_record(void)
{
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)
{
uint8_t code;
uint16_t size;
GSList *l;
- int attr;
- int val;
if (player->sessions == NULL)
return;
size = 1;
break;
case AVRCP_EVENT_SETTINGS_CHANGED:
- size = 2;
- 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);
break;
case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
size = 5;
uint16_t len = ntohs(pdu->params_len);
uint64_t uid;
int8_t volume;
- GList *settings;
/*
* 1 byte for EventID, 4 bytes for Playback interval but the latest
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;