X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/f9e2058820c2a51994708ad11d1ed8e09b12b8b1..fa499dad06ba6558111cdef64c18f2401e803cff:/polyp/source-output.c diff --git a/polyp/source-output.c b/polyp/source-output.c index 1db88d3c..e339d4ac 100644 --- a/polyp/source-output.c +++ b/polyp/source-output.c @@ -4,7 +4,7 @@ This file is part of polypaudio. polypaudio is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published + it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Lesser General Public License along with polypaudio; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. @@ -33,7 +33,7 @@ #include "subscribe.h" #include "log.h" -struct pa_source_output* pa_source_output_new(struct pa_source *s, const char *name, const struct pa_sample_spec *spec) { +struct pa_source_output* pa_source_output_new(struct pa_source *s, const char *name, const struct pa_sample_spec *spec, int resample_method) { struct pa_source_output *o; struct pa_resampler *resampler = NULL; int r; @@ -44,8 +44,11 @@ struct pa_source_output* pa_source_output_new(struct pa_source *s, const char *n return NULL; } + if (resample_method < 0) + resample_method = s->core->resample_method; + if (!pa_sample_spec_equal(&s->sample_spec, spec)) - if (!(resampler = pa_resampler_new(&s->sample_spec, spec, s->core->memblock_stat))) + if (!(resampler = pa_resampler_new(&s->sample_spec, spec, s->core->memblock_stat, resample_method))) return NULL; o = pa_xmalloc(sizeof(struct pa_source_output)); @@ -76,7 +79,7 @@ struct pa_source_output* pa_source_output_new(struct pa_source *s, const char *n } void pa_source_output_disconnect(struct pa_source_output*o) { - assert(o && o->state == PA_SOURCE_OUTPUT_RUNNING && o->source && o->source->core); + assert(o && o->state != PA_SOURCE_OUTPUT_DISCONNECTED && o->source && o->source->core); pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL); pa_idxset_remove_by_data(o->source->outputs, o, NULL); @@ -130,6 +133,9 @@ void pa_source_output_push(struct pa_source_output *o, const struct pa_memchunk struct pa_memchunk rchunk; assert(o && chunk && chunk->length && o->push); + if (o->state == PA_SOURCE_OUTPUT_CORKED) + return; + if (!o->resampler) { o->push(o, chunk); return; @@ -160,3 +166,12 @@ pa_usec_t pa_source_output_get_latency(struct pa_source_output *o) { return 0; } + +void pa_source_output_cork(struct pa_source_output *o, int b) { + assert(o && o->ref >= 1); + + if (o->state == PA_SOURCE_OUTPUT_DISCONNECTED) + return; + + o->state = b ? PA_SOURCE_OUTPUT_CORKED : PA_SOURCE_OUTPUT_RUNNING; +}