diff options
Diffstat (limited to 'src/pulsecore/source-output.c')
| -rw-r--r-- | src/pulsecore/source-output.c | 19 | 
1 files changed, 16 insertions, 3 deletions
| diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c index 2ed4bb56..8f7aa49b 100644 --- a/src/pulsecore/source-output.c +++ b/src/pulsecore/source-output.c @@ -114,6 +114,8 @@ pa_source_output* pa_source_output_new(      pa_return_null_if_fail(data->source);      pa_return_null_if_fail(pa_source_get_state(data->source) != PA_SOURCE_UNLINKED); +    pa_return_null_if_fail(!data->direct_on_input || data->direct_on_input->sink == data->source->monitor_of); +      if (!data->sample_spec_is_set)          data->sample_spec = data->source->sample_spec; @@ -192,6 +194,8 @@ pa_source_output* pa_source_output_new(      o->sample_spec = data->sample_spec;      o->channel_map = data->channel_map; +    o->direct_on_input = data->direct_on_input; +      reset_callbacks(o);      o->userdata = NULL; @@ -200,6 +204,7 @@ pa_source_output* pa_source_output_new(      o->thread_info.sample_spec = o->sample_spec;      o->thread_info.resampler = resampler;      o->thread_info.requested_source_latency = (pa_usec_t) -1; +    o->thread_info.direct_on_input = o->direct_on_input;      o->thread_info.delay_memblockq = pa_memblockq_new(              0, @@ -214,6 +219,9 @@ pa_source_output* pa_source_output_new(      pa_assert_se(pa_idxset_put(core->source_outputs, o, &o->index) == 0);      pa_assert_se(pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL) == 0); +    if (o->direct_on_input) +        pa_assert_se(pa_idxset_put(o->direct_on_input->direct_outputs, o, NULL) == 0); +      pa_log_info("Created output %u \"%s\" on %s with sample spec %s and channel map %s",                  o->index,                  pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_MEDIA_NAME)), @@ -269,6 +277,8 @@ void pa_source_output_unlink(pa_source_output*o) {      if (linked)          pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], o); +    if (o->direct_on_input) +        pa_idxset_remove_by_data(o->direct_on_input->direct_outputs, o, NULL);      pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL);      if (pa_idxset_remove_by_data(o->source->outputs, o, NULL))          pa_source_output_unref(o); @@ -368,10 +378,10 @@ void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) {      pa_assert(chunk);      pa_assert(pa_frame_aligned(chunk->length, &o->source->sample_spec)); -    if (!o->push || o->state == PA_SOURCE_OUTPUT_CORKED) +    if (!o->push || o->thread_info.state == PA_SOURCE_OUTPUT_CORKED)          return; -    pa_assert(o->state == PA_SOURCE_OUTPUT_RUNNING); +    pa_assert(o->thread_info.state == PA_SOURCE_OUTPUT_RUNNING);      if (pa_memblockq_push(o->thread_info.delay_memblockq, chunk) < 0) {          pa_log_debug("Delay queue overflow!"); @@ -422,7 +432,7 @@ void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) {  void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes /* in sink sample spec */) {      pa_source_output_assert_ref(o); -    pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); +    pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state));      pa_assert(pa_frame_aligned(nbytes, &o->source->sample_spec));      if (nbytes <= 0) @@ -583,6 +593,9 @@ int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {      if (o->flags & PA_SOURCE_OUTPUT_DONT_MOVE)          return -1; +    if (o->direct_on_input) +        return -1; +      if (pa_idxset_size(dest->outputs) >= PA_MAX_OUTPUTS_PER_SOURCE) {          pa_log_warn("Failed to move source output: too many outputs per source.");          return -1; | 
