diff --git a/modules/module-simple-policy.c b/modules/module-simple-policy.c index 161586f61294e4144ced30bb335dd6a26c14bcc7..312f604fd7df852c6c6c0be00283b3b7473cd31d 100644 --- a/modules/module-simple-policy.c +++ b/modules/module-simple-policy.c @@ -256,29 +256,40 @@ simple_policy_handle_endpoint (WpPolicy *policy, WpEndpoint *ep) g_autoptr (WpCore) core = NULL; g_autoptr (WpEndpoint) target = NULL; guint32 stream_id; + gboolean is_sink = FALSE; - /* TODO: For now we only accept audio output clients */ + /* TODO: For now we only accept audio stream clients */ media_class = wp_endpoint_get_media_class(ep); - if (!g_str_equal (media_class, "Stream/Output/Audio")) + if (!g_str_has_prefix (media_class, "Stream") || + !g_str_has_suffix (media_class, "Audio")) return FALSE; + /* Detect if the client is a sink or a source */ + is_sink = g_str_has_prefix (media_class, "Stream/Input"); + /* Locate the target endpoint */ g_variant_dict_init (&d, NULL); g_variant_dict_insert (&d, "action", "s", "link"); - g_variant_dict_insert (&d, "media.class", "s", "Audio/Sink"); + g_variant_dict_insert (&d, "media.class", "s", + is_sink ? "Audio/Source" : "Audio/Sink"); /* TODO: more properties are needed here */ core = wp_policy_get_core (policy); target = wp_policy_find_endpoint (core, g_variant_dict_end (&d), &stream_id); if (!target) { - g_warning ("Could not find an Audio/Sink target endpoint\n"); + g_warning ("Could not find a target endpoint\n"); /* TODO: we should kill the client, otherwise it's going to hang waiting */ return FALSE; } /* Link the client with the target */ - wp_endpoint_link_new (core, ep, 0, target, stream_id, - on_endpoint_link_created, NULL); + if (is_sink) { + wp_endpoint_link_new (core, target, 0, ep, stream_id, + on_endpoint_link_created, NULL); + } else { + wp_endpoint_link_new (core, ep, 0, target, stream_id, + on_endpoint_link_created, NULL); + } return TRUE; }