Hi Huang-Huang, On Wed, May 19, 2021 at 9:14 PM Huang-Huang Bao <eh5@xxxxxxxx> wrote: > > 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; Well we could just set the change_id manually instead since it is anyway set to 0 in the code below which is equivalent to what you are doing here. > + > 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 -- Luiz Augusto von Dentz