5 #include "sourceoutput.h"
8 struct pa_source_output
* pa_source_output_new(struct pa_source
*s
, const char *name
, const struct pa_sample_spec
*spec
) {
9 struct pa_source_output
*o
;
10 struct pa_resampler
*resampler
= NULL
;
14 if (!pa_sample_spec_equal(&s
->sample_spec
, spec
))
15 if (!(resampler
= pa_resampler_new(&s
->sample_spec
, spec
)))
18 o
= malloc(sizeof(struct pa_source_output
));
20 o
->name
= name
? strdup(name
) : NULL
;
24 o
->sample_spec
= *spec
;
29 o
->resampler
= resampler
;
32 r
= pa_idxset_put(s
->core
->source_outputs
, o
, &o
->index
);
33 assert(r
== 0 && o
->index
!= PA_IDXSET_INVALID
);
34 r
= pa_idxset_put(s
->outputs
, o
, NULL
);
40 void pa_source_output_free(struct pa_source_output
* o
) {
43 assert(o
->source
&& o
->source
->core
);
44 pa_idxset_remove_by_data(o
->source
->core
->source_outputs
, o
, NULL
);
45 pa_idxset_remove_by_data(o
->source
->outputs
, o
, NULL
);
48 pa_resampler_free(o
->resampler
);
54 void pa_source_output_kill(struct pa_source_output
*i
) {
61 char *pa_source_output_list_to_string(struct pa_core
*c
) {
63 struct pa_source_output
*o
;
64 uint32_t index
= PA_IDXSET_INVALID
;
70 pa_strbuf_printf(s
, "%u source outputs(s) available.\n", pa_idxset_ncontents(c
->source_outputs
));
72 for (o
= pa_idxset_first(c
->source_outputs
, &index
); o
; o
= pa_idxset_next(c
->source_outputs
, &index
)) {
73 char ss
[PA_SAMPLE_SNPRINT_MAX_LENGTH
];
74 pa_sample_snprint(ss
, sizeof(ss
), &o
->sample_spec
);
77 s
, " index: %u\n\tname: <%s>\n\tsource: <%u>\n\tsample_spec: <%s>\n",
83 pa_strbuf_printf(s
, "\towner module: <%u>\n", o
->owner
->index
);
85 pa_strbuf_printf(s
, "\tclient: <%u>\n", o
->client
->index
);
88 return pa_strbuf_tostring_free(s
);
91 void pa_source_output_push(struct pa_source_output
*o
, const struct pa_memchunk
*chunk
) {
92 struct pa_memchunk rchunk
;
93 assert(o
&& chunk
&& chunk
->length
&& o
->push
);
100 pa_resampler_run(o
->resampler
, chunk
, &rchunk
);
104 assert(rchunk
.memblock
);
106 pa_memblock_unref(rchunk
.memblock
);