build-sys: Use ax_check_flag macros from autoconf archive
[pulseaudio-mirror.git] / src / modules / module-ladspa-sink.c
blob9cce269d9b4560ee25ad5028f5bda013e4bde492
1 /***
2 This file is part of PulseAudio.
4 Copyright 2004-2008 Lennart Poettering
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 USA.
20 ***/
22 /* TODO: Some plugins cause latency, and some even report it by using a control
23 out port. We don't currently use the latency information. */
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
29 #include <math.h>
31 #include <pulse/xmalloc.h>
32 #include <pulse/i18n.h>
34 #include <pulsecore/namereg.h>
35 #include <pulsecore/sink.h>
36 #include <pulsecore/module.h>
37 #include <pulsecore/core-util.h>
38 #include <pulsecore/modargs.h>
39 #include <pulsecore/log.h>
40 #include <pulsecore/rtpoll.h>
41 #include <pulsecore/sample-util.h>
42 #include <pulsecore/ltdl-helper.h>
44 #include "module-ladspa-sink-symdef.h"
45 #include "ladspa.h"
47 PA_MODULE_AUTHOR("Lennart Poettering");
48 PA_MODULE_DESCRIPTION(_("Virtual LADSPA sink"));
49 PA_MODULE_VERSION(PACKAGE_VERSION);
50 PA_MODULE_LOAD_ONCE(FALSE);
51 PA_MODULE_USAGE(
52 _("sink_name=<name for the sink> "
53 "sink_properties=<properties for the sink> "
54 "master=<name of sink to filter> "
55 "format=<sample format> "
56 "rate=<sample rate> "
57 "channels=<number of channels> "
58 "channel_map=<input channel map> "
59 "plugin=<ladspa plugin name> "
60 "label=<ladspa plugin label> "
61 "control=<comma seperated list of input control values> "
62 "input_ladspaport_map=<comma separated list of input LADSPA port names> "
63 "output_ladspaport_map=<comma separated list of output LADSPA port names> "));
65 #define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
67 /* PLEASE NOTICE: The PortAudio ports and the LADSPA ports are two different concepts.
68 They are not related and where possible the names of the LADSPA port variables contains "ladspa" to avoid confusion */
70 struct userdata {
71 pa_module *module;
73 pa_sink *sink;
74 pa_sink_input *sink_input;
76 const LADSPA_Descriptor *descriptor;
77 LADSPA_Handle handle[PA_CHANNELS_MAX];
78 unsigned long max_ladspaport_count, input_count, output_count, channels;
79 LADSPA_Data **input, **output;
80 size_t block_size;
81 LADSPA_Data *control;
83 /* This is a dummy buffer. Every port must be connected, but we don't care
84 about control out ports. We connect them all to this single buffer. */
85 LADSPA_Data control_out;
87 pa_memblockq *memblockq;
89 pa_bool_t auto_desc;
92 static const char* const valid_modargs[] = {
93 "sink_name",
94 "sink_properties",
95 "master",
96 "format",
97 "rate",
98 "channels",
99 "channel_map",
100 "plugin",
101 "label",
102 "control",
103 "input_ladspaport_map",
104 "output_ladspaport_map",
105 NULL
108 /* Called from I/O thread context */
109 static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
110 struct userdata *u = PA_SINK(o)->userdata;
112 switch (code) {
114 case PA_SINK_MESSAGE_GET_LATENCY:
116 /* The sink is _put() before the sink input is, so let's
117 * make sure we don't access it in that time. Also, the
118 * sink input is first shut down, the sink second. */
119 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
120 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) {
121 *((pa_usec_t*) data) = 0;
122 return 0;
125 *((pa_usec_t*) data) =
127 /* Get the latency of the master sink */
128 pa_sink_get_latency_within_thread(u->sink_input->sink) +
130 /* Add the latency internal to our sink input on top */
131 pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
133 return 0;
136 return pa_sink_process_msg(o, code, data, offset, chunk);
139 /* Called from main context */
140 static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
141 struct userdata *u;
143 pa_sink_assert_ref(s);
144 pa_assert_se(u = s->userdata);
146 if (!PA_SINK_IS_LINKED(state) ||
147 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
148 return 0;
150 pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
151 return 0;
154 /* Called from I/O thread context */
155 static void sink_request_rewind_cb(pa_sink *s) {
156 struct userdata *u;
158 pa_sink_assert_ref(s);
159 pa_assert_se(u = s->userdata);
161 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
162 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
163 return;
165 /* Just hand this one over to the master sink */
166 pa_sink_input_request_rewind(u->sink_input,
167 s->thread_info.rewind_nbytes +
168 pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE);
171 /* Called from I/O thread context */
172 static void sink_update_requested_latency_cb(pa_sink *s) {
173 struct userdata *u;
175 pa_sink_assert_ref(s);
176 pa_assert_se(u = s->userdata);
178 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
179 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
180 return;
182 /* Just hand this one over to the master sink */
183 pa_sink_input_set_requested_latency_within_thread(
184 u->sink_input,
185 pa_sink_get_requested_latency_within_thread(s));
188 /* Called from main context */
189 static void sink_set_volume_cb(pa_sink *s) {
190 struct userdata *u;
192 pa_sink_assert_ref(s);
193 pa_assert_se(u = s->userdata);
195 if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
196 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
197 return;
199 pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE);
202 /* Called from main context */
203 static void sink_set_mute_cb(pa_sink *s) {
204 struct userdata *u;
206 pa_sink_assert_ref(s);
207 pa_assert_se(u = s->userdata);
209 if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
210 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
211 return;
213 pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
216 /* Called from I/O thread context */
217 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
218 struct userdata *u;
219 float *src, *dst;
220 size_t fs;
221 unsigned n, h, c;
222 pa_memchunk tchunk;
224 pa_sink_input_assert_ref(i);
225 pa_assert(chunk);
226 pa_assert_se(u = i->userdata);
228 /* Hmm, process any rewind request that might be queued up */
229 pa_sink_process_rewind(u->sink, 0);
231 while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
232 pa_memchunk nchunk;
234 pa_sink_render(u->sink, nbytes, &nchunk);
235 pa_memblockq_push(u->memblockq, &nchunk);
236 pa_memblock_unref(nchunk.memblock);
239 tchunk.length = PA_MIN(nbytes, tchunk.length);
240 pa_assert(tchunk.length > 0);
242 fs = pa_frame_size(&i->sample_spec);
243 n = (unsigned) (PA_MIN(tchunk.length, u->block_size) / fs);
245 pa_assert(n > 0);
247 chunk->index = 0;
248 chunk->length = n*fs;
249 chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
251 pa_memblockq_drop(u->memblockq, chunk->length);
253 src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
254 dst = (float*) pa_memblock_acquire(chunk->memblock);
256 for (h = 0; h < (u->channels / u->max_ladspaport_count); h++) {
257 for (c = 0; c < u->input_count; c++)
258 pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c], sizeof(float), src+ h*u->max_ladspaport_count + c, u->channels*sizeof(float), n);
259 u->descriptor->run(u->handle[h], n);
260 for (c = 0; c < u->output_count; c++)
261 pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + h*u->max_ladspaport_count + c, u->channels*sizeof(float), u->output[c], sizeof(float), n);
264 pa_memblock_release(tchunk.memblock);
265 pa_memblock_release(chunk->memblock);
267 pa_memblock_unref(tchunk.memblock);
269 return 0;
272 /* Called from I/O thread context */
273 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
274 struct userdata *u;
275 size_t amount = 0;
277 pa_sink_input_assert_ref(i);
278 pa_assert_se(u = i->userdata);
280 if (u->sink->thread_info.rewind_nbytes > 0) {
281 size_t max_rewrite;
283 max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq);
284 amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
285 u->sink->thread_info.rewind_nbytes = 0;
287 if (amount > 0) {
288 unsigned c;
290 pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
292 pa_log_debug("Resetting plugin");
294 /* Reset the plugin */
295 if (u->descriptor->deactivate)
296 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++)
297 u->descriptor->deactivate(u->handle[c]);
298 if (u->descriptor->activate)
299 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++)
300 u->descriptor->activate(u->handle[c]);
304 pa_sink_process_rewind(u->sink, amount);
305 pa_memblockq_rewind(u->memblockq, nbytes);
308 /* Called from I/O thread context */
309 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
310 struct userdata *u;
312 pa_sink_input_assert_ref(i);
313 pa_assert_se(u = i->userdata);
315 pa_memblockq_set_maxrewind(u->memblockq, nbytes);
316 pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
319 /* Called from I/O thread context */
320 static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
321 struct userdata *u;
323 pa_sink_input_assert_ref(i);
324 pa_assert_se(u = i->userdata);
326 pa_sink_set_max_request_within_thread(u->sink, nbytes);
329 /* Called from I/O thread context */
330 static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
331 struct userdata *u;
333 pa_sink_input_assert_ref(i);
334 pa_assert_se(u = i->userdata);
336 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
339 /* Called from I/O thread context */
340 static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) {
341 struct userdata *u;
343 pa_sink_input_assert_ref(i);
344 pa_assert_se(u = i->userdata);
346 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
349 /* Called from I/O thread context */
350 static void sink_input_detach_cb(pa_sink_input *i) {
351 struct userdata *u;
353 pa_sink_input_assert_ref(i);
354 pa_assert_se(u = i->userdata);
356 pa_sink_detach_within_thread(u->sink);
358 pa_sink_set_rtpoll(u->sink, NULL);
361 /* Called from I/O thread context */
362 static void sink_input_attach_cb(pa_sink_input *i) {
363 struct userdata *u;
365 pa_sink_input_assert_ref(i);
366 pa_assert_se(u = i->userdata);
368 pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
369 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
370 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
371 pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i));
372 pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i));
374 pa_sink_attach_within_thread(u->sink);
377 /* Called from main context */
378 static void sink_input_kill_cb(pa_sink_input *i) {
379 struct userdata *u;
381 pa_sink_input_assert_ref(i);
382 pa_assert_se(u = i->userdata);
384 /* The order here matters! We first kill the sink input, followed
385 * by the sink. That means the sink callbacks must be protected
386 * against an unconnected sink input! */
387 pa_sink_input_unlink(u->sink_input);
388 pa_sink_unlink(u->sink);
390 pa_sink_input_unref(u->sink_input);
391 u->sink_input = NULL;
393 pa_sink_unref(u->sink);
394 u->sink = NULL;
396 pa_module_unload_request(u->module, TRUE);
399 /* Called from IO thread context */
400 static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) {
401 struct userdata *u;
403 pa_sink_input_assert_ref(i);
404 pa_assert_se(u = i->userdata);
406 /* If we are added for the first time, ask for a rewinding so that
407 * we are heard right-away. */
408 if (PA_SINK_INPUT_IS_LINKED(state) &&
409 i->thread_info.state == PA_SINK_INPUT_INIT) {
410 pa_log_debug("Requesting rewind due to state change.");
411 pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
415 /* Called from main context */
416 static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
417 struct userdata *u;
419 pa_sink_input_assert_ref(i);
420 pa_assert_se(u = i->userdata);
422 return u->sink != dest;
425 /* Called from main context */
426 static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
427 struct userdata *u;
429 pa_sink_input_assert_ref(i);
430 pa_assert_se(u = i->userdata);
432 if (dest) {
433 pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
434 pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
435 } else
436 pa_sink_set_asyncmsgq(u->sink, NULL);
438 if (u->auto_desc && dest) {
439 const char *z;
440 pa_proplist *pl;
442 pl = pa_proplist_new();
443 z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION);
444 pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "LADSPA Plugin %s on %s",
445 pa_proplist_gets(u->sink->proplist, "device.ladspa.name"), z ? z : dest->name);
447 pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl);
448 pa_proplist_free(pl);
452 /* Called from main context */
453 static void sink_input_volume_changed_cb(pa_sink_input *i) {
454 struct userdata *u;
456 pa_sink_input_assert_ref(i);
457 pa_assert_se(u = i->userdata);
459 pa_sink_volume_changed(u->sink, &i->volume);
462 /* Called from main context */
463 static void sink_input_mute_changed_cb(pa_sink_input *i) {
464 struct userdata *u;
466 pa_sink_input_assert_ref(i);
467 pa_assert_se(u = i->userdata);
469 pa_sink_mute_changed(u->sink, i->muted);
472 int pa__init(pa_module*m) {
473 struct userdata *u;
474 pa_sample_spec ss;
475 pa_channel_map map;
476 pa_modargs *ma;
477 char *t;
478 pa_sink *master;
479 pa_sink_input_new_data sink_input_data;
480 pa_sink_new_data sink_data;
481 const char *plugin, *label, *input_ladspaport_map, *output_ladspaport_map;
482 LADSPA_Descriptor_Function descriptor_func;
483 unsigned long input_ladspaport[PA_CHANNELS_MAX], output_ladspaport[PA_CHANNELS_MAX];
484 const char *e, *cdata;
485 const LADSPA_Descriptor *d;
486 unsigned long p, h, j, n_control, c;
487 pa_bool_t *use_default = NULL;
489 pa_assert(m);
491 pa_assert_cc(sizeof(LADSPA_Data) == sizeof(float));
493 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
494 pa_log("Failed to parse module arguments.");
495 goto fail;
498 if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
499 pa_log("Master sink not found");
500 goto fail;
503 ss = master->sample_spec;
504 ss.format = PA_SAMPLE_FLOAT32;
505 map = master->channel_map;
506 if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
507 pa_log("Invalid sample format specification or channel map");
508 goto fail;
511 if (!(plugin = pa_modargs_get_value(ma, "plugin", NULL))) {
512 pa_log("Missing LADSPA plugin name");
513 goto fail;
516 if (!(label = pa_modargs_get_value(ma, "label", NULL))) {
517 pa_log("Missing LADSPA plugin label");
518 goto fail;
521 if (!(input_ladspaport_map = pa_modargs_get_value(ma, "input_ladspaport_map", NULL)))
522 pa_log_debug("Using default input ladspa port mapping");
524 if (!(output_ladspaport_map = pa_modargs_get_value(ma, "output_ladspaport_map", NULL)))
525 pa_log_debug("Using default output ladspa port mapping");
527 cdata = pa_modargs_get_value(ma, "control", NULL);
529 u = pa_xnew0(struct userdata, 1);
530 u->module = m;
531 m->userdata = u;
532 u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
533 u->max_ladspaport_count = 1; /*to avoid division by zero etc. in pa__done when failing before this value has been set*/
534 u->channels = 0;
535 u->input = NULL;
536 u->output = NULL;
538 if (!(e = getenv("LADSPA_PATH")))
539 e = LADSPA_PATH;
541 /* FIXME: This is not exactly thread safe */
542 t = pa_xstrdup(lt_dlgetsearchpath());
543 lt_dlsetsearchpath(e);
544 m->dl = lt_dlopenext(plugin);
545 lt_dlsetsearchpath(t);
546 pa_xfree(t);
548 if (!m->dl) {
549 pa_log("Failed to load LADSPA plugin: %s", lt_dlerror());
550 goto fail;
553 if (!(descriptor_func = (LADSPA_Descriptor_Function) pa_load_sym(m->dl, NULL, "ladspa_descriptor"))) {
554 pa_log("LADSPA module lacks ladspa_descriptor() symbol.");
555 goto fail;
558 for (j = 0;; j++) {
560 if (!(d = descriptor_func(j))) {
561 pa_log("Failed to find plugin label '%s' in plugin '%s'.", label, plugin);
562 goto fail;
565 if (strcmp(d->Label, label) == 0)
566 break;
569 u->descriptor = d;
571 pa_log_debug("Module: %s", plugin);
572 pa_log_debug("Label: %s", d->Label);
573 pa_log_debug("Unique ID: %lu", d->UniqueID);
574 pa_log_debug("Name: %s", d->Name);
575 pa_log_debug("Maker: %s", d->Maker);
576 pa_log_debug("Copyright: %s", d->Copyright);
578 n_control = 0;
579 u->channels = ss.channels;
582 * Enumerate ladspa ports
583 * Default mapping is in order given by the plugin
585 for (p = 0; p < d->PortCount; p++) {
586 if (LADSPA_IS_PORT_AUDIO(d->PortDescriptors[p])) {
587 if (LADSPA_IS_PORT_INPUT(d->PortDescriptors[p])) {
588 pa_log_debug("Port %lu is input: %s", p, d->PortNames[p]);
589 input_ladspaport[u->input_count] = p;
590 u->input_count++;
591 } else if (LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p])) {
592 pa_log_debug("Port %lu is output: %s", p, d->PortNames[p]);
593 output_ladspaport[u->output_count] = p;
594 u->output_count++;
596 } else if (LADSPA_IS_PORT_CONTROL(d->PortDescriptors[p]) && LADSPA_IS_PORT_INPUT(d->PortDescriptors[p])) {
597 pa_log_debug("Port %lu is control: %s", p, d->PortNames[p]);
598 n_control++;
599 } else
600 pa_log_debug("Ignored port %s", d->PortNames[p]);
601 /* XXX: Has anyone ever seen an in-place plugin with non-equal number of input and output ports? */
602 /* Could be if the plugin is for up-mixing stereo to 5.1 channels */
603 /* Or if the plugin is down-mixing 5.1 to two channel stereo or binaural encoded signal */
604 if (u->input_count > u->max_ladspaport_count)
605 u->max_ladspaport_count = u->input_count;
606 else
607 u->max_ladspaport_count = u->output_count;
610 if (u->channels % u->max_ladspaport_count) {
611 pa_log("Cannot handle non-integral number of plugins required for given number of channels");
612 goto fail;
615 pa_log_debug("Will run %lu plugin instances", u->channels / u->max_ladspaport_count);
617 /* Parse data for input ladspa port map */
618 if (input_ladspaport_map) {
619 const char *state = NULL;
620 char *pname;
621 c = 0;
622 while ((pname = pa_split(input_ladspaport_map, ",", &state))) {
623 if (c == u->input_count) {
624 pa_log("Too many ports in input ladspa port map");
625 goto fail;
629 for (p = 0; p < d->PortCount; p++) {
630 if (strcmp(d->PortNames[p], pname) == 0) {
631 if (LADSPA_IS_PORT_AUDIO(d->PortDescriptors[p]) && LADSPA_IS_PORT_INPUT(d->PortDescriptors[p])) {
632 input_ladspaport[c] = p;
633 } else {
634 pa_log("Port %s is not an audio input ladspa port", pname);
635 pa_xfree(pname);
636 goto fail;
640 c++;
641 pa_xfree(pname);
645 /* Parse data for output port map */
646 if (output_ladspaport_map) {
647 const char *state = NULL;
648 char *pname;
649 c = 0;
650 while ((pname = pa_split(output_ladspaport_map, ",", &state))) {
651 if (c == u->output_count) {
652 pa_log("Too many ports in output ladspa port map");
653 goto fail;
655 for (p = 0; p < d->PortCount; p++) {
656 if (strcmp(d->PortNames[p], pname) == 0) {
657 if (LADSPA_IS_PORT_AUDIO(d->PortDescriptors[p]) && LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p])) {
658 output_ladspaport[c] = p;
659 } else {
660 pa_log("Port %s is not an output ladspa port", pname);
661 pa_xfree(pname);
662 goto fail;
666 c++;
667 pa_xfree(pname);
672 u->block_size = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss);
674 /* Create buffers */
675 if (LADSPA_IS_INPLACE_BROKEN(d->Properties)) {
676 u->input = (LADSPA_Data**) pa_xnew(LADSPA_Data*, (unsigned) u->input_count);
677 for (c = 0; c < u->input_count; c++)
678 u->input[c] = (LADSPA_Data*) pa_xnew(uint8_t, (unsigned) u->block_size);
679 u->output = (LADSPA_Data**) pa_xnew(LADSPA_Data*, (unsigned) u->output_count);
680 for (c = 0; c < u->output_count; c++)
681 u->output[c] = (LADSPA_Data*) pa_xnew(uint8_t, (unsigned) u->block_size);
682 } else {
683 u->input = (LADSPA_Data**) pa_xnew(LADSPA_Data*, (unsigned) u->max_ladspaport_count);
684 for (c = 0; c < u->max_ladspaport_count; c++)
685 u->input[c] = (LADSPA_Data*) pa_xnew(uint8_t, (unsigned) u->block_size);
686 u->output = u->input;
688 /* Initialize plugin instances */
689 for (h = 0; h < (u->channels / u->max_ladspaport_count); h++) {
690 if (!(u->handle[h] = d->instantiate(d, ss.rate))) {
691 pa_log("Failed to instantiate plugin %s with label %s", plugin, d->Label);
692 goto fail;
695 for (c = 0; c < u->input_count; c++)
696 d->connect_port(u->handle[h], input_ladspaport[c], u->input[c]);
697 for (c = 0; c < u->output_count; c++)
698 d->connect_port(u->handle[h], output_ladspaport[c], u->output[c]);
701 if (!cdata && n_control > 0) {
702 pa_log("This plugin requires specification of %lu control parameters.", n_control);
703 goto fail;
706 if (n_control > 0) {
707 const char *state = NULL;
708 char *k;
710 u->control = pa_xnew(LADSPA_Data, (unsigned) n_control);
711 use_default = pa_xnew(pa_bool_t, (unsigned) n_control);
712 p = 0;
714 while ((k = pa_split(cdata, ",", &state)) && p < n_control) {
715 double f;
717 if (*k == 0) {
718 use_default[p++] = TRUE;
719 pa_xfree(k);
720 continue;
723 if (pa_atod(k, &f) < 0) {
724 pa_log("Failed to parse control value '%s'", k);
725 pa_xfree(k);
726 goto fail;
729 pa_xfree(k);
731 use_default[p] = FALSE;
732 u->control[p++] = (LADSPA_Data) f;
735 /* The previous loop doesn't take the last control value into account
736 if it is left empty, so we do it here. */
737 if (*cdata == 0 || cdata[strlen(cdata) - 1] == ',') {
738 if (p < n_control)
739 use_default[p] = TRUE;
740 p++;
743 if (p > n_control || k) {
744 pa_log("Too many control values passed, %lu expected.", n_control);
745 pa_xfree(k);
746 goto fail;
749 if (p < n_control) {
750 pa_log("Not enough control values passed, %lu expected, %lu passed.", n_control, p);
751 goto fail;
754 h = 0;
755 for (p = 0; p < d->PortCount; p++) {
756 LADSPA_PortRangeHintDescriptor hint = d->PortRangeHints[p].HintDescriptor;
758 if (!LADSPA_IS_PORT_CONTROL(d->PortDescriptors[p]))
759 continue;
761 if (LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p])) {
762 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++)
763 d->connect_port(u->handle[c], p, &u->control_out);
764 continue;
767 pa_assert(h < n_control);
769 if (use_default[h]) {
770 LADSPA_Data lower, upper;
772 if (!LADSPA_IS_HINT_HAS_DEFAULT(hint)) {
773 pa_log("Control port value left empty but plugin defines no default.");
774 goto fail;
777 lower = d->PortRangeHints[p].LowerBound;
778 upper = d->PortRangeHints[p].UpperBound;
780 if (LADSPA_IS_HINT_SAMPLE_RATE(hint)) {
781 lower *= (LADSPA_Data) ss.rate;
782 upper *= (LADSPA_Data) ss.rate;
785 switch (hint & LADSPA_HINT_DEFAULT_MASK) {
787 case LADSPA_HINT_DEFAULT_MINIMUM:
788 u->control[h] = lower;
789 break;
791 case LADSPA_HINT_DEFAULT_MAXIMUM:
792 u->control[h] = upper;
793 break;
795 case LADSPA_HINT_DEFAULT_LOW:
796 if (LADSPA_IS_HINT_LOGARITHMIC(hint))
797 u->control[h] = (LADSPA_Data) exp(log(lower) * 0.75 + log(upper) * 0.25);
798 else
799 u->control[h] = (LADSPA_Data) (lower * 0.75 + upper * 0.25);
800 break;
802 case LADSPA_HINT_DEFAULT_MIDDLE:
803 if (LADSPA_IS_HINT_LOGARITHMIC(hint))
804 u->control[h] = (LADSPA_Data) exp(log(lower) * 0.5 + log(upper) * 0.5);
805 else
806 u->control[h] = (LADSPA_Data) (lower * 0.5 + upper * 0.5);
807 break;
809 case LADSPA_HINT_DEFAULT_HIGH:
810 if (LADSPA_IS_HINT_LOGARITHMIC(hint))
811 u->control[h] = (LADSPA_Data) exp(log(lower) * 0.25 + log(upper) * 0.75);
812 else
813 u->control[h] = (LADSPA_Data) (lower * 0.25 + upper * 0.75);
814 break;
816 case LADSPA_HINT_DEFAULT_0:
817 u->control[h] = 0;
818 break;
820 case LADSPA_HINT_DEFAULT_1:
821 u->control[h] = 1;
822 break;
824 case LADSPA_HINT_DEFAULT_100:
825 u->control[h] = 100;
826 break;
828 case LADSPA_HINT_DEFAULT_440:
829 u->control[h] = 440;
830 break;
832 default:
833 pa_assert_not_reached();
837 if (LADSPA_IS_HINT_INTEGER(hint))
838 u->control[h] = roundf(u->control[h]);
840 pa_log_debug("Binding %f to port %s", u->control[h], d->PortNames[p]);
842 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++)
843 d->connect_port(u->handle[c], p, &u->control[h]);
845 h++;
848 pa_assert(h == n_control);
851 if (d->activate)
852 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++)
853 d->activate(u->handle[c]);
855 /* Create sink */
856 pa_sink_new_data_init(&sink_data);
857 sink_data.driver = __FILE__;
858 sink_data.module = m;
859 if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
860 sink_data.name = pa_sprintf_malloc("%s.ladspa", master->name);
861 pa_sink_new_data_set_sample_spec(&sink_data, &ss);
862 pa_sink_new_data_set_channel_map(&sink_data, &map);
863 pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
864 pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
865 pa_proplist_sets(sink_data.proplist, "device.ladspa.module", plugin);
866 pa_proplist_sets(sink_data.proplist, "device.ladspa.label", d->Label);
867 pa_proplist_sets(sink_data.proplist, "device.ladspa.name", d->Name);
868 pa_proplist_sets(sink_data.proplist, "device.ladspa.maker", d->Maker);
869 pa_proplist_sets(sink_data.proplist, "device.ladspa.copyright", d->Copyright);
870 pa_proplist_setf(sink_data.proplist, "device.ladspa.unique_id", "%lu", (unsigned long) d->UniqueID);
872 if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
873 pa_log("Invalid properties");
874 pa_sink_new_data_done(&sink_data);
875 goto fail;
878 if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) {
879 const char *z;
881 z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
882 pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "LADSPA Plugin %s on %s", d->Name, z ? z : master->name);
885 u->sink = pa_sink_new(m->core, &sink_data,
886 PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME|
887 (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)));
888 pa_sink_new_data_done(&sink_data);
890 if (!u->sink) {
891 pa_log("Failed to create sink.");
892 goto fail;
895 u->sink->parent.process_msg = sink_process_msg_cb;
896 u->sink->set_state = sink_set_state_cb;
897 u->sink->update_requested_latency = sink_update_requested_latency_cb;
898 u->sink->request_rewind = sink_request_rewind_cb;
899 u->sink->set_volume = sink_set_volume_cb;
900 u->sink->set_mute = sink_set_mute_cb;
901 u->sink->userdata = u;
903 pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
905 /* Create sink input */
906 pa_sink_input_new_data_init(&sink_input_data);
907 sink_input_data.driver = __FILE__;
908 sink_input_data.module = m;
909 pa_sink_input_new_data_set_sink(&sink_input_data, master, FALSE);
910 sink_input_data.origin_sink = u->sink;
911 pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "LADSPA Stream");
912 pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
913 pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
914 pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
916 pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
917 pa_sink_input_new_data_done(&sink_input_data);
919 if (!u->sink_input)
920 goto fail;
922 u->sink_input->pop = sink_input_pop_cb;
923 u->sink_input->process_rewind = sink_input_process_rewind_cb;
924 u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
925 u->sink_input->update_max_request = sink_input_update_max_request_cb;
926 u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
927 u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb;
928 u->sink_input->kill = sink_input_kill_cb;
929 u->sink_input->attach = sink_input_attach_cb;
930 u->sink_input->detach = sink_input_detach_cb;
931 u->sink_input->state_change = sink_input_state_change_cb;
932 u->sink_input->may_move_to = sink_input_may_move_to_cb;
933 u->sink_input->moving = sink_input_moving_cb;
934 u->sink_input->volume_changed = sink_input_volume_changed_cb;
935 u->sink_input->mute_changed = sink_input_mute_changed_cb;
936 u->sink_input->userdata = u;
938 u->sink->input_to_master = u->sink_input;
940 pa_sink_put(u->sink);
941 pa_sink_input_put(u->sink_input);
943 pa_modargs_free(ma);
944 pa_xfree(use_default);
946 return 0;
948 fail:
949 if (ma)
950 pa_modargs_free(ma);
952 pa_xfree(use_default);
954 pa__done(m);
956 return -1;
959 int pa__get_n_used(pa_module *m) {
960 struct userdata *u;
962 pa_assert(m);
963 pa_assert_se(u = m->userdata);
965 return pa_sink_linked_by(u->sink);
968 void pa__done(pa_module*m) {
969 struct userdata *u;
970 unsigned c;
972 pa_assert(m);
974 if (!(u = m->userdata))
975 return;
977 /* See comments in sink_input_kill_cb() above regarding
978 * destruction order! */
980 if (u->sink_input)
981 pa_sink_input_unlink(u->sink_input);
983 if (u->sink)
984 pa_sink_unlink(u->sink);
986 if (u->sink_input)
987 pa_sink_input_unref(u->sink_input);
989 if (u->sink)
990 pa_sink_unref(u->sink);
992 for (c = 0; c < (u->channels / u->max_ladspaport_count); c++) {
993 if (u->handle[c]) {
994 if (u->descriptor->deactivate)
995 u->descriptor->deactivate(u->handle[c]);
996 u->descriptor->cleanup(u->handle[c]);
1000 if (u->output == u->input) {
1001 if (u->input != NULL) {
1002 for (c = 0; c < u->max_ladspaport_count; c++)
1003 pa_xfree(u->input[c]);
1004 pa_xfree(u->input);
1006 } else {
1007 if (u->input != NULL) {
1008 for (c = 0; c < u->input_count; c++)
1009 pa_xfree(u->input[c]);
1010 pa_xfree(u->input);
1012 if (u->output != NULL) {
1013 for (c = 0; c < u->output_count; c++)
1014 pa_xfree(u->output[c]);
1015 pa_xfree(u->output);
1019 if (u->memblockq)
1020 pa_memblockq_free(u->memblockq);
1022 pa_xfree(u->control);
1023 pa_xfree(u);