add new virtual function may_move_to to sink inputs/source outputs to allow modules to forbid certain connections

This commit is contained in:
Lennart Poettering 2008-10-21 18:24:45 +02:00
parent 309bc71f07
commit 358824b330
4 changed files with 73 additions and 22 deletions

View file

@ -108,6 +108,7 @@ static void reset_callbacks(pa_sink_input *i) {
i->kill = NULL;
i->get_latency = NULL;
i->state_change = NULL;
i->may_move_to = NULL;
}
/* Called from main context */
@ -910,6 +911,35 @@ pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) {
return i->resample_method;
}
/* Called from main context */
pa_bool_t pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) {
pa_sink_input_assert_ref(i);
pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
pa_sink_assert_ref(dest);
if (dest == i->sink)
return TRUE;
if (i->flags & PA_SINK_INPUT_DONT_MOVE)
return FALSE;
if (i->sync_next || i->sync_prev) {
pa_log_warn("Moving synchronised streams not supported.");
return FALSE;
}
if (pa_idxset_size(dest->inputs) >= PA_MAX_INPUTS_PER_SINK) {
pa_log_warn("Failed to move sink input: too many inputs per sink.");
return FALSE;
}
if (i->may_move_to)
if (!i->may_move_to(i, dest))
return FALSE;
return TRUE;
}
/* Called from main context */
int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest) {
pa_resampler *new_resampler;
@ -926,19 +956,9 @@ int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest) {
if (dest == origin)
return 0;
if (i->flags & PA_SINK_INPUT_DONT_MOVE)
if (!pa_sink_input_may_move_to(i, dest))
return -1;
if (i->sync_next || i->sync_prev) {
pa_log_warn("Moving synchronised streams not supported.");
return -1;
}
if (pa_idxset_size(dest->inputs) >= PA_MAX_INPUTS_PER_SINK) {
pa_log_warn("Failed to move sink input: too many inputs per sink.");
return -1;
}
/* Kill directly connected outputs */
while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
pa_assert(o != p);