[pulseaudio-discuss] [PATCH v2 12/21] sink-input, source-output: Create the node early

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Thu Dec 5 06:19:12 PST 2013


Initial routing of the stream will be done in pa_node_put(), so
pa_node_put() needs to be called already in the routing phase of the
stream initialization.

The initialization of the stream proplist was moved up, because the
proplist needs to be available when pa_sink_input_get_description() is
called. This change means that modules can't modify the proplist in
the FIXATE hook any more, but there are no modules that would need to
do that anyway.
---
 src/pulsecore/sink-input.c    | 30 +++++++++++++++---------------
 src/pulsecore/source-output.c | 30 +++++++++++++++---------------
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 6af64ae..afb74f0 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -349,6 +349,21 @@ int pa_sink_input_new(
         goto fail;
     }
 
+    i->proplist = pa_proplist_copy(data->proplist);
+
+    if (!data->node_data.description)
+        pa_node_new_data_set_description(&data->node_data, pa_sink_input_get_description(i));
+
+    if (!(i->node = pa_node_new(i->core, &data->node_data))) {
+        pa_log("Failed to create a node for sink input \"%s\".", pa_sink_input_get_description(i));
+        ret = -PA_ERR_INTERNAL;
+        goto fail;
+    }
+
+    i->node->owner = i;
+
+    pa_node_put(i->node);
+
     if (!data->sink) {
         pa_sink *sink = pa_namereg_get(core, NULL, PA_NAMEREG_SINK);
 
@@ -562,7 +577,6 @@ int pa_sink_input_new(
             }
     }
 
-    i->proplist = pa_proplist_copy(data->proplist);
     i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
     i->sink = data->sink;
     i->requested_resample_method = data->resample_method;
@@ -632,17 +646,6 @@ int pa_sink_input_new(
             &i->sink->silence);
     pa_xfree(memblockq_name);
 
-    if (!data->node_data.description)
-        pa_node_new_data_set_description(&data->node_data, pa_sink_input_get_description(i));
-
-    if (!(i->node = pa_node_new(i->core, &data->node_data))) {
-        pa_log("Failed to create a node for sink input \"%s\".", pa_sink_input_get_description(i));
-        ret = -PA_ERR_INTERNAL;
-        goto fail;
-    }
-
-    i->node->owner = i;
-
     pt = pa_proplist_to_string_sep(i->proplist, "\n    ");
     pa_log_info("Created input %u \"%s\" on %s with sample spec %s and channel map %s\n    %s",
                 i->index,
@@ -896,9 +899,6 @@ void pa_sink_input_put(pa_sink_input *i) {
 
     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_ADD_INPUT, i, 0, NULL) == 0);
 
-    if (i->node)
-        pa_node_put(i->node);
-
     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, i->index);
     pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], i);
 
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
index 35d1ea8..eb8284a 100644
--- a/src/pulsecore/source-output.c
+++ b/src/pulsecore/source-output.c
@@ -282,6 +282,21 @@ int pa_source_output_new(
         goto fail;
     }
 
+    o->proplist = pa_proplist_copy(data->proplist);
+
+    if (!data->node_data.description)
+        pa_node_new_data_set_description(&data->node_data, pa_source_output_get_description(o));
+
+    if (!(o->node = pa_node_new(o->core, &data->node_data))) {
+        pa_log("Failed to create a node for source output \"%s\".", pa_source_output_get_description(o));
+        ret = -PA_ERR_INTERNAL;
+        goto fail;
+    }
+
+    o->node->owner = o;
+
+    pa_node_put(o->node);
+
     if (!data->source) {
         pa_source *source;
 
@@ -515,7 +530,6 @@ int pa_source_output_new(
             }
     }
 
-    o->proplist = pa_proplist_copy(data->proplist);
     o->driver = pa_xstrdup(pa_path_get_filename(data->driver));
     o->source = data->source;
 
@@ -571,17 +585,6 @@ int pa_source_output_new(
     if (o->direct_on_input)
         pa_assert_se(pa_idxset_put(o->direct_on_input->direct_outputs, o, NULL) == 0);
 
-    if (!data->node_data.description)
-        pa_node_new_data_set_description(&data->node_data, pa_source_output_get_description(o));
-
-    if (!(o->node = pa_node_new(o->core, &data->node_data))) {
-        pa_log("Failed to create a node for source output \"%s\".", pa_source_output_get_description(o));
-        ret = -PA_ERR_INTERNAL;
-        goto fail;
-    }
-
-    o->node->owner = o;
-
     pt = pa_proplist_to_string_sep(o->proplist, "\n    ");
     pa_log_info("Created output %u \"%s\" on %s with sample spec %s and channel map %s\n    %s",
                 o->index,
@@ -787,9 +790,6 @@ void pa_source_output_put(pa_source_output *o) {
 
     pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_ADD_OUTPUT, o, 0, NULL) == 0);
 
-    if (o->node)
-        pa_node_put(o->node);
-
     pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW, o->index);
     pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], o);
 
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list