The only thing that the drained state was being used for was "pacmd list-sink-inputs". In all other cases the drained and running states were treated as equivalent. IMHO, this usage doesn't justify the complexity that the additional state brings. This patch was inspired by a bug report[1] that pointed out an error in an if condition in pa_sink_input_set_state_within_thread(). The buggy code is now removed altogether. [1] https://bugs.freedesktop.org/show_bug.cgi?id=106982 --- src/modules/module-suspend-on-idle.c | 4 ++-- src/pulsecore/cli-text.c | 1 - src/pulsecore/sink-input.c | 14 -------------- src/pulsecore/sink-input.h | 7 +------ 4 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/modules/module-suspend-on-idle.c b/src/modules/module-suspend-on-idle.c index 37ba659e4..9949b5509 100644 --- a/src/modules/module-suspend-on-idle.c +++ b/src/modules/module-suspend-on-idle.c @@ -222,7 +222,7 @@ static pa_hook_result_t sink_input_move_finish_hook_cb(pa_core *c, pa_sink_input pa_assert(u); state = pa_sink_input_get_state(s); - if (state != PA_SINK_INPUT_RUNNING && state != PA_SINK_INPUT_DRAINED) + if (state != PA_SINK_INPUT_RUNNING) return PA_HOOK_OK; if ((d = pa_hashmap_get(u->device_infos, s->sink))) @@ -282,7 +282,7 @@ static pa_hook_result_t sink_input_state_changed_hook_cb(pa_core *c, pa_sink_inp pa_assert(u); state = pa_sink_input_get_state(s); - if ((state == PA_SINK_INPUT_RUNNING || state == PA_SINK_INPUT_DRAINED) && s->sink) + if (state == PA_SINK_INPUT_RUNNING && s->sink) if ((d = pa_hashmap_get(u->device_infos, s->sink))) resume(d); diff --git a/src/pulsecore/cli-text.c b/src/pulsecore/cli-text.c index 474f3367b..2e377f0f1 100644 --- a/src/pulsecore/cli-text.c +++ b/src/pulsecore/cli-text.c @@ -525,7 +525,6 @@ char *pa_sink_input_list_to_string(pa_core *c) { static const char* const state_table[] = { [PA_SINK_INPUT_INIT] = "INIT", [PA_SINK_INPUT_RUNNING] = "RUNNING", - [PA_SINK_INPUT_DRAINED] = "DRAINED", [PA_SINK_INPUT_CORKED] = "CORKED", [PA_SINK_INPUT_UNLINKED] = "UNLINKED" }; diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index bc42a9b19..d0b2ad17b 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -541,7 +541,6 @@ int pa_sink_input_new( i->thread_info.state = i->state; i->thread_info.attached = false; - pa_atomic_store(&i->thread_info.drained, 1); i->thread_info.sample_spec = i->sample_spec; i->thread_info.resampler = resampler; i->thread_info.soft_volume = i->soft_volume; @@ -610,9 +609,6 @@ static void sink_input_set_state(pa_sink_input *i, pa_sink_input_state_t state) pa_assert(i); pa_assert_ctl_context(); - if (state == PA_SINK_INPUT_DRAINED) - state = PA_SINK_INPUT_RUNNING; - if (i->state == state) return; @@ -924,7 +920,6 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa /* OK, we're corked or the implementor didn't give us any * data, so let's just hand out silence */ - pa_atomic_store(&i->thread_info.drained, 1); pa_memblockq_seek(i->thread_info.render_memblockq, (int64_t) slength, PA_SEEK_RELATIVE, true); i->thread_info.playing_for = 0; @@ -935,8 +930,6 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa break; } - pa_atomic_store(&i->thread_info.drained, 0); - pa_assert(tchunk.length > 0); pa_assert(tchunk.memblock); @@ -2013,10 +2006,6 @@ void pa_sink_input_set_state_within_thread(pa_sink_input *i, pa_sink_input_state if (state == i->thread_info.state) return; - if ((state == PA_SINK_INPUT_DRAINED || state == PA_SINK_INPUT_RUNNING) && - !(i->thread_info.state == PA_SINK_INPUT_DRAINED || i->thread_info.state != PA_SINK_INPUT_RUNNING)) - pa_atomic_store(&i->thread_info.drained, 1); - corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state == PA_SINK_INPUT_RUNNING; uncorking = i->thread_info.state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING; @@ -2129,9 +2118,6 @@ pa_sink_input_state_t pa_sink_input_get_state(pa_sink_input *i) { pa_sink_input_assert_ref(i); pa_assert_ctl_context(); - if (i->state == PA_SINK_INPUT_RUNNING || i->state == PA_SINK_INPUT_DRAINED) - return pa_atomic_load(&i->thread_info.drained) ? PA_SINK_INPUT_DRAINED : PA_SINK_INPUT_RUNNING; - return i->state; } diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h index b16f60fe5..aa8c546a7 100644 --- a/src/pulsecore/sink-input.h +++ b/src/pulsecore/sink-input.h @@ -35,7 +35,6 @@ typedef enum pa_sink_input_state { PA_SINK_INPUT_INIT, /*< The stream is not active yet, because pa_sink_input_put() has not been called yet */ - PA_SINK_INPUT_DRAINED, /*< The stream stopped playing because there was no data to play */ PA_SINK_INPUT_RUNNING, /*< The stream is alive and kicking */ PA_SINK_INPUT_CORKED, /*< The stream was corked on user request */ PA_SINK_INPUT_UNLINKED /*< The stream is dead */ @@ -43,7 +42,7 @@ typedef enum pa_sink_input_state { } pa_sink_input_state_t; static inline bool PA_SINK_INPUT_IS_LINKED(pa_sink_input_state_t x) { - return x == PA_SINK_INPUT_DRAINED || x == PA_SINK_INPUT_RUNNING || x == PA_SINK_INPUT_CORKED; + return x == PA_SINK_INPUT_RUNNING || x == PA_SINK_INPUT_CORKED; } typedef enum pa_sink_input_flags { @@ -67,9 +66,6 @@ struct pa_sink_input { uint32_t index; pa_core *core; - /* Please note that this state should only be read with - * pa_sink_input_get_state(). That function will transparently - * merge the thread_info.drained value in. */ pa_sink_input_state_t state; pa_sink_input_flags_t flags; @@ -231,7 +227,6 @@ struct pa_sink_input { struct { pa_sink_input_state_t state; - pa_atomic_t drained; pa_cvolume soft_volume; bool muted:1; -- 2.17.0