make a symbol in module-ptorocol-stub static
[profile/ivi/pulseaudio.git] / src / sourceoutput.c
1 #include <assert.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "sourceoutput.h"
6
7 struct pa_source_output* pa_source_output_new(struct pa_source *s, const char *name, const struct pa_sample_spec *spec) {
8     struct pa_source_output *o;
9     struct pa_resampler *resampler = NULL;
10     int r;
11     assert(s && spec);
12
13     if (!pa_sample_spec_equal(&s->sample_spec, spec))
14         if (!(resampler = pa_resampler_new(&s->sample_spec, spec)))
15             return NULL;
16     
17     o = malloc(sizeof(struct pa_source_output));
18     assert(o);
19     o->name = name ? strdup(name) : NULL;
20     o->client = NULL;
21     o->owner = NULL;
22     o->source = s;
23     o->sample_spec = *spec;
24
25     o->push = NULL;
26     o->kill = NULL;
27     o->userdata = NULL;
28     o->resampler = resampler;
29     
30     assert(s->core);
31     r = pa_idxset_put(s->core->source_outputs, o, &o->index);
32     assert(r == 0 && o->index != PA_IDXSET_INVALID);
33     r = pa_idxset_put(s->outputs, o, NULL);
34     assert(r == 0);
35     
36     return o;    
37 }
38
39 void pa_source_output_free(struct pa_source_output* o) {
40     assert(o);
41
42     assert(o->source && o->source->core);
43     pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL);
44     pa_idxset_remove_by_data(o->source->outputs, o, NULL);
45
46     if (o->resampler)
47         pa_resampler_free(o->resampler);
48     
49     free(o->name);
50     free(o);
51 }
52
53 void pa_source_output_kill(struct pa_source_output*i) {
54     assert(i);
55
56     if (i->kill)
57         i->kill(i);
58 }
59
60 void pa_source_output_push(struct pa_source_output *o, const struct pa_memchunk *chunk) {
61     struct pa_memchunk rchunk;
62     assert(o && chunk && chunk->length && o->push);
63
64     if (!o->resampler) {
65         o->push(o, chunk);
66         return;
67     }
68
69     pa_resampler_run(o->resampler, chunk, &rchunk);
70     if (!rchunk.length)
71         return;
72     
73     assert(rchunk.memblock);
74     o->push(o, &rchunk);
75     pa_memblock_unref(rchunk.memblock);
76 }