From 65216f24a0ac62bea9ad4696882fd39fdf69f4de Mon Sep 17 00:00:00 2001 From: Alessandro Toppi Date: Wed, 4 Sep 2024 13:04:57 +0200 Subject: [PATCH] audiobridge: cleanup participant's queue and jitter buffer when muted property changes or the whole room is muted (#3368) --- src/plugins/janus_audiobridge.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/plugins/janus_audiobridge.c b/src/plugins/janus_audiobridge.c index abf20cf1ff..70657f49e3 100644 --- a/src/plugins/janus_audiobridge.c +++ b/src/plugins/janus_audiobridge.c @@ -4278,6 +4278,7 @@ static json_t *janus_audiobridge_process_synchronous_request(janus_audiobridge_s goto prepare_response; } + janus_mutex_lock(&participant->qmutex); if(participant->muted == muted) { /* If someone trying to mute an already muted user, or trying to unmute a user that is not mute), then we should do nothing */ @@ -4287,12 +4288,12 @@ static json_t *janus_audiobridge_process_synchronous_request(janus_audiobridge_s json_object_set_new(response, "audiobridge", json_string("success")); /* Done */ + janus_mutex_unlock(&participant->qmutex); janus_mutex_unlock(&audiobridge->mutex); janus_refcount_decrease(&audiobridge->ref); goto prepare_response; } - janus_mutex_lock(&participant->qmutex); participant->muted = muted; JANUS_LOG(LOG_VERB, "Setting muted property: %s (room %s, user %s)\n", participant->muted ? "true" : "false", participant->room->room_id_str, participant->user_id_str); @@ -4430,6 +4431,13 @@ static json_t *janus_audiobridge_process_synchronous_request(janus_audiobridge_s g_hash_table_iter_init(&iter, audiobridge->participants); while(g_hash_table_iter_next(&iter, NULL, &value)) { janus_audiobridge_participant *p = value; + janus_mutex_lock(&p->qmutex); + if(p->muted != audiobridge->muted) { + /* Clear the queued packets waiting to be handled */ + janus_audiobridge_participant_clear_jitter_buffer(p); + janus_audiobridge_participant_clear_inbuf(p); + } + janus_mutex_unlock(&p->qmutex); if(g_atomic_int_get(&p->paused_events)) continue; JANUS_LOG(LOG_VERB, "Notifying participant %s (%s)\n", p->user_id_str, p->display ? p->display : "??"); @@ -7140,10 +7148,10 @@ static void *janus_audiobridge_handler(void *data) { if(muted || display || (participant->stereo && spatial) || denoise) { if(muted) { janus_mutex_lock(&participant->qmutex); - participant->muted = json_is_true(muted); - JANUS_LOG(LOG_VERB, "Setting muted property: %s (room %s, user %s)\n", - participant->muted ? "true" : "false", participant->room->room_id_str, participant->user_id_str); - if(participant->muted) { + if(participant->muted != json_is_true(muted)) { + participant->muted = json_is_true(muted); + JANUS_LOG(LOG_VERB, "Setting muted property: %s (room %s, user %s)\n", + participant->muted ? "true" : "false", participant->room->room_id_str, participant->user_id_str); /* Clear the queued packets waiting to be handled */ janus_audiobridge_participant_clear_jitter_buffer(participant); janus_audiobridge_participant_clear_inbuf(participant); @@ -7626,7 +7634,11 @@ static void *janus_audiobridge_handler(void *data) { g_free(participant->display); participant->display = display_text ? g_strdup(display_text) : NULL; participant->room = audiobridge; + janus_mutex_lock(&participant->qmutex); participant->muted = muted ? json_is_true(muted) : FALSE; /* When switching to a new room, you're unmuted by default */ + janus_audiobridge_participant_clear_jitter_buffer(participant); + janus_audiobridge_participant_clear_inbuf(participant); + janus_mutex_unlock(&participant->qmutex); if(suspended && json_is_true(suspended)) { janus_mutex_lock(&participant->suspend_cond_mutex); g_atomic_int_set(&participant->suspended, 1);