From c3d4abd7f1c80cba7cea55237811563d7633f9a6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 22 Apr 2024 16:19:02 +0200 Subject: [PATCH] modules: use acquire/release loop Expose the acquire_loop/release_loop functions and use them in the modules. Make sure the nodes created from the module use the same data loop as the module. We need to ensure this because otherwise, the nodes might be scheduled on different data loops and the invoke or timer logic will fail. --- src/modules/module-combine-stream.c | 24 +++++++++++++++--------- src/modules/module-ffado-driver.c | 9 ++++++--- src/modules/module-netjack2-driver.c | 14 +++++++++----- src/modules/module-netjack2-manager.c | 14 +++++++++----- src/modules/module-pipe-tunnel.c | 8 +++++--- src/modules/module-rtp-session.c | 8 +++++++- src/modules/module-rtp-source.c | 7 ++++++- src/modules/module-rtp/stream.c | 14 ++++++++------ src/modules/module-vban-recv.c | 7 ++++++- src/pipewire/context.h | 9 ++++++++- src/pipewire/private.h | 3 --- 11 files changed, 79 insertions(+), 38 deletions(-) diff --git a/src/modules/module-combine-stream.c b/src/modules/module-combine-stream.c index 8f9ff0593..88b01943a 100644 --- a/src/modules/module-combine-stream.c +++ b/src/modules/module-combine-stream.c @@ -236,7 +236,7 @@ static const struct spa_dict_item module_props[] = { struct impl { struct pw_context *context; struct pw_loop *main_loop; - struct pw_data_loop *data_loop; + struct pw_loop *data_loop; struct pw_properties *props; @@ -540,7 +540,7 @@ static void resize_delay(struct stream *stream, uint32_t size) for (i = 0; i < channels; ++i) ringbuffer_init(&info.delay[i], SPA_PTROFF(info.buf, i*size, void), size); - pw_data_loop_invoke(stream->impl->data_loop, do_replace_delay, 0, NULL, 0, true, &info); + pw_loop_invoke(stream->impl->data_loop, do_replace_delay, 0, NULL, 0, true, &info); free(info.buf); } @@ -603,7 +603,7 @@ static int do_clear_delaybuf(struct spa_loop *loop, bool async, uint32_t seq, static void clear_delaybuf(struct impl *impl) { - pw_data_loop_invoke(impl->data_loop, do_clear_delaybuf, 0, NULL, 0, true, impl); + pw_loop_invoke(impl->data_loop, do_clear_delaybuf, 0, NULL, 0, true, impl); } static int do_add_stream(struct spa_loop *loop, bool async, uint32_t seq, @@ -635,7 +635,7 @@ static void remove_stream(struct stream *s, bool destroy) { pw_log_debug("destroy stream %d", s->id); - pw_data_loop_invoke(s->impl->data_loop, do_remove_stream, 0, NULL, 0, true, s); + pw_loop_invoke(s->impl->data_loop, do_remove_stream, 0, NULL, 0, true, s); if (destroy && s->stream) { spa_hook_remove(&s->stream_listener); @@ -861,7 +861,7 @@ static int create_stream(struct stream_info *info) direction, PW_ID_ANY, flags, params, n_params)) < 0) goto error; - pw_data_loop_invoke(impl->data_loop, do_add_stream, 0, NULL, 0, true, s); + pw_loop_invoke(impl->data_loop, do_add_stream, 0, NULL, 0, true, s); update_delay(impl); return 0; @@ -1385,6 +1385,8 @@ static void impl_destroy(struct impl *impl) pw_core_disconnect(impl->core); impl->core = NULL; } + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); pw_properties_free(impl->stream_props); pw_properties_free(impl->combine_props); @@ -1434,8 +1436,8 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; pw_log_debug("module %p: new %s", impl, args); - impl->main_loop = pw_context_get_main_loop(context); - impl->data_loop = pw_context_get_data_loop(context); + impl->module = module; + impl->context = context; spa_list_init(&impl->streams); @@ -1454,6 +1456,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) } impl->props = props; + impl->main_loop = pw_context_get_main_loop(context); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); + if ((str = pw_properties_get(props, "combine.mode")) == NULL) str = "sink"; @@ -1488,8 +1493,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } - impl->module = module; - impl->context = context; + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_GROUP) == NULL) pw_properties_setf(props, PW_KEY_NODE_GROUP, "combine-%s-%u-%u", @@ -1523,6 +1527,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "stream.props")) != NULL) pw_properties_update_string(impl->stream_props, str, strlen(str)); + copy_props(props, impl->combine_props, PW_KEY_NODE_LOOP_NAME); copy_props(props, impl->combine_props, PW_KEY_AUDIO_CHANNELS); copy_props(props, impl->combine_props, SPA_KEY_AUDIO_POSITION); copy_props(props, impl->combine_props, PW_KEY_NODE_NAME); @@ -1537,6 +1542,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) parse_audio_info(impl->combine_props, &impl->info); + copy_props(props, impl->stream_props, PW_KEY_NODE_LOOP_NAME); copy_props(props, impl->stream_props, PW_KEY_NODE_GROUP); copy_props(props, impl->stream_props, PW_KEY_NODE_VIRTUAL); copy_props(props, impl->stream_props, PW_KEY_NODE_LINK_GROUP); diff --git a/src/modules/module-ffado-driver.c b/src/modules/module-ffado-driver.c index b6bd4c163..636a7d774 100644 --- a/src/modules/module-ffado-driver.c +++ b/src/modules/module-ffado-driver.c @@ -1284,6 +1284,9 @@ static void impl_destroy(struct impl *impl) if (impl->ffado_timer) pw_loop_destroy_source(impl->data_loop, impl->ffado_timer); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->sink.props); pw_properties_free(impl->source.props); pw_properties_free(impl->props); @@ -1378,7 +1381,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) { struct pw_context *context = pw_impl_module_get_context(module); struct pw_properties *props = NULL; - struct pw_data_loop *data_loop; struct impl *impl; const char *str; int res; @@ -1442,8 +1444,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->module = module; impl->context = context; impl->main_loop = pw_context_get_main_loop(context); - data_loop = pw_context_get_data_loop(context); - impl->data_loop = pw_data_loop_get_loop(data_loop); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); impl->system = impl->main_loop->system; impl->reset_work_id = SPA_ID_INVALID; @@ -1473,6 +1474,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL) pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); if (pw_properties_get(props, PW_KEY_NODE_GROUP) == NULL) @@ -1497,6 +1499,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "source.props")) != NULL) pw_properties_update_string(impl->source.props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_NODE_LINK_GROUP); copy_props(impl, props, PW_KEY_NODE_GROUP); copy_props(impl, props, PW_KEY_NODE_VIRTUAL); diff --git a/src/modules/module-netjack2-driver.c b/src/modules/module-netjack2-driver.c index 60ee205f0..32bb7773e 100644 --- a/src/modules/module-netjack2-driver.c +++ b/src/modules/module-netjack2-driver.c @@ -1124,6 +1124,9 @@ static void impl_destroy(struct impl *impl) if (impl->timer) pw_loop_destroy_source(impl->main_loop, impl->timer); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->sink.props); pw_properties_free(impl->source.props); pw_properties_free(impl->props); @@ -1200,7 +1203,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) { struct pw_context *context = pw_impl_module_get_context(module); struct pw_properties *props = NULL; - struct pw_data_loop *data_loop; struct impl *impl; const char *str; int res; @@ -1211,6 +1213,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if (impl == NULL) return -errno; + impl->module = module; + impl->context = context; + pw_log_debug("module %p: new %s", impl, args); if (args == NULL) @@ -1223,8 +1228,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } impl->props = props; - data_loop = pw_context_get_data_loop(context); - impl->data_loop = pw_data_loop_get_loop(data_loop); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); impl->quantum_limit = pw_properties_get_uint32( pw_context_get_properties(context), "default.clock.quantum-limit", 8192u); @@ -1237,8 +1241,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } - impl->module = module; - impl->context = context; impl->main_loop = pw_context_get_main_loop(context); impl->system = impl->main_loop->system; @@ -1264,6 +1266,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->latency = pw_properties_get_uint32(impl->props, "netjack2.latency", DEFAULT_NETWORK_LATENCY); + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL) pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); if (pw_properties_get(props, PW_KEY_NODE_GROUP) == NULL) @@ -1284,6 +1287,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "source.props")) != NULL) pw_properties_update_string(impl->source.props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_AUDIO_CHANNELS); copy_props(impl, props, SPA_KEY_AUDIO_POSITION); copy_props(impl, props, PW_KEY_NODE_ALWAYS_PROCESS); diff --git a/src/modules/module-netjack2-manager.c b/src/modules/module-netjack2-manager.c index 0c1a909c7..5be712e80 100644 --- a/src/modules/module-netjack2-manager.c +++ b/src/modules/module-netjack2-manager.c @@ -1154,6 +1154,9 @@ static void impl_destroy(struct impl *impl) if (impl->core && impl->do_disconnect) pw_core_disconnect(impl->core); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->sink_props); pw_properties_free(impl->source_props); pw_properties_free(impl->props); @@ -1230,7 +1233,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) { struct pw_context *context = pw_impl_module_get_context(module); struct pw_properties *props = NULL; - struct pw_data_loop *data_loop; struct impl *impl; const char *str; int res; @@ -1244,6 +1246,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) pw_log_debug("module %p: new %s", impl, args); spa_list_init(&impl->follower_list); + impl->module = module; + impl->context = context; + if (args == NULL) args = ""; @@ -1254,8 +1259,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } impl->props = props; - data_loop = pw_context_get_data_loop(context); - impl->data_loop = pw_data_loop_get_loop(data_loop); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); impl->quantum_limit = pw_properties_get_uint32( pw_context_get_properties(context), "default.clock.quantum-limit", 8192u); @@ -1268,8 +1272,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) goto error; } - impl->module = module; - impl->context = context; impl->main_loop = pw_context_get_main_loop(context); impl->system = impl->main_loop->system; @@ -1313,6 +1315,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->kbps = pw_properties_get_uint32(impl->props, "netjack2.kbps", DEFAULT_KBPS); + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL) pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); if (pw_properties_get(props, PW_KEY_NODE_NETWORK) == NULL) @@ -1337,6 +1340,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "source.props")) != NULL) pw_properties_update_string(impl->source_props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_NODE_VIRTUAL); copy_props(impl, props, PW_KEY_NODE_NETWORK); copy_props(impl, props, PW_KEY_NODE_LINK_GROUP); diff --git a/src/modules/module-pipe-tunnel.c b/src/modules/module-pipe-tunnel.c index 8f44eb3b4..149b78c7f 100644 --- a/src/modules/module-pipe-tunnel.c +++ b/src/modules/module-pipe-tunnel.c @@ -731,6 +731,8 @@ static void impl_destroy(struct impl *impl) if (impl->fd >= 0) close(impl->fd); + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->stream_props); pw_properties_free(impl->props); @@ -857,7 +859,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) struct pw_properties *props = NULL; struct impl *impl; const char *str, *media_class = NULL; - struct pw_data_loop *data_loop; int res; PW_LOG_TOPIC_INIT(mod_topic); @@ -891,8 +892,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->module = module; impl->context = context; impl->main_loop = pw_context_get_main_loop(context); - data_loop = pw_context_get_data_loop(context); - impl->data_loop = pw_data_loop_get_loop(data_loop); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); if ((str = pw_properties_get(props, "tunnel.mode")) == NULL) str = "playback"; @@ -923,6 +923,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "tunnel.may-pause")) != NULL) impl->may_pause = spa_atob(str); + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL) pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); if (pw_properties_get(props, PW_KEY_MEDIA_CLASS) == NULL) @@ -931,6 +932,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "stream.props")) != NULL) pw_properties_update_string(impl->stream_props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_AUDIO_FORMAT); copy_props(impl, props, PW_KEY_AUDIO_RATE); copy_props(impl, props, PW_KEY_AUDIO_CHANNELS); diff --git a/src/modules/module-rtp-session.c b/src/modules/module-rtp-session.c index 9cea134de..a7f0ae098 100644 --- a/src/modules/module-rtp-session.c +++ b/src/modules/module-rtp-session.c @@ -1218,6 +1218,9 @@ static void impl_destroy(struct impl *impl) if (impl->client) avahi_client_free(impl->client); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->stream_props); pw_properties_free(impl->props); @@ -1691,7 +1694,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->module = module; impl->context = context; impl->loop = pw_context_get_main_loop(context); - impl->data_loop = pw_data_loop_get_loop(pw_context_get_data_loop(context)); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); + + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, "sess.media") == NULL) pw_properties_set(props, "sess.media", "midi"); @@ -1699,6 +1704,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "stream.props")) != NULL) pw_properties_update_string(stream_props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_AUDIO_FORMAT); copy_props(impl, props, PW_KEY_AUDIO_RATE); copy_props(impl, props, PW_KEY_AUDIO_CHANNELS); diff --git a/src/modules/module-rtp-source.c b/src/modules/module-rtp-source.c index 8479033d6..03a647387 100644 --- a/src/modules/module-rtp-source.c +++ b/src/modules/module-rtp-source.c @@ -461,6 +461,9 @@ static void impl_destroy(struct impl *impl) if (impl->timer) pw_loop_destroy_source(impl->loop, impl->timer); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->stream_props); pw_properties_free(impl->props); @@ -537,11 +540,12 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->module = module; impl->context = context; impl->loop = pw_context_get_main_loop(context); - impl->data_loop = pw_data_loop_get_loop(pw_context_get_data_loop(context)); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); if ((sess_name = pw_properties_get(props, "sess.name")) == NULL) sess_name = pw_get_host_name(); + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_NAME) == NULL) pw_properties_setf(props, PW_KEY_NODE_NAME, "rtp_session.%s", sess_name); if (pw_properties_get(props, PW_KEY_NODE_DESCRIPTION) == NULL) @@ -553,6 +557,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "stream.props")) != NULL) pw_properties_update_string(stream_props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_AUDIO_FORMAT); copy_props(impl, props, PW_KEY_AUDIO_RATE); copy_props(impl, props, PW_KEY_AUDIO_CHANNELS); diff --git a/src/modules/module-rtp/stream.c b/src/modules/module-rtp/stream.c index ab4c05e61..b9874bce7 100644 --- a/src/modules/module-rtp/stream.c +++ b/src/modules/module-rtp/stream.c @@ -44,6 +44,8 @@ struct impl { struct spa_audio_info info; struct spa_audio_info stream_info; + struct pw_context *context; + struct pw_stream *stream; struct spa_hook stream_listener; struct pw_stream_events stream_events; @@ -311,8 +313,6 @@ struct rtp_stream *rtp_stream_new(struct pw_core *core, enum pw_stream_flags flags; float latency_msec; int res; - struct pw_data_loop *data_loop; - struct pw_context *context; impl = calloc(1, sizeof(*impl)); if (impl == NULL) { @@ -322,10 +322,9 @@ struct rtp_stream *rtp_stream_new(struct pw_core *core, impl->first = true; spa_hook_list_init(&impl->listener_list); impl->stream_events = stream_events; - context = pw_core_get_context(core); - impl->main_loop = pw_context_get_main_loop(context); - data_loop = pw_context_get_data_loop(context); - impl->data_loop = pw_data_loop_get_loop(data_loop); + impl->context = pw_core_get_context(core); + impl->main_loop = pw_context_get_main_loop(impl->context); + impl->data_loop = pw_context_acquire_loop(impl->context, &props->dict); impl->timer = pw_loop_add_timer(impl->data_loop, on_flush_timeout, impl); if (impl->timer == NULL) { res = -errno; @@ -614,6 +613,9 @@ void rtp_stream_destroy(struct rtp_stream *s) if (impl->timer) pw_loop_destroy_source(impl->data_loop, impl->timer); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + spa_hook_list_clean(&impl->listener_list); free(impl); } diff --git a/src/modules/module-vban-recv.c b/src/modules/module-vban-recv.c index afcef8382..0b61b9d5f 100644 --- a/src/modules/module-vban-recv.c +++ b/src/modules/module-vban-recv.c @@ -370,6 +370,9 @@ static void impl_destroy(struct impl *impl) if (impl->timer) pw_loop_destroy_source(impl->loop, impl->timer); + if (impl->data_loop) + pw_context_release_loop(impl->context, impl->data_loop); + pw_properties_free(impl->stream_props); pw_properties_free(impl->props); @@ -444,11 +447,12 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) impl->module = module; impl->context = context; impl->loop = pw_context_get_main_loop(context); - impl->data_loop = pw_data_loop_get_loop(pw_context_get_data_loop(context)); + impl->data_loop = pw_context_acquire_loop(context, &props->dict); if ((sess_name = pw_properties_get(props, "sess.name")) == NULL) sess_name = pw_get_host_name(); + pw_properties_set(props, PW_KEY_NODE_LOOP_NAME, impl->data_loop->name); if (pw_properties_get(props, PW_KEY_NODE_NAME) == NULL) pw_properties_setf(props, PW_KEY_NODE_NAME, "vban_session.%s", sess_name); if (pw_properties_get(props, PW_KEY_NODE_DESCRIPTION) == NULL) @@ -460,6 +464,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) if ((str = pw_properties_get(props, "stream.props")) != NULL) pw_properties_update_string(stream_props, str, strlen(str)); + copy_props(impl, props, PW_KEY_NODE_LOOP_NAME); copy_props(impl, props, PW_KEY_AUDIO_FORMAT); copy_props(impl, props, PW_KEY_AUDIO_RATE); copy_props(impl, props, PW_KEY_AUDIO_CHANNELS); diff --git a/src/pipewire/context.h b/src/pipewire/context.h index c619ca48d..810127323 100644 --- a/src/pipewire/context.h +++ b/src/pipewire/context.h @@ -130,10 +130,17 @@ const struct spa_support *pw_context_get_support(struct pw_context *context, uin struct pw_loop *pw_context_get_main_loop(struct pw_context *context); /** Get the context data loop. This loop runs on the realtime thread. This - * acquires a loop from the generic data.rt class. + * acquires a loop from the generic data.rt class. Use pw_context_acquire_loop() instead. * Since 0.3.56 */ struct pw_data_loop *pw_context_get_data_loop(struct pw_context *context); +/** Get a data-loop. + * Since 1.1.0 */ +struct pw_loop *pw_context_acquire_loop(struct pw_context *context, const struct spa_dict *props); +/** Release a data-loop. + * Since 1.1.0 */ +void pw_context_release_loop(struct pw_context *context, struct pw_loop *loop); + /** Get the work queue from the context: Since 0.3.26 */ struct pw_work_queue *pw_context_get_work_queue(struct pw_context *context); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 105f399db..098e16afe 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1183,9 +1183,6 @@ void pw_proxy_remove(struct pw_proxy *proxy); int pw_context_recalc_graph(struct pw_context *context, const char *reason); -struct pw_loop *pw_context_acquire_loop(struct pw_context *context, const struct spa_dict *props); -void pw_context_release_loop(struct pw_context *context, struct pw_loop *loop); - void pw_impl_port_update_info(struct pw_impl_port *port, const struct spa_port_info *info); int pw_impl_port_register(struct pw_impl_port *port,