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,