diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-10-21 18:24:45 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-10-21 18:24:45 +0200 |
commit | 358824b330e20b9e6472fdefc4613e03b20c9abb (patch) | |
tree | b852559702e728644ab18727e0e7a99b379a1244 /src/pulsecore/source-output.c | |
parent | 309bc71f07bdb00ecf050d7a4b1734accafcb95f (diff) |
add new virtual function may_move_to to sink inputs/source outputs to allow modules to forbid certain connections
Diffstat (limited to 'src/pulsecore/source-output.c')
-rw-r--r-- | src/pulsecore/source-output.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c index 7adc7572..376402fa 100644 --- a/src/pulsecore/source-output.c +++ b/src/pulsecore/source-output.c @@ -90,6 +90,7 @@ static void reset_callbacks(pa_source_output *o) { o->kill = NULL; o->get_latency = NULL; o->state_change = NULL; + o->may_move_to = NULL; } /* Called from main context */ @@ -593,6 +594,32 @@ pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o) { return o->resample_method; } +pa_bool_t pa_source_output_may_move_to(pa_source_output *o, pa_source *dest) { + pa_source_output_assert_ref(o); + pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); + pa_source_assert_ref(dest); + + if (dest == o->source) + return TRUE; + + if (o->flags & PA_SOURCE_OUTPUT_DONT_MOVE) + return FALSE; + + if (o->direct_on_input) + return FALSE; + + 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 FALSE; + } + + if (o->may_move_to) + if (!o->may_move_to(o, dest)) + return FALSE; + + return TRUE; +} + /* Called from main context */ int pa_source_output_move_to(pa_source_output *o, pa_source *dest) { pa_source *origin; @@ -608,16 +635,8 @@ int pa_source_output_move_to(pa_source_output *o, pa_source *dest) { if (dest == origin) return 0; - 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."); + if (!pa_source_output_may_move_to(o, dest)) return -1; - } if (o->thread_info.resampler && pa_sample_spec_equal(&origin->sample_spec, &dest->sample_spec) && |