config-policy: use the default session endpoint if target-endpoint is not defined
This commit is contained in:
@@ -279,8 +279,9 @@ static WpBaseEndpoint *
|
|||||||
wp_config_policy_find_endpoint (WpPolicy *policy, GVariant *props,
|
wp_config_policy_find_endpoint (WpPolicy *policy, GVariant *props,
|
||||||
guint32 *stream_id)
|
guint32 *stream_id)
|
||||||
{
|
{
|
||||||
g_autoptr (WpCore) core = NULL;
|
g_autoptr (WpCore) core = wp_policy_get_core (policy);
|
||||||
g_autoptr (WpPolicyManager) pmgr = NULL;
|
g_autoptr (WpPolicyManager) pmgr = wp_policy_manager_get_instance (core);
|
||||||
|
g_autoptr (WpSession) session = wp_policy_manager_get_session (pmgr);
|
||||||
const struct WpParserEndpointLinkData *data = NULL;
|
const struct WpParserEndpointLinkData *data = NULL;
|
||||||
g_autoptr (GPtrArray) endpoints = NULL;
|
g_autoptr (GPtrArray) endpoints = NULL;
|
||||||
guint i;
|
guint i;
|
||||||
@@ -294,9 +295,10 @@ wp_config_policy_find_endpoint (WpPolicy *policy, GVariant *props,
|
|||||||
if (!data)
|
if (!data)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
/* If target-endpoint data was defined in the configuration file, find the
|
||||||
|
* matching endpoint based on target-endpoint data */
|
||||||
|
if (data->has_te) {
|
||||||
/* Get all the endpoints matching the media class */
|
/* Get all the endpoints matching the media class */
|
||||||
core = wp_policy_get_core (policy);
|
|
||||||
pmgr = wp_policy_manager_get_instance (core);
|
|
||||||
endpoints = wp_policy_manager_list_endpoints (pmgr,
|
endpoints = wp_policy_manager_list_endpoints (pmgr,
|
||||||
data->te.endpoint_data.media_class);
|
data->te.endpoint_data.media_class);
|
||||||
if (!endpoints)
|
if (!endpoints)
|
||||||
@@ -309,6 +311,41 @@ wp_config_policy_find_endpoint (WpPolicy *policy, GVariant *props,
|
|||||||
&data->te.endpoint_data))
|
&data->te.endpoint_data))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, use the default session endpoint if the session is valid */
|
||||||
|
else if (session) {
|
||||||
|
/* Get the default type */
|
||||||
|
WpDefaultEndpointType type;
|
||||||
|
switch (data->me.endpoint_data.direction) {
|
||||||
|
case PW_DIRECTION_INPUT:
|
||||||
|
type = WP_DEFAULT_ENDPOINT_TYPE_AUDIO_SOURCE;
|
||||||
|
break;
|
||||||
|
case PW_DIRECTION_OUTPUT:
|
||||||
|
type = WP_DEFAULT_ENDPOINT_TYPE_AUDIO_SINK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_warn_if_reached ();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get all the endpoints */
|
||||||
|
endpoints = wp_policy_manager_list_endpoints (pmgr, NULL);
|
||||||
|
if (!endpoints)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Find the default session endpoint */
|
||||||
|
for (i = 0; i < endpoints->len; i++) {
|
||||||
|
target = g_ptr_array_index (endpoints, i);
|
||||||
|
guint def_id = wp_session_get_default_endpoint (session, type);
|
||||||
|
if (def_id == wp_base_endpoint_get_global_id (target))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If no target data has been defined and session is not valid, return null */
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* If target did not match any data, return NULL */
|
/* If target did not match any data, return NULL */
|
||||||
if (i >= endpoints->len)
|
if (i >= endpoints->len)
|
||||||
|
@@ -199,10 +199,11 @@ wp_parser_endpoint_link_data_new (const gchar *location)
|
|||||||
/* Get the match endpoint properties (Optional) */
|
/* Get the match endpoint properties (Optional) */
|
||||||
res->me.endpoint_data.props = parse_properties (me, "properties");
|
res->me.endpoint_data.props = parse_properties (me, "properties");
|
||||||
|
|
||||||
/* Get the target-endpoint table */
|
/* Get the target-endpoint table (Optional) */
|
||||||
|
res->has_te = FALSE;
|
||||||
te = wp_toml_table_get_table (table, "target-endpoint");
|
te = wp_toml_table_get_table (table, "target-endpoint");
|
||||||
if (!te)
|
if (te) {
|
||||||
goto error;
|
res->has_te = TRUE;
|
||||||
|
|
||||||
/* Get the name from the match endpoint table (Optional) */
|
/* Get the name from the match endpoint table (Optional) */
|
||||||
res->te.endpoint_data.name = wp_toml_table_get_string (te, "name");
|
res->te.endpoint_data.name = wp_toml_table_get_string (te, "name");
|
||||||
@@ -220,6 +221,7 @@ wp_parser_endpoint_link_data_new (const gchar *location)
|
|||||||
|
|
||||||
/* Get the target endpoint stream */
|
/* Get the target endpoint stream */
|
||||||
res->te.stream = wp_toml_table_get_string (te, "stream");
|
res->te.stream = wp_toml_table_get_string (te, "stream");
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the target-endpoint table */
|
/* Get the target-endpoint table */
|
||||||
el = wp_toml_table_get_table (table, "endpoint-link");
|
el = wp_toml_table_get_table (table, "endpoint-link");
|
||||||
|
@@ -27,6 +27,7 @@ struct WpParserEndpointLinkData {
|
|||||||
guint priority;
|
guint priority;
|
||||||
struct WpParserEndpointLinkEndpointData endpoint_data;
|
struct WpParserEndpointLinkEndpointData endpoint_data;
|
||||||
} me;
|
} me;
|
||||||
|
gboolean has_te;
|
||||||
struct TargetEndpoint {
|
struct TargetEndpoint {
|
||||||
struct WpParserEndpointLinkEndpointData endpoint_data;
|
struct WpParserEndpointLinkEndpointData endpoint_data;
|
||||||
char *stream;
|
char *stream;
|
||||||
|
Reference in New Issue
Block a user