v2: fix commit message & code styles 'notify_addressed_player_changed()' expected to be called with 'player->changed_id' set to what 'g_idle_add()' returns. player->changed_id = g_idle_add(notify_addressed_player_changed, player); And 'avrcp_player_event()' relies on 'player->changed_id' to perform Addressed Player Changed notification. However, 'avrcp_unregister_player()' calls 'notify_addressed_player_changed()' without adding it to the main loop and set 'player->changed_id'. To make 'notify_addressed_player_changed()' can be called without set 'player->changed_id' flag. We add antoher flag 'player->addressed_changing' to indicate addressed player changing. Fixes https://github.com/bluez/bluez/issues/142 --- profiles/audio/avrcp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c index 58d30b24d..5058a6848 100644 --- a/profiles/audio/avrcp.c +++ b/profiles/audio/avrcp.c @@ -239,6 +239,7 @@ struct avrcp_player { uint8_t *features; char *path; guint changed_id; + bool addressed_changing; struct pending_list_items *p; char *change_path; @@ -792,7 +793,8 @@ void avrcp_player_event(struct avrcp_player *player, uint8_t id, DBG("id=%u", id); - if (id != AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED && player->changed_id) { + if (id != AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED && + player->addressed_changing) { code = AVC_CTYPE_REJECTED; size = 1; pdu->params[0] = AVRCP_STATUS_ADDRESSED_PLAYER_CHANGED; @@ -1794,6 +1796,8 @@ static gboolean notify_addressed_player_changed(gpointer user_data) }; uint8_t i; + player->addressed_changing = true; + avrcp_player_event(player, AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED, NULL); /* @@ -1804,6 +1808,7 @@ static gboolean notify_addressed_player_changed(gpointer user_data) for (i = 0; i < sizeof(events); i++) avrcp_player_event(player, events[i], NULL); + player->addressed_changing = false; player->changed_id = 0; return FALSE; -- 2.31.1