diff --git a/src/modules/module-filter-chain.c b/src/modules/module-filter-chain.c index d3a40daa6..0d9ada001 100644 --- a/src/modules/module-filter-chain.c +++ b/src/modules/module-filter-chain.c @@ -587,6 +587,23 @@ static void param_latency_changed(struct impl *impl, const struct spa_pod *param pw_stream_update_params(impl->playback, params, 1); } +static void state_changed(void *data, enum pw_stream_state old, + enum pw_stream_state state, const char *error) +{ + struct impl *impl = data; + struct graph *graph = &impl->graph; + + switch (state) { + case PW_STREAM_STATE_PAUSED: + pw_stream_flush(impl->playback, false); + pw_stream_flush(impl->capture, false); + graph_reset(graph); + break; + default: + break; + } +} + static void param_changed(void *data, uint32_t id, const struct spa_pod *param) { struct impl *impl = data; @@ -611,6 +628,7 @@ static const struct pw_stream_events in_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = capture_destroy, .process = capture_process, + .state_changed = state_changed, .param_changed = param_changed }; @@ -624,6 +642,7 @@ static void playback_destroy(void *d) static const struct pw_stream_events out_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = playback_destroy, + .state_changed = state_changed, .param_changed = param_changed }; diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c index 15dfaa4a5..05a2e1e65 100644 --- a/src/modules/module-loopback.c +++ b/src/modules/module-loopback.c @@ -184,6 +184,20 @@ static void param_latency_changed(struct impl *impl, const struct spa_pod *param pw_stream_update_params(other, params, 1); } +static void stream_state_changed(void *data, enum pw_stream_state old, + enum pw_stream_state state, const char *error) +{ + struct impl *impl = data; + switch (state) { + case PW_STREAM_STATE_PAUSED: + pw_stream_flush(impl->playback, false); + pw_stream_flush(impl->capture, false); + break; + default: + break; + } +} + static void capture_param_changed(void *data, uint32_t id, const struct spa_pod *param) { struct impl *impl = data; @@ -199,6 +213,7 @@ static const struct pw_stream_events in_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = capture_destroy, .process = capture_process, + .state_changed = stream_state_changed, .param_changed = capture_param_changed, }; @@ -209,6 +224,7 @@ static void playback_destroy(void *d) impl->playback = NULL; } + static void playback_param_changed(void *data, uint32_t id, const struct spa_pod *param) { struct impl *impl = data; @@ -222,6 +238,7 @@ static void playback_param_changed(void *data, uint32_t id, const struct spa_pod static const struct pw_stream_events out_stream_events = { PW_VERSION_STREAM_EVENTS, .destroy = playback_destroy, + .state_changed = stream_state_changed, .param_changed = playback_param_changed, };