diff options
-rw-r--r-- | src/pulsecore/sink.c | 3 | ||||
-rw-r--r-- | src/pulsecore/source.c | 18 | ||||
-rw-r--r-- | src/pulsecore/source.h | 2 |
3 files changed, 23 insertions, 0 deletions
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 @@ -434,6 +434,24 @@ int pa_source_suspend(pa_source *s, pa_bool_t suspend) { } /* 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; pa_source_output *o, *n; 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! */ |