summaryrefslogtreecommitdiff
path: root/media-video/pipewire/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2023-07-23 20:53:51 +0100
committerV3n3RiX <venerix@koprulu.sector>2023-07-23 20:53:51 +0100
commit3018b5a4bd4777c51e2793818305d7af2409a7fd (patch)
tree614c2151adcf4d5a47d494f83ec3f57d35f8e0a7 /media-video/pipewire/files
parent2508f64d6edae6ffd910973df8285893a791b64a (diff)
gentoo auto-resync : 23:07:2023 - 20:53:51
Diffstat (limited to 'media-video/pipewire/files')
-rw-r--r--media-video/pipewire/files/0.3.75/0001-module-rt-error-out-on-load-no-bus.patch83
-rw-r--r--media-video/pipewire/files/0.3.75/0002-thread-loop-only-signal-when-option-set.patch68
2 files changed, 151 insertions, 0 deletions
diff --git a/media-video/pipewire/files/0.3.75/0001-module-rt-error-out-on-load-no-bus.patch b/media-video/pipewire/files/0.3.75/0001-module-rt-error-out-on-load-no-bus.patch
new file mode 100644
index 000000000000..8885eb8a564f
--- /dev/null
+++ b/media-video/pipewire/files/0.3.75/0001-module-rt-error-out-on-load-no-bus.patch
@@ -0,0 +1,83 @@
+https://bugs.gentoo.org/910714
+https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/55812195ce3b77317e7a2dc642b78271f3a45c8e
+
+From 55812195ce3b77317e7a2dc642b78271f3a45c8e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= <joanbrugueram@gmail.com>
+Date: Sat, 22 Jul 2023 01:20:58 +0000
+Subject: [PATCH] module-rt: error out on load if no bus is available
+
+Since the recent changes to the RT module in Pipewire 0.3.75, some
+applications such as those using OpenAL-Soft crash on startup if
+neither the session nor the system bus is available. For example:
+
+ bwrap --dev-bind / / \
+ --bind /dev/null /run/dbus/system_bus_socket \
+ --bind /dev/null $XDG_RUNTIME_DIR/bus \
+ openal-info
+
+Will result in a crash with the following error message:
+
+ dbus[1626147]: arguments to dbus_message_new_method_call() were
+ incorrect, assertion "path != NULL" failed in file dbus-message.c
+ line 1373.
+ This is normally a bug in some application using the D-Bus library.
+
+The RT module previously failed to load if no bus was available, but
+after the recent changes, the init. logic runs in a thread, and failing
+to obtain the bus no longer causes the module to fail to load.
+
+Then, functions called later such as `pw_rtkit_make_realtime` assume
+the bus is available and try to use it, causing the error above.
+
+Put the logic for obtaining and checking the bus back to `module_init`,
+so the module fails to load again if no bus is available.
+--- a/src/modules/module-rt.c
++++ b/src/modules/module-rt.c
+@@ -923,14 +923,11 @@ static int check_rtkit(struct impl *impl, struct pw_context *context, bool *can_
+ return 0;
+ }
+
+-static int do_rtkit_setup(struct spa_loop *loop, bool async, uint32_t seq,
+- const void *data, size_t size, void *user_data)
++static int rtkit_get_bus(struct impl *impl)
+ {
+- struct impl *impl = user_data;
+ int res;
+- long long retval;
+
+- pw_log_debug("enter rtkit setup");
++ pw_log_debug("enter rtkit get bus");
+
+ /* Checking xdg-desktop-portal. It works fine in all situations. */
+ if (impl->rtportal_enabled)
+@@ -967,6 +964,18 @@ static int do_rtkit_setup(struct spa_loop *loop, bool async, uint32_t seq,
+ return res;
+ }
+ }
++
++ return 0;
++}
++
++static int do_rtkit_setup(struct spa_loop *loop, bool async, uint32_t seq,
++ const void *data, size_t size, void *user_data)
++{
++ struct impl *impl = user_data;
++ long long retval;
++
++ pw_log_debug("enter rtkit setup");
++
+ /* get some properties */
+ if (rtkit_get_int_property(impl, "MaxRealtimePriority", &retval) < 0) {
+ retval = 1;
+@@ -1076,6 +1085,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ #ifdef HAVE_DBUS
+ impl->use_rtkit = use_rtkit;
+ if (impl->use_rtkit) {
++ if ((res = rtkit_get_bus(impl)) < 0)
++ goto error;
++
+ impl->thread_loop = pw_thread_loop_new("module-rt", NULL);
+ if (impl->thread_loop == NULL) {
+ res = -errno;
+--
+GitLab
diff --git a/media-video/pipewire/files/0.3.75/0002-thread-loop-only-signal-when-option-set.patch b/media-video/pipewire/files/0.3.75/0002-thread-loop-only-signal-when-option-set.patch
new file mode 100644
index 000000000000..670847b2f86a
--- /dev/null
+++ b/media-video/pipewire/files/0.3.75/0002-thread-loop-only-signal-when-option-set.patch
@@ -0,0 +1,68 @@
+https://github.com/mpv-player/mpv/issues/11995
+https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/3374
+https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/920bb7160e0be0ce5729d9538f6dea966f297603
+
+From 920bb7160e0be0ce5729d9538f6dea966f297603 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Sun, 23 Jul 2023 18:16:00 +0200
+Subject: [PATCH] thread-loop: only signal when option is set
+
+Add a thead-loop.start-signal option that will do a signal before
+entering the thread loop. Doing the signal in all cases can confuse
+apps that don't expect the signal.
+
+Make module-rt use the thread-loop.start-signal.
+
+Fixes #3374
+--- a/src/modules/module-rt.c
++++ b/src/modules/module-rt.c
+@@ -1085,10 +1085,14 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ #ifdef HAVE_DBUS
+ impl->use_rtkit = use_rtkit;
+ if (impl->use_rtkit) {
++ struct spa_dict_item items[] = {
++ { "thread-loop.start-signal", "true" }
++ };
+ if ((res = rtkit_get_bus(impl)) < 0)
+ goto error;
+
+- impl->thread_loop = pw_thread_loop_new("module-rt", NULL);
++ impl->thread_loop = pw_thread_loop_new("module-rt",
++ &SPA_DICT_INIT_ARRAY(items));
+ if (impl->thread_loop == NULL) {
+ res = -errno;
+ goto error;
+--- a/src/pipewire/thread-loop.c
++++ b/src/pipewire/thread-loop.c
+@@ -43,6 +43,7 @@ struct pw_thread_loop {
+ int n_waiting_for_accept;
+ unsigned int created:1;
+ unsigned int running:1;
++ unsigned int start_signal:1;
+ };
+ /** \endcond */
+
+@@ -143,6 +144,11 @@ static struct pw_thread_loop *loop_new(struct pw_loop *loop,
+ return NULL;
+
+ pw_log_debug("%p: new name:%s", this, name);
++ if (props != NULL) {
++ const char *str = spa_dict_lookup(props, "thread-loop.start-signal");
++ if (str != NULL)
++ this->start_signal = spa_atob(str);
++ }
+
+ if (loop == NULL) {
+ loop = pw_loop_new(props);
+@@ -282,7 +288,8 @@ static void *do_loop(void *user_data)
+ pw_log_debug("%p: enter thread", this);
+ pw_loop_enter(this->loop);
+
+- pw_thread_loop_signal(this, false);
++ if (this->start_signal)
++ pw_thread_loop_signal(this, false);
+
+ while (this->running) {
+ if ((res = pw_loop_iterate(this->loop, -1)) < 0) {
+--
+GitLab