[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