[pulseaudio-discuss] [PATCH 11/23] sink-input, source-output: Allocate the object early in new()

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Wed Nov 20 01:26:03 PST 2013


The sink input/source output node will have to be created already
during the routing phase, because doing it later makes it impossible
to use node-based routing to set the initial routing. When the node is
created, it will need the sink input/source output pointer, and that's
why we need to allocate the object already before the routing phase.

I had to choose which fields to initialize early. I think at least
index, core and state need to be initialized before passing the object
to any external code, but I chose to move up the initialization of all
fields that only require a one-liner.

I also removed explicit initialization of fields that were just set
to zero, because pa_msgobject_new() nowadays zeroes the memory anyway.
---
 src/pulsecore/sink-input.c    | 51 +++++++++++++++++--------------------------
 src/pulsecore/source-output.c | 39 +++++++++++++++------------------
 2 files changed, 37 insertions(+), 53 deletions(-)

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 1f88bfc..7d5ce56 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -304,6 +304,25 @@ int pa_sink_input_new(
     pa_assert(data);
     pa_assert_ctl_context();
 
+    i = pa_msgobject_new(pa_sink_input);
+    i->parent.parent.free = sink_input_free;
+    i->parent.process_msg = pa_sink_input_process_msg;
+    pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) >= 0);
+    i->core = core;
+    i->state = PA_SINK_INPUT_INIT;
+    i->flags = data->flags;
+    i->module = data->module;
+    i->client = data->client;
+    i->origin_sink = data->origin_sink;
+    i->direct_outputs = pa_idxset_new(NULL, NULL);
+    i->requested_resample_method = data->resample_method;
+
+    i->thread_info.state = i->state;
+    pa_atomic_store(&i->thread_info.drained, 1);
+    i->thread_info.underrun_for = (uint64_t) -1;
+    i->thread_info.requested_sink_latency = (pa_usec_t) -1;
+    i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+
     if (data->client)
         pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
 
@@ -544,21 +563,9 @@ int pa_sink_input_new(
             }
     }
 
-    i = pa_msgobject_new(pa_sink_input);
-    i->parent.parent.free = sink_input_free;
-    i->parent.process_msg = pa_sink_input_process_msg;
-
-    i->core = core;
-    i->state = PA_SINK_INPUT_INIT;
-    i->flags = data->flags;
     i->proplist = pa_proplist_copy(data->proplist);
     i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
-    i->module = data->module;
     i->sink = data->sink;
-    i->origin_sink = data->origin_sink;
-    i->client = data->client;
-
-    i->requested_resample_method = data->resample_method;
     i->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
     i->sample_spec = data->sample_spec;
     i->channel_map = data->channel_map;
@@ -600,31 +607,13 @@ int pa_sink_input_new(
         if (data->sync_base->sync_next)
             data->sync_base->sync_next->sync_prev = i;
         data->sync_base->sync_next = i;
-    } else
-        i->sync_next = i->sync_prev = NULL;
-
-    i->direct_outputs = pa_idxset_new(NULL, NULL);
-
-    reset_callbacks(i);
-    i->userdata = NULL;
+    }
 
-    i->thread_info.state = i->state;
-    i->thread_info.attached = false;
-    pa_atomic_store(&i->thread_info.drained, 1);
     i->thread_info.sample_spec = i->sample_spec;
     i->thread_info.resampler = resampler;
     i->thread_info.soft_volume = i->soft_volume;
     i->thread_info.muted = i->muted;
-    i->thread_info.requested_sink_latency = (pa_usec_t) -1;
-    i->thread_info.rewrite_nbytes = 0;
-    i->thread_info.rewrite_flush = false;
-    i->thread_info.dont_rewind_render = false;
-    i->thread_info.underrun_for = (uint64_t) -1;
-    i->thread_info.underrun_for_sink = 0;
-    i->thread_info.playing_for = 0;
-    i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
 
-    pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
     pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
 
     if (i->client)
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
index 3d2cd4a..1232f55 100644
--- a/src/pulsecore/source-output.c
+++ b/src/pulsecore/source-output.c
@@ -239,6 +239,23 @@ int pa_source_output_new(
     pa_assert(data);
     pa_assert_ctl_context();
 
+    o = pa_msgobject_new(pa_source_output);
+    o->parent.parent.free = source_output_free;
+    o->parent.process_msg = pa_source_output_process_msg;
+    pa_assert_se(pa_idxset_put(core->source_outputs, o, &o->index) >= 0);
+    o->core = core;
+    o->state = PA_SOURCE_OUTPUT_INIT;
+    o->flags = data->flags;
+    o->module = data->module;
+    o->client = data->client;
+    o->destination_source = data->destination_source;
+    o->direct_on_input = data->direct_on_input;
+    o->requested_resample_method = data->resample_method;
+
+    o->thread_info.state = o->state;
+    o->thread_info.requested_source_latency = (pa_usec_t) -1;
+    o->thread_info.direct_on_input = o->direct_on_input;
+
     if (data->client)
         pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
 
@@ -499,21 +516,10 @@ int pa_source_output_new(
             }
     }
 
-    o = pa_msgobject_new(pa_source_output);
-    o->parent.parent.free = source_output_free;
-    o->parent.process_msg = pa_source_output_process_msg;
-
-    o->core = core;
-    o->state = PA_SOURCE_OUTPUT_INIT;
-    o->flags = data->flags;
     o->proplist = pa_proplist_copy(data->proplist);
     o->driver = pa_xstrdup(pa_path_get_filename(data->driver));
-    o->module = data->module;
     o->source = data->source;
-    o->destination_source = data->destination_source;
-    o->client = data->client;
 
-    o->requested_resample_method = data->resample_method;
     o->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
     o->sample_spec = data->sample_spec;
     o->channel_map = data->channel_map;
@@ -539,22 +545,12 @@ int pa_source_output_new(
     o->save_volume = data->save_volume;
     o->save_source = data->save_source;
     o->save_muted = data->save_muted;
-
     o->muted = data->muted;
 
-    o->direct_on_input = data->direct_on_input;
-
-    reset_callbacks(o);
-    o->userdata = NULL;
-
-    o->thread_info.state = o->state;
-    o->thread_info.attached = false;
     o->thread_info.sample_spec = o->sample_spec;
     o->thread_info.resampler = resampler;
     o->thread_info.soft_volume = o->soft_volume;
     o->thread_info.muted = o->muted;
-    o->thread_info.requested_source_latency = (pa_usec_t) -1;
-    o->thread_info.direct_on_input = o->direct_on_input;
 
     o->thread_info.delay_memblockq = pa_memblockq_new(
             "source output delay_memblockq",
@@ -567,7 +563,6 @@ int pa_source_output_new(
             0,
             &o->source->silence);
 
-    pa_assert_se(pa_idxset_put(core->source_outputs, o, &o->index) == 0);
     pa_assert_se(pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL) == 0);
 
     if (o->client)
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list