--- a/src/pulsecore/sink-input.c 2016-04-13 11:44:04.389999429 +0200 +++ b/src/pulsecore/sink-input.c 2016-04-13 11:52:45.167998560 +0200 @@ -786,6 +786,9 @@ update_n_corked(i, state); i->state = state; + i->corked = false; + i->corked_internal = false; + /* We might need to update the sink's volume if we are in flat volume mode. */ if (pa_sink_flat_volume_enabled(i->sink)) pa_sink_set_volume(i->sink, NULL, false, i->save_volume); @@ -1493,13 +1496,38 @@ } } +static void pa_sink_input_cork_really(pa_sink_input *i, bool b) { + pa_sink_input_assert_ref(i); + pa_assert_ctl_context(); + pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); + + if (i->corked_internal == false && i->corked == false) + b = false; + else + b = true; + + sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING); +} + /* Called from main context */ void pa_sink_input_cork(pa_sink_input *i, bool b) { pa_sink_input_assert_ref(i); pa_assert_ctl_context(); pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); - sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING); + i->corked = b; + + pa_sink_input_cork_really(i, b); +} + +void pa_sink_input_cork_internal(pa_sink_input *i, bool b) { + pa_sink_input_assert_ref(i); + pa_assert_ctl_context(); + pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); + + i->corked_internal = b; + + pa_sink_input_cork_really(i, b); } /* Called from main context */ --- a/src/pulsecore/sink-input.h 2016-04-13 11:44:28.035999390 +0200 +++ b/src/pulsecore/sink-input.h 2016-04-13 11:53:56.325998441 +0200 @@ -126,6 +126,9 @@ /* for volume ramps */ pa_cvolume_ramp_int ramp; + bool corked; + bool corked_internal; + pa_resample_method_t requested_resample_method, actual_resample_method; /* Returns the chunk of audio data and drops it from the @@ -357,6 +360,7 @@ void pa_sink_input_request_rewind(pa_sink_input *i, size_t nbytes, bool rewrite, bool flush, bool dont_rewind_render); void pa_sink_input_cork(pa_sink_input *i, bool b); +void pa_sink_input_cork_internal(pa_sink_input *i, bool b); int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate); int pa_sink_input_update_rate(pa_sink_input *i);