From ecbc320a4c219b40795e0462de6f37d610003c88 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 4 Mar 2009 05:27:14 +0100 Subject: make suspend state of monitor source follow the suspend state of the sink it belongs to --- src/pulsecore/sink.c | 3 +++ src/pulsecore/source.c | 18 ++++++++++++++++++ src/pulsecore/source.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 11334037..ed68dd8e 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -326,6 +326,9 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state) { pa_sink_input_kill(i); else if (i->suspend) i->suspend(i, state == PA_SINK_SUSPENDED); + + if (s->monitor_source) + pa_source_sync_suspend(s->monitor_source); } return 0; diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index f946366d..476cb553 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -433,6 +433,24 @@ int pa_source_suspend(pa_source *s, pa_bool_t suspend) { return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE); } +/* Called from main context */ +int pa_source_sync_suspend(pa_source *s) { + pa_sink_state_t state; + + pa_source_assert_ref(s); + pa_assert(PA_SOURCE_IS_LINKED(s->state)); + pa_assert(s->monitor_of); + + state = pa_sink_get_state(s->monitor_of); + + if (state == PA_SINK_SUSPENDED) + return source_set_state(s, PA_SOURCE_SUSPENDED); + + pa_assert(PA_SINK_IS_OPENED(state)); + + return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE); +} + /* Called from main context */ pa_queue *pa_source_move_all_start(pa_source *s) { pa_queue *q; diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index 2aac25f1..26471de0 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -212,6 +212,8 @@ void pa_source_attach(pa_source *s); void pa_source_set_soft_volume(pa_source *s, const pa_cvolume *volume); +int pa_source_sync_suspend(pa_source *s); + /*** May be called by everyone, from main context */ /* The returned value is supposed to be in the time domain of the sound card! */ -- cgit