diff options
author | Lennart Poettering <lennart@poettering.net> | 2009-01-23 22:40:02 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-01-23 22:40:02 +0100 |
commit | 640d317df93f205d5830b9f7b106233ddb6d2f9e (patch) | |
tree | 33034e3b3e4a8443ca7c0d47e0be48b84f6ef36b /src/pulsecore/sink.c | |
parent | 29cb778dcc3ceff2bb16520a16388cc21cd32884 (diff) |
add functions to move all inputs of a sink away/similar for source outputs
Diffstat (limited to 'src/pulsecore/sink.c')
-rw-r--r-- | src/pulsecore/sink.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index df46a2c4..083dbaae 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -474,6 +474,58 @@ int pa_sink_suspend(pa_sink *s, pa_bool_t suspend) { return sink_set_state(s, pa_sink_used_by(s) ? PA_SINK_RUNNING : PA_SINK_IDLE); } +/* Called from main context */ +pa_queue *pa_sink_move_all_start(pa_sink *s) { + pa_queue *q; + pa_sink_input *i, *n; + uint32_t idx; + + pa_sink_assert_ref(s); + pa_assert(PA_SINK_IS_LINKED(s->state)); + + q = pa_queue_new(); + + for (i = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); i; i = n) { + n = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx)); + + if (pa_sink_input_start_move(i) >= 0) + pa_queue_push(q, pa_sink_input_ref(i)); + } + + return q; +} + +/* Called from main context */ +void pa_sink_move_all_finish(pa_sink *s, pa_queue *q) { + pa_sink_input *i; + + pa_sink_assert_ref(s); + pa_assert(PA_SINK_IS_LINKED(s->state)); + pa_assert(q); + + while ((i = PA_SINK_INPUT(pa_queue_pop(q)))) { + if (pa_sink_input_finish_move(i, s) < 0) + pa_sink_input_unlink(i); + + pa_sink_input_unref(i); + } + + pa_queue_free(q, NULL, NULL); +} + +/* Called from main context */ +void pa_sink_move_all_fail(pa_queue *q) { + pa_sink_input *i; + pa_assert(q); + + while ((i = PA_SINK_INPUT(pa_queue_pop(q)))) { + pa_sink_input_unlink(i); + pa_sink_input_unref(i); + } + + pa_queue_free(q, NULL, NULL); +} + /* Called from IO thread context */ void pa_sink_process_rewind(pa_sink *s, size_t nbytes) { pa_sink_input *i; |