]> code.delx.au - pulseaudio/blob - src/sourceoutput.c
add dependency script
[pulseaudio] / 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 }