summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brewer <ben.brewer@codethink.co.uk>2014-01-15 11:19:46 +0000
committerTanu Kaskinen <tanu.kaskinen@linux.intel.com>2014-01-15 13:50:11 +0200
commite96785c1c34706e902f28c25844f31d8201db2b2 (patch)
treecf879574ccbaafbb153a716eaa0e1fa3d259b8b1
parentdbe66b0b5e6b6e24df45bda8bf656836f18e7f4b (diff)
ladspa-sink: Set a silence memchunk for the memblockq
A crash was observed that was caused by pa_memblockq_peek() returning a NULL memblock in sink_input_pop_cb(). The scenario where this was happening was 1. Delete 2 rtp-recv's connected to a ladspa-sink 2. Delete ladspa-sink 3. Delete alsa-sink 4. Create alsa-sink 5. Create ladspa-sink 6. Create 2 rtp-recv's connected to the ladspa-sink The crash was probably caused by a rewind that made the read index go negative while the write index was at least zero, causing there to be a gap in the memblockq. The problematic rewind might have been caused by adding the rtp-recv stream to the ladspa-sink. That has not been proven, but this looks very similar to the bug that was fixed in module-virtual-sink in commit 6bd34156b130c07b130de10111a12ef6dab18b52.
-rw-r--r--src/modules/module-ladspa-sink.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c
index 8e35b1b6d..46ce9e440 100644
--- a/src/modules/module-ladspa-sink.c
+++ b/src/modules/module-ladspa-sink.c
@@ -966,6 +966,7 @@ int pa__init(pa_module*m) {
const char *e, *cdata;
const LADSPA_Descriptor *d;
unsigned long p, h, j, n_control, c;
+ pa_memchunk silence;
pa_assert(m);
@@ -1010,7 +1011,6 @@ int pa__init(pa_module*m) {
u = pa_xnew0(struct userdata, 1);
u->module = m;
m->userdata = u;
- u->memblockq = pa_memblockq_new("module-ladspa-sink memblockq", 0, MEMBLOCKQ_MAXLENGTH, 0, &ss, 1, 1, 0, NULL);
u->max_ladspaport_count = 1; /*to avoid division by zero etc. in pa__done when failing before this value has been set*/
u->channels = 0;
u->input = NULL;
@@ -1293,6 +1293,10 @@ int pa__init(pa_module*m) {
u->sink->input_to_master = u->sink_input;
+ pa_sink_input_get_silence(u->sink_input, &silence);
+ u->memblockq = pa_memblockq_new("module-ladspa-sink memblockq", 0, MEMBLOCKQ_MAXLENGTH, 0, &ss, 1, 1, 0, &silence);
+ pa_memblock_unref(silence.memblock);
+
pa_sink_put(u->sink);
pa_sink_input_put(u->sink_input);