Git init
[framework/multimedia/pulseaudio.git] / src / modules / module-virtual-sink.c
1 /***
2     This file is part of PulseAudio.
3
4     Copyright 2010 Intel Corporation
5     Contributor: Pierre-Louis Bossart <pierre-louis.bossart@intel.com>
6
7     PulseAudio is free software; you can redistribute it and/or modify
8     it under the terms of the GNU Lesser General Public License as published
9     by the Free Software Foundation; either version 2.1 of the License,
10     or (at your option) any later version.
11
12     PulseAudio is distributed in the hope that it will be useful, but
13     WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15     General Public License for more details.
16
17     You should have received a copy of the GNU Lesser General Public License
18     along with PulseAudio; if not, write to the Free Software
19     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20     USA.
21 ***/
22
23 /* TODO: Some plugins cause latency, and some even report it by using a control
24    out port. We don't currently use the latency information. */
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include <pulse/xmalloc.h>
31 #include <pulse/i18n.h>
32
33 #include <pulsecore/core-error.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/thread.h>
41 #include <pulsecore/thread-mq.h>
42 #include <pulsecore/rtpoll.h>
43 #include <pulsecore/sample-util.h>
44 #include <pulsecore/ltdl-helper.h>
45
46 #include "module-virtual-sink-symdef.h"
47
48 PA_MODULE_AUTHOR("Pierre-Louis Bossart");
49 PA_MODULE_DESCRIPTION(_("Virtual sink"));
50 PA_MODULE_VERSION(PACKAGE_VERSION);
51 PA_MODULE_LOAD_ONCE(FALSE);
52 PA_MODULE_USAGE(
53         _("sink_name=<name for the sink> "
54           "sink_properties=<properties for the sink> "
55           "master=<name of sink to filter> "
56           "format=<sample format> "
57           "rate=<sample rate> "
58           "channels=<number of channels> "
59           "channel_map=<channel map> "
60         ));
61
62 #define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
63
64 struct userdata {
65     pa_module *module;
66
67     pa_sink *sink;
68     pa_sink_input *sink_input;
69
70     pa_memblockq *memblockq;
71
72     pa_bool_t auto_desc;
73     unsigned channels;
74 };
75
76 static const char* const valid_modargs[] = {
77     "sink_name",
78     "sink_properties",
79     "master",
80     "format",
81     "rate",
82     "channels",
83     "channel_map",
84     NULL
85 };
86
87 /* Called from I/O thread context */
88 static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
89     struct userdata *u = PA_SINK(o)->userdata;
90
91     switch (code) {
92
93         case PA_SINK_MESSAGE_GET_LATENCY:
94
95             /* The sink is _put() before the sink input is, so let's
96              * make sure we don't access it in that time. Also, the
97              * sink input is first shut down, the sink second. */
98             if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
99                 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) {
100                 *((pa_usec_t*) data) = 0;
101                 return 0;
102             }
103
104             *((pa_usec_t*) data) =
105
106                 /* Get the latency of the master sink */
107                 pa_sink_get_latency_within_thread(u->sink_input->sink) +
108
109                 /* Add the latency internal to our sink input on top */
110                 pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
111
112             return 0;
113     }
114
115     return pa_sink_process_msg(o, code, data, offset, chunk);
116 }
117
118 /* Called from main context */
119 static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
120     struct userdata *u;
121
122     pa_sink_assert_ref(s);
123     pa_assert_se(u = s->userdata);
124
125     if (!PA_SINK_IS_LINKED(state) ||
126         !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
127         return 0;
128
129     pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
130     return 0;
131 }
132
133 /* Called from I/O thread context */
134 static void sink_request_rewind_cb(pa_sink *s) {
135     struct userdata *u;
136
137     pa_sink_assert_ref(s);
138     pa_assert_se(u = s->userdata);
139
140     if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
141         !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
142         return;
143
144     /* Just hand this one over to the master sink */
145     pa_sink_input_request_rewind(u->sink_input,
146                                  s->thread_info.rewind_nbytes +
147                                  pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE);
148 }
149
150 /* Called from I/O thread context */
151 static void sink_update_requested_latency_cb(pa_sink *s) {
152     struct userdata *u;
153
154     pa_sink_assert_ref(s);
155     pa_assert_se(u = s->userdata);
156
157     if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
158         !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
159         return;
160
161     /* Just hand this one over to the master sink */
162     pa_sink_input_set_requested_latency_within_thread(
163             u->sink_input,
164             pa_sink_get_requested_latency_within_thread(s));
165 }
166
167 /* Called from main context */
168 static void sink_set_volume_cb(pa_sink *s) {
169     struct userdata *u;
170
171     pa_sink_assert_ref(s);
172     pa_assert_se(u = s->userdata);
173
174     if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
175         !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
176         return;
177
178     pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE);
179 }
180
181 /* Called from main context */
182 static void sink_set_mute_cb(pa_sink *s) {
183     struct userdata *u;
184
185     pa_sink_assert_ref(s);
186     pa_assert_se(u = s->userdata);
187
188     if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
189         !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
190         return;
191
192     pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
193 }
194
195 /* Called from I/O thread context */
196 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
197     struct userdata *u;
198     float *src, *dst;
199     size_t fs;
200     unsigned n, c;
201     pa_memchunk tchunk;
202     pa_usec_t current_latency;
203
204     pa_sink_input_assert_ref(i);
205     pa_assert(chunk);
206     pa_assert_se(u = i->userdata);
207
208     /* Hmm, process any rewind request that might be queued up */
209     pa_sink_process_rewind(u->sink, 0);
210
211     /* (1) IF YOU NEED A FIXED BLOCK SIZE USE
212      * pa_memblockq_peek_fixed_size() HERE INSTEAD. NOTE THAT FILTERS
213      * WHICH CAN DEAL WITH DYNAMIC BLOCK SIZES ARE HIGHLY
214      * PREFERRED. */
215     while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
216         pa_memchunk nchunk;
217
218         pa_sink_render(u->sink, nbytes, &nchunk);
219         pa_memblockq_push(u->memblockq, &nchunk);
220         pa_memblock_unref(nchunk.memblock);
221     }
222
223     /* (2) IF YOU NEED A FIXED BLOCK SIZE, THIS NEXT LINE IS NOT
224      * NECESSARY */
225     tchunk.length = PA_MIN(nbytes, tchunk.length);
226     pa_assert(tchunk.length > 0);
227
228     fs = pa_frame_size(&i->sample_spec);
229     n = (unsigned) (tchunk.length / fs);
230
231     pa_assert(n > 0);
232
233     chunk->index = 0;
234     chunk->length = n*fs;
235     chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
236
237     pa_memblockq_drop(u->memblockq, chunk->length);
238
239     src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
240     dst = (float*) pa_memblock_acquire(chunk->memblock);
241
242     /* (3) PUT YOUR CODE HERE TO DO SOMETHING WITH THE DATA */
243
244     /* As an example, copy input to output */
245     for (c = 0; c < u->channels; c++) {
246         pa_sample_clamp(PA_SAMPLE_FLOAT32NE,
247                         dst+c, u->channels * sizeof(float),
248                         src+c, u->channels * sizeof(float),
249                         n);
250     }
251
252     pa_memblock_release(tchunk.memblock);
253     pa_memblock_release(chunk->memblock);
254
255     pa_memblock_unref(tchunk.memblock);
256
257     /* (4) IF YOU NEED THE LATENCY FOR SOMETHING ACQUIRE IT LIKE THIS: */
258     current_latency =
259         /* Get the latency of the master sink */
260         pa_sink_get_latency_within_thread(i->sink) +
261
262         /* Add the latency internal to our sink input on top */
263         pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
264
265     return 0;
266 }
267
268 /* Called from I/O thread context */
269 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
270     struct userdata *u;
271     size_t amount = 0;
272
273     pa_sink_input_assert_ref(i);
274     pa_assert_se(u = i->userdata);
275
276     if (u->sink->thread_info.rewind_nbytes > 0) {
277         size_t max_rewrite;
278
279         max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq);
280         amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
281         u->sink->thread_info.rewind_nbytes = 0;
282
283         if (amount > 0) {
284             pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
285
286             /* (5) PUT YOUR CODE HERE TO RESET YOUR FILTER  */
287         }
288     }
289
290     pa_sink_process_rewind(u->sink, amount);
291     pa_memblockq_rewind(u->memblockq, nbytes);
292 }
293
294 /* Called from I/O thread context */
295 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
296     struct userdata *u;
297
298     pa_sink_input_assert_ref(i);
299     pa_assert_se(u = i->userdata);
300
301     pa_memblockq_set_maxrewind(u->memblockq, nbytes);
302     pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
303 }
304
305 /* Called from I/O thread context */
306 static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
307     struct userdata *u;
308
309     pa_sink_input_assert_ref(i);
310     pa_assert_se(u = i->userdata);
311
312     /* (6) IF YOU NEED A FIXED BLOCK SIZE ROUND nbytes UP TO MULTIPLES
313      * OF IT HERE. THE PA_ROUND_UP MACRO IS USEFUL FOR THAT. */
314
315     pa_sink_set_max_request_within_thread(u->sink, nbytes);
316 }
317
318 /* Called from I/O thread context */
319 static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
320     struct userdata *u;
321
322     pa_sink_input_assert_ref(i);
323     pa_assert_se(u = i->userdata);
324
325     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
326 }
327
328 /* Called from I/O thread context */
329 static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) {
330     struct userdata *u;
331
332     pa_sink_input_assert_ref(i);
333     pa_assert_se(u = i->userdata);
334
335     /* (7) IF YOU NEED A FIXED BLOCK SIZE ADD THE LATENCY FOR ONE
336      * BLOCK MINUS ONE SAMPLE HERE. pa_usec_to_bytes_round_up() IS
337      * USEFUL FOR THAT. */
338
339     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
340 }
341
342 /* Called from I/O thread context */
343 static void sink_input_detach_cb(pa_sink_input *i) {
344     struct userdata *u;
345
346     pa_sink_input_assert_ref(i);
347     pa_assert_se(u = i->userdata);
348
349     pa_sink_detach_within_thread(u->sink);
350
351     pa_sink_set_rtpoll(u->sink, NULL);
352 }
353
354 /* Called from I/O thread context */
355 static void sink_input_attach_cb(pa_sink_input *i) {
356     struct userdata *u;
357
358     pa_sink_input_assert_ref(i);
359     pa_assert_se(u = i->userdata);
360
361     pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
362     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
363
364     /* (8.1) IF YOU NEED A FIXED BLOCK SIZE ADD THE LATENCY FOR ONE
365      * BLOCK MINUS ONE SAMPLE HERE. SEE (7) */
366     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
367
368     /* (8.2) IF YOU NEED A FIXED BLOCK SIZE ROUND
369      * pa_sink_input_get_max_request(i) UP TO MULTIPLES OF IT
370      * HERE. SEE (6) */
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));
373
374     pa_sink_attach_within_thread(u->sink);
375 }
376
377 /* Called from main context */
378 static void sink_input_kill_cb(pa_sink_input *i) {
379     struct userdata *u;
380
381     pa_sink_input_assert_ref(i);
382     pa_assert_se(u = i->userdata);
383
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);
389
390     pa_sink_input_unref(u->sink_input);
391     u->sink_input = NULL;
392
393     pa_sink_unref(u->sink);
394     u->sink = NULL;
395
396     pa_module_unload_request(u->module, TRUE);
397 }
398
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;
402
403     pa_sink_input_assert_ref(i);
404     pa_assert_se(u = i->userdata);
405
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);
412     }
413 }
414
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;
418
419     pa_sink_input_assert_ref(i);
420     pa_assert_se(u = i->userdata);
421
422     return u->sink != dest;
423 }
424
425 /* Called from main context */
426 static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
427     struct userdata *u;
428
429     pa_sink_input_assert_ref(i);
430     pa_assert_se(u = i->userdata);
431
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);
437
438     if (u->auto_desc && dest) {
439         const char *z;
440         pa_proplist *pl;
441
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, "Virtual Sink %s on %s",
445                          pa_proplist_gets(u->sink->proplist, "device.vsink.name"), z ? z : dest->name);
446
447         pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl);
448         pa_proplist_free(pl);
449     }
450 }
451
452 /* Called from main context */
453 static void sink_input_volume_changed_cb(pa_sink_input *i) {
454     struct userdata *u;
455
456     pa_sink_input_assert_ref(i);
457     pa_assert_se(u = i->userdata);
458
459     pa_sink_volume_changed(u->sink, &i->volume);
460 }
461
462 /* Called from main context */
463 static void sink_input_mute_changed_cb(pa_sink_input *i) {
464     struct userdata *u;
465
466     pa_sink_input_assert_ref(i);
467     pa_assert_se(u = i->userdata);
468
469     pa_sink_mute_changed(u->sink, i->muted);
470 }
471
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     pa_sink *master=NULL;
478     pa_sink_input_new_data sink_input_data;
479     pa_sink_new_data sink_data;
480     pa_bool_t *use_default = NULL;
481
482     pa_assert(m);
483
484     if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
485         pa_log("Failed to parse module arguments.");
486         goto fail;
487     }
488
489     if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
490         pa_log("Master sink not found");
491         goto fail;
492     }
493
494     pa_assert(master);
495
496     ss = master->sample_spec;
497     ss.format = PA_SAMPLE_FLOAT32;
498     map = master->channel_map;
499     if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
500         pa_log("Invalid sample format specification or channel map");
501         goto fail;
502     }
503
504     u = pa_xnew0(struct userdata, 1);
505     u->module = m;
506     m->userdata = u;
507     u->channels = ss.channels;
508
509     /* Create sink */
510     pa_sink_new_data_init(&sink_data);
511     sink_data.driver = __FILE__;
512     sink_data.module = m;
513     if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
514         sink_data.name = pa_sprintf_malloc("%s.vsink", master->name);
515     pa_sink_new_data_set_sample_spec(&sink_data, &ss);
516     pa_sink_new_data_set_channel_map(&sink_data, &map);
517     pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
518     pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
519     pa_proplist_sets(sink_data.proplist, "device.vsink.name", sink_data.name);
520
521     if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
522         pa_log("Invalid properties");
523         pa_sink_new_data_done(&sink_data);
524         goto fail;
525     }
526
527     if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) {
528         const char *z;
529
530         z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
531         pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Virtual Sink %s on %s", sink_data.name, z ? z : master->name);
532     }
533
534     u->sink = pa_sink_new(m->core, &sink_data,
535                           PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME|
536                           (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)));
537     pa_sink_new_data_done(&sink_data);
538
539     if (!u->sink) {
540         pa_log("Failed to create sink.");
541         goto fail;
542     }
543
544     u->sink->parent.process_msg = sink_process_msg_cb;
545     u->sink->set_state = sink_set_state_cb;
546     u->sink->update_requested_latency = sink_update_requested_latency_cb;
547     u->sink->request_rewind = sink_request_rewind_cb;
548     u->sink->set_volume = sink_set_volume_cb;
549     u->sink->set_mute = sink_set_mute_cb;
550     u->sink->userdata = u;
551
552     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
553
554     /* Create sink input */
555     pa_sink_input_new_data_init(&sink_input_data);
556     sink_input_data.driver = __FILE__;
557     sink_input_data.module = m;
558     sink_input_data.sink = master;
559     pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Virtual Sink Stream");
560     pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
561     pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
562     pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
563
564     pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
565     pa_sink_input_new_data_done(&sink_input_data);
566
567     if (!u->sink_input)
568         goto fail;
569
570     u->sink_input->pop = sink_input_pop_cb;
571     u->sink_input->process_rewind = sink_input_process_rewind_cb;
572     u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
573     u->sink_input->update_max_request = sink_input_update_max_request_cb;
574     u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
575     u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb;
576     u->sink_input->kill = sink_input_kill_cb;
577     u->sink_input->attach = sink_input_attach_cb;
578     u->sink_input->detach = sink_input_detach_cb;
579     u->sink_input->state_change = sink_input_state_change_cb;
580     u->sink_input->may_move_to = sink_input_may_move_to_cb;
581     u->sink_input->moving = sink_input_moving_cb;
582     u->sink_input->volume_changed = sink_input_volume_changed_cb;
583     u->sink_input->mute_changed = sink_input_mute_changed_cb;
584     u->sink_input->userdata = u;
585
586     /* (9) IF YOU REQUIRE A FIXED BLOCK SIZE MAKE SURE TO PASS A
587      * SILENCE MEMBLOCK AS LAST PARAMETER
588      * HERE. pa_sink_input_get_silence() IS USEFUL HERE. */
589     u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
590
591     /* (10) INITIALIZE ANYTHING ELSE YOU NEED HERE */
592
593     pa_sink_put(u->sink);
594     pa_sink_input_put(u->sink_input);
595
596     pa_modargs_free(ma);
597
598     pa_xfree(use_default);
599
600     return 0;
601
602  fail:
603     if (ma)
604         pa_modargs_free(ma);
605
606     pa_xfree(use_default);
607
608     pa__done(m);
609
610     return -1;
611 }
612
613 int pa__get_n_used(pa_module *m) {
614     struct userdata *u;
615
616     pa_assert(m);
617     pa_assert_se(u = m->userdata);
618
619     return pa_sink_linked_by(u->sink);
620 }
621
622 void pa__done(pa_module*m) {
623     struct userdata *u;
624
625     pa_assert(m);
626
627     if (!(u = m->userdata))
628         return;
629
630     /* See comments in sink_input_kill_cb() above regarding
631      * destruction order! */
632
633     if (u->sink_input)
634         pa_sink_input_unlink(u->sink_input);
635
636     if (u->sink)
637         pa_sink_unlink(u->sink);
638
639     if (u->sink_input)
640         pa_sink_input_unref(u->sink_input);
641
642     if (u->sink)
643         pa_sink_unref(u->sink);
644
645     if (u->memblockq)
646         pa_memblockq_free(u->memblockq);
647
648     pa_xfree(u);
649 }