diff --git a/daemon/media_socket.c b/daemon/media_socket.c index cf704dbfe..146f18fd6 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -3061,18 +3061,24 @@ out: unconfirm_sinks(&phc->mp.stream->rtcp_sinks, "peer address unconfirmed"); } if (phc->unkernelize_subscriptions) { - // XXX optimise this triple loop? - for (GList *l = phc->mp.media->monologue->subscriptions.head; l; l = l->next) { - struct call_subscription *cs = l->data; - struct call_monologue *sub = cs->monologue; - for (unsigned int k = 0; k < sub->medias->len; k++) { - struct call_media *sub_media = sub->medias->pdata[k]; - if (!sub_media) - continue; - for (GList *m = sub_media->streams.head; m; m = m->next) { - struct packet_stream *sub_ps = m->data; - __unkernelize(sub_ps, "subscriptions modified"); + AUTO_CLEANUP(GQueue mls, g_queue_clear) = G_QUEUE_INIT; /* to avoid duplications */ + for (GList * sub = phc->mp.media->media_subscriptions.head; sub; sub = sub->next) + { + struct media_subscription * ms = sub->data; + + if (!g_queue_find(&mls, ms->monologue)) { + for (unsigned int k = 0; k < ms->monologue->medias->len; k++) + { + struct call_media *sub_media = ms->monologue->medias->pdata[k]; + if (!sub_media) + continue; + + for (GList *m = sub_media->streams.head; m; m = m->next) { + struct packet_stream *sub_ps = m->data; + __unkernelize(sub_ps, "subscriptions modified"); + } } + g_queue_push_tail(&mls, ms->monologue); } } }