diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 934368080..39e1dc025 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -1448,7 +1448,10 @@ do_remove_callbacks(struct spa_loop *loop, static void hook_removed(struct spa_hook *hook) { struct filter *impl = hook->priv; - pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl); + if (impl->data_loop) + pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl); + else + spa_zero(impl->rt_callbacks); hook->priv = NULL; hook->removed = NULL; } @@ -1541,8 +1544,10 @@ int pw_filter_update_properties(struct pw_filter *filter, void *port_data, const static void node_event_destroy(void *data) { struct pw_filter *filter = data; + struct filter *impl = SPA_CONTAINER_OF(filter, struct filter, this); spa_hook_remove(&filter->node_listener); filter->node = NULL; + impl->data_loop = NULL; } static const struct pw_impl_node_events node_events = { diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index c19a2c523..038f71b79 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1344,8 +1344,10 @@ static int node_event_param(void *object, int seq, static void node_event_destroy(void *data) { struct pw_stream *stream = data; + struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); spa_hook_remove(&stream->node_listener); stream->node = NULL; + impl->data_loop = NULL; } static void node_event_info(void *data, const struct pw_node_info *info) @@ -1707,7 +1709,10 @@ do_remove_callbacks(struct spa_loop *loop, static void hook_removed(struct spa_hook *hook) { struct stream *impl = hook->priv; - pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl); + if (impl->data_loop) + pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl); + else + spa_zero(impl->rt_callbacks); hook->priv = NULL; hook->removed = NULL; }