Accepting request 1104672 from multimedia:libs
OBS-URL: https://build.opensuse.org/request/show/1104672 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/pipewire?expand=0&rev=91
This commit is contained in:
commit
b903261f27
@ -0,0 +1,117 @@
|
|||||||
|
From 1daae4c369f464c8677696890e2eeb431c0f72a1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wim Taymans <wtaymans@redhat.com>
|
||||||
|
Date: Fri, 4 Aug 2023 17:42:04 +0200
|
||||||
|
Subject: [PATCH] context: Don't stop setting runnable when meeting the driving
|
||||||
|
node
|
||||||
|
|
||||||
|
Start scanning from a non-driving runnable node in one direction and set
|
||||||
|
all linked intermedia nodes runnable as well.
|
||||||
|
|
||||||
|
This ensure that play -> driving_sink -> effect -> sink also sets the
|
||||||
|
effect and sink nodes to running.
|
||||||
|
|
||||||
|
Fixes #3405
|
||||||
|
---
|
||||||
|
src/pipewire/context.c | 60 ++++++++++++++++++++++--------------------
|
||||||
|
1 file changed, 31 insertions(+), 29 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/pipewire/context.c b/src/pipewire/context.c
|
||||||
|
index 8f9745b3f..9d9b629ae 100644
|
||||||
|
--- a/src/pipewire/context.c
|
||||||
|
+++ b/src/pipewire/context.c
|
||||||
|
@@ -787,44 +787,44 @@ static int ensure_state(struct pw_impl_node *node, bool running)
|
||||||
|
return pw_impl_node_set_state(node, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* From a node (that is runnable) follow all prepared links and groups to
|
||||||
|
- * active nodes up to the driver and make them recursively runnable as well.
|
||||||
|
- *
|
||||||
|
- * We stop at driver nodes so that other paths linked to the driver will stay
|
||||||
|
- * unrunnable when no other runnable path exists.
|
||||||
|
+/* From a node (that is runnable) follow all prepared links in the given direction
|
||||||
|
+ * and groups to active nodes and make them recursively runnable as well.
|
||||||
|
*/
|
||||||
|
-static inline int run_nodes(struct pw_context *context, struct pw_impl_node *node, struct spa_list *nodes)
|
||||||
|
+static inline int run_nodes(struct pw_context *context, struct pw_impl_node *node,
|
||||||
|
+ struct spa_list *nodes, enum pw_direction direction)
|
||||||
|
{
|
||||||
|
struct pw_impl_node *t;
|
||||||
|
struct pw_impl_port *p;
|
||||||
|
struct pw_impl_link *l;
|
||||||
|
|
||||||
|
- pw_log_debug("node %p: '%s'", node, node->name);
|
||||||
|
+ pw_log_debug("node %p: '%s' direction:%s", node, node->name,
|
||||||
|
+ pw_direction_as_string(direction));
|
||||||
|
|
||||||
|
- spa_list_for_each(p, &node->input_ports, link) {
|
||||||
|
- spa_list_for_each(l, &p->links, input_link) {
|
||||||
|
- t = l->output->node;
|
||||||
|
+ if (direction == PW_DIRECTION_INPUT) {
|
||||||
|
+ spa_list_for_each(p, &node->input_ports, link) {
|
||||||
|
+ spa_list_for_each(l, &p->links, input_link) {
|
||||||
|
+ t = l->output->node;
|
||||||
|
|
||||||
|
- if (!t->active || !l->prepared || t->runnable)
|
||||||
|
- continue;
|
||||||
|
+ if (!t->active || !l->prepared || (!t->driving && t->runnable))
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
- pw_log_debug(" peer %p: '%s'", t, t->name);
|
||||||
|
- t->runnable = true;
|
||||||
|
- if (!t->driving)
|
||||||
|
- run_nodes(context, t, nodes);
|
||||||
|
+ pw_log_debug(" peer %p: '%s'", t, t->name);
|
||||||
|
+ t->runnable = true;
|
||||||
|
+ run_nodes(context, t, nodes, direction);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
- spa_list_for_each(p, &node->output_ports, link) {
|
||||||
|
- spa_list_for_each(l, &p->links, output_link) {
|
||||||
|
- t = l->input->node;
|
||||||
|
+ } else {
|
||||||
|
+ spa_list_for_each(p, &node->output_ports, link) {
|
||||||
|
+ spa_list_for_each(l, &p->links, output_link) {
|
||||||
|
+ t = l->input->node;
|
||||||
|
|
||||||
|
- if (!t->active || !l->prepared || t->runnable)
|
||||||
|
- continue;
|
||||||
|
+ if (!t->active || !l->prepared || (!t->driving && t->runnable))
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
- pw_log_debug(" peer %p: '%s'", t, t->name);
|
||||||
|
- t->runnable = true;
|
||||||
|
- if (!t->driving)
|
||||||
|
- run_nodes(context, t, nodes);
|
||||||
|
+ pw_log_debug(" peer %p: '%s'", t, t->name);
|
||||||
|
+ t->runnable = true;
|
||||||
|
+ run_nodes(context, t, nodes, direction);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* now go through all the nodes that have the same link group and
|
||||||
|
@@ -842,7 +842,7 @@ static inline int run_nodes(struct pw_context *context, struct pw_impl_node *nod
|
||||||
|
pw_log_debug(" group %p: '%s'", t, t->name);
|
||||||
|
t->runnable = true;
|
||||||
|
if (!t->driving)
|
||||||
|
- run_nodes(context, t, nodes);
|
||||||
|
+ run_nodes(context, t, nodes, direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
@@ -944,8 +944,10 @@ static int collect_nodes(struct pw_context *context, struct pw_impl_node *node,
|
||||||
|
pw_log_debug(" next node %p: '%s' runnable:%u", n, n->name, n->runnable);
|
||||||
|
}
|
||||||
|
spa_list_for_each(n, collect, sort_link)
|
||||||
|
- if (!n->driving && n->runnable)
|
||||||
|
- run_nodes(context, n, collect);
|
||||||
|
+ if (!n->driving && n->runnable) {
|
||||||
|
+ run_nodes(context, n, collect, PW_DIRECTION_OUTPUT);
|
||||||
|
+ run_nodes(context, n, collect, PW_DIRECTION_INPUT);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
38
0001-gst-Prevent-a-crash-when-stopping-device-provider.patch
Normal file
38
0001-gst-Prevent-a-crash-when-stopping-device-provider.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From 140374d2071e6204fded4ca65645d4e9a3dd053e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philippe Normand <philn@igalia.com>
|
||||||
|
Date: Fri, 4 Aug 2023 10:01:07 +0100
|
||||||
|
Subject: [PATCH] gst: Prevent a crash when stopping device provider
|
||||||
|
|
||||||
|
The provider might fail to connect to the PipeWire core when starting up, so
|
||||||
|
when stopping we need to check the core is valid before attempting to acquire a
|
||||||
|
mutex on its loop.
|
||||||
|
---
|
||||||
|
src/gst/gstpipewiredeviceprovider.c | 9 +++++++--
|
||||||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c
|
||||||
|
index a9d8dd8b2..9f82507b3 100644
|
||||||
|
--- a/src/gst/gstpipewiredeviceprovider.c
|
||||||
|
+++ b/src/gst/gstpipewiredeviceprovider.c
|
||||||
|
@@ -665,11 +665,16 @@ gst_pipewire_device_provider_stop (GstDeviceProvider * provider)
|
||||||
|
{
|
||||||
|
GstPipeWireDeviceProvider *self = GST_PIPEWIRE_DEVICE_PROVIDER (provider);
|
||||||
|
|
||||||
|
- pw_thread_loop_lock (self->core->loop);
|
||||||
|
+ /* core might be NULL if we failed to connect in _start. */
|
||||||
|
+ if (self->core != NULL) {
|
||||||
|
+ pw_thread_loop_lock (self->core->loop);
|
||||||
|
+ }
|
||||||
|
GST_DEBUG_OBJECT (self, "stopping provider");
|
||||||
|
|
||||||
|
g_clear_pointer ((struct pw_proxy**)&self->registry, pw_proxy_destroy);
|
||||||
|
- pw_thread_loop_unlock (self->core->loop);
|
||||||
|
+ if (self->core != NULL) {
|
||||||
|
+ pw_thread_loop_unlock (self->core->loop);
|
||||||
|
+ }
|
||||||
|
g_clear_pointer (&self->core, gst_pipewire_core_release);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,54 @@
|
|||||||
|
From 31f91ce9f4302cea55244ab741022e40bbd4e716 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wim Taymans <wtaymans@redhat.com>
|
||||||
|
Date: Mon, 7 Aug 2023 19:57:01 +0200
|
||||||
|
Subject: [PATCH] jack: ports become visible when the registration is queued
|
||||||
|
|
||||||
|
As soon as the port registration is queued (but not yet emited) the port
|
||||||
|
becomes visible.
|
||||||
|
|
||||||
|
See #3416
|
||||||
|
---
|
||||||
|
pipewire-jack/src/pipewire-jack.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c
|
||||||
|
index 3d71f67be..7547d6ffb 100644
|
||||||
|
--- a/pipewire-jack/src/pipewire-jack.c
|
||||||
|
+++ b/pipewire-jack/src/pipewire-jack.c
|
||||||
|
@@ -171,6 +171,7 @@ struct object {
|
||||||
|
struct spa_hook proxy_listener;
|
||||||
|
struct spa_hook object_listener;
|
||||||
|
int registered;
|
||||||
|
+ unsigned int visible;
|
||||||
|
unsigned int removing:1;
|
||||||
|
unsigned int removed:1;
|
||||||
|
};
|
||||||
|
@@ -723,7 +724,7 @@ static struct object *find_port_by_name(struct client *c, const char *name)
|
||||||
|
struct object *o;
|
||||||
|
|
||||||
|
spa_list_for_each(o, &c->context.objects, link) {
|
||||||
|
- if (o->type != INTERFACE_Port || o->removed)
|
||||||
|
+ if (o->type != INTERFACE_Port || o->removed || !o->visible)
|
||||||
|
continue;
|
||||||
|
if (spa_streq(o->port.name, name) ||
|
||||||
|
spa_streq(o->port.alias1, name) ||
|
||||||
|
@@ -1056,6 +1057,7 @@ static int queue_notify(struct client *c, int type, struct object *o, int arg1,
|
||||||
|
break;
|
||||||
|
case NOTIFY_TYPE_PORTREGISTRATION:
|
||||||
|
emit = c->portregistration_callback != NULL && o != NULL;
|
||||||
|
+ o->visible = arg1;
|
||||||
|
break;
|
||||||
|
case NOTIFY_TYPE_CONNECT:
|
||||||
|
emit = c->connect_callback != NULL && o != NULL;
|
||||||
|
@@ -5989,7 +5991,7 @@ const char ** jack_get_ports (jack_client_t *client,
|
||||||
|
count = 0;
|
||||||
|
|
||||||
|
spa_list_for_each(o, &c->context.objects, link) {
|
||||||
|
- if (o->type != INTERFACE_Port || o->removed)
|
||||||
|
+ if (o->type != INTERFACE_Port || o->removed || !o->visible)
|
||||||
|
continue;
|
||||||
|
pw_log_debug("%p: check port type:%d flags:%08lx name:\"%s\"", c,
|
||||||
|
o->port.type_id, o->port.flags, o->port.name);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
From 820ca90705ae78124958f1b96de3bdc7889c2d1e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wim Taymans <wtaymans@redhat.com>
|
||||||
|
Date: Tue, 8 Aug 2023 13:01:30 +0200
|
||||||
|
Subject: [PATCH] pulse-server: set all change_mask flags when removing
|
||||||
|
|
||||||
|
So that the logic to emit events will select sink and source objects.
|
||||||
|
|
||||||
|
Fixes #3414
|
||||||
|
---
|
||||||
|
src/modules/module-protocol-pulse/manager.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/modules/module-protocol-pulse/manager.c b/src/modules/module-protocol-pulse/manager.c
|
||||||
|
index 91594ce62..76517f112 100644
|
||||||
|
--- a/src/modules/module-protocol-pulse/manager.c
|
||||||
|
+++ b/src/modules/module-protocol-pulse/manager.c
|
||||||
|
@@ -641,9 +641,10 @@ static void registry_event_global_remove(void *data, uint32_t id)
|
||||||
|
|
||||||
|
o->this.removing = true;
|
||||||
|
|
||||||
|
- if (!o->this.creating)
|
||||||
|
+ if (!o->this.creating) {
|
||||||
|
+ o->this.change_mask = ~0;
|
||||||
|
manager_emit_removed(m, &o->this);
|
||||||
|
-
|
||||||
|
+ }
|
||||||
|
object_destroy(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,44 @@
|
|||||||
|
From cbf97d4b00e8fb9d46eb4c53bf64073871d7ce87 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wim Taymans <wtaymans@redhat.com>
|
||||||
|
Date: Mon, 7 Aug 2023 19:58:20 +0200
|
||||||
|
Subject: [PATCH] jack: handle node.always-process = false jack nodes
|
||||||
|
|
||||||
|
Node that have the node.always-process = false property do not conform
|
||||||
|
to the jack API because they will be suspended even when they don't
|
||||||
|
inactivate themselves. Don't hide the ports for those clients when
|
||||||
|
inactive.
|
||||||
|
|
||||||
|
Fixes #3416
|
||||||
|
---
|
||||||
|
pipewire-jack/src/pipewire-jack.c | 13 ++++++++++---
|
||||||
|
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c
|
||||||
|
index 7547d6ffb..051eb1675 100644
|
||||||
|
--- a/pipewire-jack/src/pipewire-jack.c
|
||||||
|
+++ b/pipewire-jack/src/pipewire-jack.c
|
||||||
|
@@ -3075,11 +3075,18 @@ static void node_info(void *data, const struct pw_node_info *info)
|
||||||
|
{
|
||||||
|
struct object *n = data;
|
||||||
|
struct client *c = n->client;
|
||||||
|
+ const char *str;
|
||||||
|
+
|
||||||
|
+ if (info->change_mask & PW_NODE_CHANGE_MASK_PROPS) {
|
||||||
|
+ str = spa_dict_lookup(info->props, PW_KEY_NODE_ALWAYS_PROCESS);
|
||||||
|
+ n->node.is_jack = str ? spa_atob(str) : false;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- pw_log_info("DSP node %d state change %s", info->id,
|
||||||
|
- pw_node_state_as_string(info->state));
|
||||||
|
+ n->node.is_running = !n->node.is_jack || (info->state == PW_NODE_STATE_RUNNING);
|
||||||
|
|
||||||
|
- n->node.is_running = (info->state == PW_NODE_STATE_RUNNING);
|
||||||
|
+ pw_log_debug("DSP node %d %08"PRIx64" jack:%u state change %s running:%d", info->id,
|
||||||
|
+ info->change_mask, n->node.is_jack,
|
||||||
|
+ pw_node_state_as_string(info->state), n->node.is_running);
|
||||||
|
|
||||||
|
if (info->change_mask & PW_NODE_CHANGE_MASK_STATE) {
|
||||||
|
struct object *p;
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -1,3 +1,24 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Aug 18 12:01:36 UTC 2023 - Antonio Larrosa <alarrosa@suse.com>
|
||||||
|
|
||||||
|
- Fix from upstream to ensure effect and sink nodes are set to
|
||||||
|
running:
|
||||||
|
* 0001-context-Dont-stop-setting-runnable-when-meeting-the-driving.patch
|
||||||
|
|
||||||
|
- Fix from upstream to prevent a crash when stopping a device
|
||||||
|
provider:
|
||||||
|
* 0001-gst-Prevent-a-crash-when-stopping-device-provider.patch
|
||||||
|
|
||||||
|
- Fix from upstream to fix a regression that makes plugins/effects
|
||||||
|
disappear in Carla Patchbay when there's no playback:
|
||||||
|
* 0001-jack-ports-become-visible-when-the-registration-is-queued.patch
|
||||||
|
* 0002-jack-handle-node.always-process-=-false-jack-nodes.patch
|
||||||
|
|
||||||
|
- Fix from upstream to fix pavucontrol and plasma-pa showing
|
||||||
|
duplicated sinks after resume or switching audio device profiles
|
||||||
|
(boo#1214374):
|
||||||
|
* 0001-pulse-server-set-all-change_mask-flags-when-removing.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Sat Aug 5 12:23:12 UTC 2023 - Alexei Sorokin <sor.alexei@meowr.ru>
|
Sat Aug 5 12:23:12 UTC 2023 - Alexei Sorokin <sor.alexei@meowr.ru>
|
||||||
|
|
||||||
|
@ -70,6 +70,12 @@ Source0: %{name}-%{version}.tar.xz
|
|||||||
Source99: baselibs.conf
|
Source99: baselibs.conf
|
||||||
# PATCH-FIX-OPENSUSE reduce-meson-dependency.patch
|
# PATCH-FIX-OPENSUSE reduce-meson-dependency.patch
|
||||||
Patch0: reduce-meson-dependency.patch
|
Patch0: reduce-meson-dependency.patch
|
||||||
|
Patch1: 0001-context-Dont-stop-setting-runnable-when-meeting-the-driving.patch
|
||||||
|
Patch2: 0001-gst-Prevent-a-crash-when-stopping-device-provider.patch
|
||||||
|
Patch3: 0001-jack-ports-become-visible-when-the-registration-is-queued.patch
|
||||||
|
Patch4: 0002-jack-handle-node.always-process-=-false-jack-nodes.patch
|
||||||
|
Patch5: 0001-pulse-server-set-all-change_mask-flags-when-removing.patch
|
||||||
|
|
||||||
BuildRequires: docutils
|
BuildRequires: docutils
|
||||||
BuildRequires: doxygen
|
BuildRequires: doxygen
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
@ -382,6 +388,11 @@ JACK libraries.
|
|||||||
sed -ie "s/version : '0.3.72'/version : '%{version}'/" %{P:0}
|
sed -ie "s/version : '0.3.72'/version : '%{version}'/" %{P:0}
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%endif
|
%endif
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
%patch5 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%if %{pkg_vcmp gcc < 8}
|
%if %{pkg_vcmp gcc < 8}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user