[pulseaudio-discuss] [PATCH 13/15] node: Create edges for new streams
Tanu Kaskinen
tanu.kaskinen at linux.intel.com
Thu Feb 13 19:35:58 CET 2014
The abstraction provided by edges allows simpler fallback initial
routing code.
---
src/pulsecore/node.c | 198 +++++++++++----------------------------------------
1 file changed, 41 insertions(+), 157 deletions(-)
diff --git a/src/pulsecore/node.c b/src/pulsecore/node.c
index 41e95ee..530c9b2 100644
--- a/src/pulsecore/node.c
+++ b/src/pulsecore/node.c
@@ -179,202 +179,86 @@ void pa_node_free(pa_node *node) {
}
static void set_initial_routing_fallback(pa_node_set_initial_routing_hook_data *data) {
- int r;
- pa_node *node;
- pa_sink_input *sink_input;
- pa_source_output *source_output;
- pa_sink *sink;
- pa_source *source;
- pa_node *other_node;
- pa_device_port *port;
+ pa_node *routee;
+ pa_node *routing_target;
+ pa_node *input;
+ pa_node *output;
pa_assert(data);
- node = data->node;
+ routee = data->node;
- if (node->type != PA_NODE_TYPE_SINK_INPUT && node->type != PA_NODE_TYPE_SOURCE_OUTPUT) {
+ if (routee->type != PA_NODE_TYPE_SINK_INPUT && routee->type != PA_NODE_TYPE_SOURCE_OUTPUT) {
if (data->n_requested_connections == 0)
data->ret = 0;
else {
- pa_log_info("Can't set initial routing for node %s, operation not supported for node type %s.", node->name,
- pa_node_type_to_string(node->type));
+ pa_log_info("Can't set initial routing for node %s, operation not supported for node type %s.", routee->name,
+ pa_node_type_to_string(routee->type));
data->ret = -PA_ERR_NOTSUPPORTED;
}
return;
}
- if (node->type == PA_NODE_TYPE_SINK_INPUT)
- sink_input = node->owner;
- else
- source_output = node->owner;
-
if (data->n_requested_connections > 1) {
- pa_log_info("Can't set initial routing for node %s, multiple connections not supported.", node->name);
+ pa_log_info("Can't set initial routing for node %s, multiple connections not supported.", routee->name);
data->ret = -PA_ERR_NOTSUPPORTED;
return;
}
if (data->n_requested_connections == 0) {
- if (node->type == PA_NODE_TYPE_SINK_INPUT) {
- sink = pa_namereg_get_default_sink(node->core);
- if (!sink) {
- pa_log_info("Can't set initial routing for node %s, no sinks available.", node->name);
+ if (routee->type == PA_NODE_TYPE_SINK_INPUT) {
+ pa_sink *default_sink;
+
+ default_sink = pa_namereg_get_default_sink(routee->core);
+ if (default_sink) {
+ input = routee;
+ output = pa_sink_get_node(default_sink);
+ } else {
+ pa_log_info("No default sink available.");
data->ret = -PA_ERR_NOENTITY;
return;
}
-
- r = pa_sink_input_set_initial_sink(sink_input, sink);
- if (r < 0) {
- pa_log_info("Can't set initial routing for node %s, format negotiation with the default sink (%s) failed.",
- node->name, sink->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
} else {
- source = pa_namereg_get_default_source(node->core);
- if (!source) {
- pa_log_info("Can't set initial routing for node %s, no sources available.", node->name);
+ pa_source *default_source;
+
+ default_source = pa_namereg_get_default_source(routee->core);
+ if (default_source) {
+ input = pa_source_get_node(default_source);
+ output = routee;
+ } else {
+ pa_log_info("No default source available.");
data->ret = -PA_ERR_NOENTITY;
return;
}
+ }
- r = pa_source_output_set_initial_source(source_output, source);
- if (r < 0) {
- pa_log_info("Can't set initial routing for node %s, format negotiation with the default source (%s) failed.",
- node->name, source->name);
- data->ret = r;
- return;
- }
+ data->ret = pa_core_create_edge(routee->core, input, output, NULL);
- data->ret = 0;
- return;
- }
+ return;
}
pa_assert(data->n_requested_connections == 1);
- other_node = data->requested_connections[0];
- if (!other_node->active) {
+ if (routee->type == PA_NODE_TYPE_SINK_INPUT) {
+ input = routee;
+ output = routing_target = data->requested_connections[0];
+ } else {
+ input = routing_target = data->requested_connections[0];
+ output = routee;
+ }
+
+ if (!routing_target->active) {
/* Let's keep the fallback policy simple, and not try to activate any
* inactive nodes. */
- pa_log_info("Can't connect %s to %s, %s is not active.", node->name, other_node->name, other_node->name);
+ pa_log_info("Can't connect %s to %s, %s is not active.", input->name, output->name, routing_target->name);
data->ret = -PA_ERR_INVALID;
return;
}
- if (node->type == PA_NODE_TYPE_SINK_INPUT) {
- if (other_node->direction != PA_DIRECTION_OUTPUT) {
- pa_log_info("Can't connect %s to %s, both are input nodes.", node->name, other_node->name);
- data->ret = -PA_ERR_INVALID;
- return;
- }
-
- if (other_node->type == PA_NODE_TYPE_SINK) {
- sink = other_node->owner;
+ data->ret = pa_core_create_edge(routee->core, input, output, NULL);
- r = pa_sink_input_set_initial_sink(sink_input, sink);
- if (r < 0) {
- pa_log_info("Can't connect %s to %s, pa_sink_input_set_initial_sink() failed.", node->name, other_node->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
- }
-
- if (other_node->type == PA_NODE_TYPE_PORT) {
- port = other_node->owner;
- sink = port->device;
- pa_assert(sink); /* We have checked that other_node is active. */
-
- r = pa_sink_input_set_initial_sink(sink_input, sink);
- if (r < 0) {
- pa_log_info("Can't connect %s to %s, pa_sink_input_set_initial_sink() failed.", node->name, other_node->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
- }
-
- pa_log_info("Can't connect %s to %s, connections from type %s to type %s are not supported.", node->name,
- other_node->name, pa_node_type_to_string(node->type), pa_node_type_to_string(other_node->type));
- data->ret = -PA_ERR_NOTSUPPORTED;
- return;
- }
-
- if (node->type == PA_NODE_TYPE_SOURCE_OUTPUT) {
- if (other_node->direction != PA_DIRECTION_INPUT) {
- pa_log_info("Can't connect %s to %s, both are output nodes.", node->name, other_node->name);
- data->ret = -PA_ERR_INVALID;
- return;
- }
-
- if (other_node->type == PA_NODE_TYPE_SOURCE) {
- source = other_node->owner;
-
- r = pa_source_output_set_initial_source(source_output, source);
- if (r < 0) {
- pa_log_info("Can't connect %s to %s, pa_source_output_set_initial_source() failed.", node->name,
- other_node->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
- }
-
- if (other_node->type == PA_NODE_TYPE_PORT || other_node->type == PA_NODE_TYPE_PORT_MONITOR) {
- port = other_node->owner;
-
- if (other_node->type == PA_NODE_TYPE_PORT)
- source = port->device;
- else
- source = ((pa_sink *) port->device)->monitor_source;
-
- pa_assert(source); /* We have checked that other_node is active. */
-
- r = pa_source_output_set_initial_source(source_output, source);
- if (r < 0) {
- pa_log_info("Can't connect %s to %s, pa_source_output_set_initial_source() failed.", node->name,
- other_node->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
- }
-
- if (other_node->type == PA_NODE_TYPE_SINK_INPUT) {
- pa_sink_input *input = other_node->owner;
-
- r = pa_source_output_set_direct_on_input(source_output, input);
- if (r < 0) {
- pa_log_info("Can't connect %s to %s, pa_source_output_set_direct_on_input() failed.", node->name,
- other_node->name);
- data->ret = r;
- return;
- }
-
- data->ret = 0;
- return;
- }
-
- pa_log_info("Can't connect %s to %s, connections from type %s to type %s are not supported.", node->name,
- other_node->name, pa_node_type_to_string(node->type), pa_node_type_to_string(other_node->type));
- data->ret = -PA_ERR_NOTSUPPORTED;
- return;
- }
-
- pa_assert_not_reached();
+ return;
}
int pa_node_put(pa_node *node, pa_node **requested_connections, unsigned n_requested_connections) {
--
1.8.3.1
More information about the pulseaudio-discuss
mailing list