diff --git a/daemon/call.c b/daemon/call.c index fdb4e8c79..0c30c6617 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -4224,7 +4224,7 @@ struct media_subscription *__add_media_subscription(struct call_media *which, st * Returns B's subscription to A, i.e. the same as * call_get_media_subscription(B->media_subscribers_ht, A) would return. */ -static struct media_subscription *__subscribe_medias_both_ways(struct call_media * a, struct call_media * b, +static struct media_subscription *__subscribe_medias_both_ways(struct call_media *a, struct call_media *b, bool is_offer, medias_q *medias) { /* retrieve previous subscriptions to retain attributes */ @@ -4873,7 +4873,21 @@ void dialogue_connect(struct call_monologue *src_ml, struct call_monologue *dst_ g_auto(medias_q) medias = TYPED_GQUEUE_INIT; - __subscribe_medias_both_ways(src_media, dst_media, false, &medias); + if (!flags->directional) + __subscribe_medias_both_ways(src_media, dst_media, false, &medias); + else { + __auto_type ms = call_get_media_subscription(dst_media->media_subscriptions_ht, + src_media); + if (!ms) + __add_media_subscription(dst_media, src_media, &(struct sink_attrs) { }); + + if (flags->bidirectional) { + ms = call_get_media_subscription(src_media->media_subscriptions_ht, + dst_media); + if (!ms) + __add_media_subscription(src_media, dst_media, &(struct sink_attrs) { }); + } + } __medias_unconfirm(&medias, "connect"); codec_update_medias_handlers(&medias);