Update to PipeWire 0.3.26 and enable JACK functionality
This updates to version 0.3.26, the version landing in Fedora 34 to resolve a number of issues around Bluetooth audio. Additionally, this release allows supporting JACK clients without a build dependency on JACK itself and we can serve fully as a replacement for JACK at build-time too. Reference upstream Fedora package commits: *81fb7bdd1f
*0f423aee50
*27a159e4ff
*fc1ac3105e
Relates: rhbz#1945951 Resolves: rhbz#1956854 Signed-off-by: Neal Gompa <ngompa13@gmail.com>
This commit is contained in:
parent
8074de36c9
commit
9f560c7d00
2
.gitignore
vendored
2
.gitignore
vendored
@ -43,3 +43,5 @@
|
||||
/pipewire-0.3.22.tar.gz
|
||||
/pipewire-0.3.23.tar.gz
|
||||
/pipewire-0.3.24.tar.gz
|
||||
/pipewire-0.3.25.tar.gz
|
||||
/pipewire-0.3.26.tar.gz
|
||||
|
@ -1,80 +0,0 @@
|
||||
From 503feaa3fa857982c5f1b3c8cfc224ea99cd17a5 Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Fri, 19 Mar 2021 12:46:05 +0100
|
||||
Subject: [PATCH 02/10] pipewire-pulse: set correct errno values
|
||||
|
||||
errno should be set to the positive errno value.
|
||||
|
||||
This does not cause problems except for the pulse-server where the
|
||||
errno value is negated and returned as an error result.
|
||||
---
|
||||
spa/plugins/alsa/alsa-pcm-device.c | 2 +-
|
||||
spa/plugins/bluez5/bluez5-device.c | 4 ++--
|
||||
spa/plugins/jack/jack-device.c | 2 +-
|
||||
src/modules/module-protocol-pulse/module.c | 2 +-
|
||||
4 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/spa/plugins/alsa/alsa-pcm-device.c b/spa/plugins/alsa/alsa-pcm-device.c
|
||||
index 285a76f28..af30ed2da 100644
|
||||
--- a/spa/plugins/alsa/alsa-pcm-device.c
|
||||
+++ b/spa/plugins/alsa/alsa-pcm-device.c
|
||||
@@ -355,7 +355,7 @@ static struct spa_pod *build_profile(struct impl *this, struct spa_pod_builder *
|
||||
desc = "On";
|
||||
break;
|
||||
default:
|
||||
- errno = -EINVAL;
|
||||
+ errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
diff --git a/spa/plugins/bluez5/bluez5-device.c b/spa/plugins/bluez5/bluez5-device.c
|
||||
index 7a747f415..b8d8ae5a9 100644
|
||||
--- a/spa/plugins/bluez5/bluez5-device.c
|
||||
+++ b/spa/plugins/bluez5/bluez5-device.c
|
||||
@@ -660,7 +660,7 @@ static struct spa_pod *build_profile(struct impl *this, struct spa_pod_builder *
|
||||
break;
|
||||
}
|
||||
default:
|
||||
- errno = -EINVAL;
|
||||
+ errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -775,7 +775,7 @@ static struct spa_pod *build_route(struct impl *this, struct spa_pod_builder *b,
|
||||
snprintf(name, sizeof(name), "%s-output", name_prefix);
|
||||
break;
|
||||
default:
|
||||
- errno = -EINVAL;
|
||||
+ errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
diff --git a/spa/plugins/jack/jack-device.c b/spa/plugins/jack/jack-device.c
|
||||
index 75d6522e8..3c56e0a20 100644
|
||||
--- a/spa/plugins/jack/jack-device.c
|
||||
+++ b/spa/plugins/jack/jack-device.c
|
||||
@@ -244,7 +244,7 @@ static struct spa_pod *build_profile(struct impl *this, struct spa_pod_builder *
|
||||
desc = "On";
|
||||
break;
|
||||
default:
|
||||
- errno = -EINVAL;
|
||||
+ errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
diff --git a/src/modules/module-protocol-pulse/module.c b/src/modules/module-protocol-pulse/module.c
|
||||
index 52a90fbe3..987f65ef7 100644
|
||||
--- a/src/modules/module-protocol-pulse/module.c
|
||||
+++ b/src/modules/module-protocol-pulse/module.c
|
||||
@@ -176,7 +176,7 @@ static struct module *create_module(struct client *client, const char *name, con
|
||||
|
||||
info = find_module_info(name);
|
||||
if (info == NULL) {
|
||||
- errno = -ENOENT;
|
||||
+ errno = ENOENT;
|
||||
return NULL;
|
||||
}
|
||||
module = info->create(impl, args);
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,67 +0,0 @@
|
||||
From edf102a6659b4eb58eebf055d459e182508a521c Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Fri, 19 Mar 2021 15:51:17 +0100
|
||||
Subject: [PATCH 03/10] media-session: check stream move after configuring a
|
||||
new node
|
||||
|
||||
When a new node is configured, check if existing streams might need to
|
||||
be moved to it.
|
||||
|
||||
This fixes the case where a stream has a target node set to some
|
||||
bluetooth device and it starts playing to the default device because
|
||||
the bluetooth device is not connected. When the BT device is then
|
||||
connected and configured, the stream is moved to the new BT device.
|
||||
---
|
||||
src/examples/media-session/policy-node.c | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/src/examples/media-session/policy-node.c b/src/examples/media-session/policy-node.c
|
||||
index 966da2fe3..7ed73e9a5 100644
|
||||
--- a/src/examples/media-session/policy-node.c
|
||||
+++ b/src/examples/media-session/policy-node.c
|
||||
@@ -123,6 +123,8 @@ struct node {
|
||||
unsigned int virtual:1;
|
||||
};
|
||||
|
||||
+static int check_new_target(struct impl *impl, struct node *target);
|
||||
+
|
||||
static bool find_format(struct node *node)
|
||||
{
|
||||
struct impl *impl = node->impl;
|
||||
@@ -210,6 +212,9 @@ static int configure_node(struct node *node, struct spa_audio_info *info, bool f
|
||||
|
||||
node->configured = true;
|
||||
|
||||
+ if (node->type == NODE_TYPE_DEVICE)
|
||||
+ check_new_target(impl, node);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -970,6 +975,23 @@ static int handle_move(struct impl *impl, struct node *src_node, struct node *ds
|
||||
return do_move_node(src_node, src_node->peer, dst_node);
|
||||
}
|
||||
|
||||
+static int check_new_target(struct impl *impl, struct node *target)
|
||||
+{
|
||||
+ struct node *node;
|
||||
+ const char *str = get_device_name(target);
|
||||
+
|
||||
+ spa_list_for_each(node, &impl->node_list, link) {
|
||||
+ pw_log_debug(NAME" %p: node %d target '%s' find:%s", impl,
|
||||
+ node->id, node->obj->target_node, str);
|
||||
+
|
||||
+ if (node->obj->target_node != NULL &&
|
||||
+ strcmp(node->obj->target_node , str) == 0) {
|
||||
+ handle_move(impl, node, target);
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int metadata_property(void *object, uint32_t subject,
|
||||
const char *key, const char *type, const char *value)
|
||||
{
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,51 +0,0 @@
|
||||
From c0897f2f2cb02d1f1f7893e84c1961313d60c0aa Mon Sep 17 00:00:00 2001
|
||||
From: Pauli Virtanen <pav@iki.fi>
|
||||
Date: Sat, 20 Mar 2021 15:02:55 +0200
|
||||
Subject: [PATCH 04/10] pulse-server: don't send invalid port profile arrays
|
||||
|
||||
libpulse assumes in introspect.c:fill_card_port_info that port profile
|
||||
array size <= card profile array size, and may crash otherwise.
|
||||
|
||||
Enforce this in fill_card_info. It can happen, if EnumRoute and
|
||||
EnumProfile info is not in sync.
|
||||
---
|
||||
src/modules/module-protocol-pulse/pulse-server.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
index cf15acce1..842abb16e 100644
|
||||
--- a/src/modules/module-protocol-pulse/pulse-server.c
|
||||
+++ b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
@@ -3933,7 +3933,7 @@ static int fill_card_info(struct client *client, struct message *m,
|
||||
for (n = 0; n < n_ports; n++) {
|
||||
struct spa_dict_item *items;
|
||||
struct spa_dict *pdict = NULL, dict;
|
||||
- uint32_t i;
|
||||
+ uint32_t i, pi_n_profiles;
|
||||
|
||||
pi = &port_info[n];
|
||||
|
||||
@@ -3952,11 +3952,18 @@ static int fill_card_info(struct client *client, struct message *m,
|
||||
TAG_PROPLIST, pdict, /* port proplist */
|
||||
TAG_INVALID);
|
||||
|
||||
+ pi_n_profiles = SPA_MIN(pi->n_profiles, n_profiles);
|
||||
+ if (pi->n_profiles != pi_n_profiles) {
|
||||
+ /* libpulse assumes port profile array size <= n_profiles */
|
||||
+ pw_log_error(NAME" %p: card %d port %d profiles inconsistent (%d < %d)",
|
||||
+ client->impl, o->id, n, n_profiles, pi->n_profiles);
|
||||
+ }
|
||||
+
|
||||
message_put(m,
|
||||
- TAG_U32, pi->n_profiles, /* n_profiles */
|
||||
+ TAG_U32, pi_n_profiles, /* n_profiles */
|
||||
TAG_INVALID);
|
||||
|
||||
- for (i = 0; i < pi->n_profiles; i++) {
|
||||
+ for (i = 0; i < pi_n_profiles; i++) {
|
||||
uint32_t idx = pi->profiles[i];
|
||||
message_put(m,
|
||||
TAG_STRING, idx < n_profiles ?
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 00782c4d5b3fc0a6ec3ac8e6f14d317c609ecd7c Mon Sep 17 00:00:00 2001
|
||||
From: Pauli Virtanen <pav@iki.fi>
|
||||
Date: Sat, 20 Mar 2021 15:32:26 +0200
|
||||
Subject: [PATCH 05/10] pulse-server: fix route profile numbering
|
||||
|
||||
Route profile numbers refer to profile ids, not indices.
|
||||
---
|
||||
src/modules/module-protocol-pulse/pulse-server.c | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
index 842abb16e..7a6082198 100644
|
||||
--- a/src/modules/module-protocol-pulse/pulse-server.c
|
||||
+++ b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
@@ -3964,10 +3964,18 @@ static int fill_card_info(struct client *client, struct message *m,
|
||||
TAG_INVALID);
|
||||
|
||||
for (i = 0; i < pi_n_profiles; i++) {
|
||||
- uint32_t idx = pi->profiles[i];
|
||||
+ uint32_t j;
|
||||
+ const char *name = "off";
|
||||
+
|
||||
+ for (j = 0; j < n_profiles; ++j) {
|
||||
+ if (profile_info[j].id == pi->profiles[i]) {
|
||||
+ name = profile_info[j].name;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
message_put(m,
|
||||
- TAG_STRING, idx < n_profiles ?
|
||||
- profile_info[idx].name : "off", /* profile name */
|
||||
+ TAG_STRING, name, /* profile name */
|
||||
TAG_INVALID);
|
||||
}
|
||||
if (client->version >= 27) {
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,36 +0,0 @@
|
||||
From f5aba5f0dcf63996bd2444da13f353b290da3601 Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Tue, 23 Mar 2021 10:17:01 +0100
|
||||
Subject: [PATCH 06/10] impl-node: first start the node, then make it
|
||||
schedulable
|
||||
|
||||
We first need to issue the start command for driver nodes and then
|
||||
we can add the node to be scheduled. Else we might end up with nodes
|
||||
that receive the _process callback without the Start command being
|
||||
called first and we can crash.
|
||||
|
||||
See #904
|
||||
---
|
||||
src/pipewire/impl-node.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c
|
||||
index 0afcab53e..75a7d2a79 100644
|
||||
--- a/src/pipewire/impl-node.c
|
||||
+++ b/src/pipewire/impl-node.c
|
||||
@@ -338,10 +338,11 @@ static void node_update_state(struct pw_impl_node *node, enum pw_node_state stat
|
||||
|
||||
switch (state) {
|
||||
case PW_NODE_STATE_RUNNING:
|
||||
- pw_loop_invoke(node->data_loop, do_node_add, 1, NULL, 0, true, node);
|
||||
if (node->driving && node->driver)
|
||||
spa_node_send_command(node->node,
|
||||
&SPA_NODE_COMMAND_INIT(SPA_NODE_COMMAND_Start));
|
||||
+
|
||||
+ pw_loop_invoke(node->data_loop, do_node_add, 1, NULL, 0, true, node);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,41 +0,0 @@
|
||||
From aaffc0947a8144b6cfaa5ccc076bc8a7b64fb755 Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Wed, 24 Mar 2021 11:48:32 +0100
|
||||
Subject: [PATCH 07/10] alsa: never queue buffers when rate matching
|
||||
|
||||
When we are following the resampler requested size in capture, never
|
||||
keep queued buffers around or we might get out of sync with the
|
||||
requested size and cause cracks and pops in the resampler.
|
||||
|
||||
See #805
|
||||
---
|
||||
spa/plugins/alsa/alsa-pcm.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/spa/plugins/alsa/alsa-pcm.c b/spa/plugins/alsa/alsa-pcm.c
|
||||
index 911f12ba2..00d554070 100644
|
||||
--- a/spa/plugins/alsa/alsa-pcm.c
|
||||
+++ b/spa/plugins/alsa/alsa-pcm.c
|
||||
@@ -1147,6 +1147,9 @@ push_frames(struct state *state,
|
||||
snd_pcm_readi(state->hndl, bufs[0], total_frames);
|
||||
}
|
||||
}
|
||||
+ spa_log_trace_fp(state->log, NAME" %p: wrote %ld frames into buffer %d",
|
||||
+ state, total_frames, b->id);
|
||||
+
|
||||
spa_list_append(&state->ready, &b->link);
|
||||
}
|
||||
return total_frames;
|
||||
@@ -1307,7 +1310,8 @@ static int handle_capture(struct state *state, uint64_t nsec,
|
||||
return 0;
|
||||
|
||||
io = state->io;
|
||||
- if (io != NULL && io->status != SPA_STATUS_HAVE_DATA) {
|
||||
+ if (io != NULL &&
|
||||
+ (io->status != SPA_STATUS_HAVE_DATA || state->rate_match != NULL)) {
|
||||
struct buffer *b;
|
||||
|
||||
if (io->buffer_id < state->n_buffers)
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,82 +0,0 @@
|
||||
From e5a58f1abb75fd1d51f4e769f0fffdc287ecd2d1 Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Thu, 25 Mar 2021 09:08:13 +0100
|
||||
Subject: [PATCH 08/10] pulse-server: handle NULL proxy
|
||||
|
||||
The proxy could be removed before we get the global remove so we need
|
||||
to handle the case where we access an object without a proxy and
|
||||
avoid a crash.
|
||||
---
|
||||
src/modules/module-protocol-pulse/manager.c | 2 ++
|
||||
src/modules/module-protocol-pulse/pulse-server.c | 14 ++++++++++++++
|
||||
2 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/src/modules/module-protocol-pulse/manager.c b/src/modules/module-protocol-pulse/manager.c
|
||||
index 184b08035..78b8d1bb8 100644
|
||||
--- a/src/modules/module-protocol-pulse/manager.c
|
||||
+++ b/src/modules/module-protocol-pulse/manager.c
|
||||
@@ -711,6 +711,8 @@ int pw_manager_set_metadata(struct pw_manager *manager,
|
||||
return -ENOTSUP;
|
||||
if (!SPA_FLAG_IS_SET(metadata->permissions, PW_PERM_W|PW_PERM_X))
|
||||
return -EACCES;
|
||||
+ if (metadata->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
|
||||
if (type != NULL) {
|
||||
va_start(args, format);
|
||||
diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
index 7a6082198..8efd2d609 100644
|
||||
--- a/src/modules/module-protocol-pulse/pulse-server.c
|
||||
+++ b/src/modules/module-protocol-pulse/pulse-server.c
|
||||
@@ -3034,6 +3034,8 @@ static int set_node_volume_mute(struct pw_manager_object *o,
|
||||
|
||||
if (!SPA_FLAG_IS_SET(o->permissions, PW_PERM_W | PW_PERM_X))
|
||||
return -EACCES;
|
||||
+ if (o->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
|
||||
spa_pod_builder_push_object(&b, &f[0],
|
||||
SPA_TYPE_OBJECT_Props, SPA_PARAM_Props);
|
||||
@@ -3064,6 +3066,9 @@ static int set_card_volume_mute_delay(struct pw_manager_object *o, uint32_t id,
|
||||
if (!SPA_FLAG_IS_SET(o->permissions, PW_PERM_W | PW_PERM_X))
|
||||
return -EACCES;
|
||||
|
||||
+ if (o->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
spa_pod_builder_push_object(&b, &f[0],
|
||||
SPA_TYPE_OBJECT_ParamRoute, SPA_PARAM_Route);
|
||||
spa_pod_builder_add(&b,
|
||||
@@ -3104,6 +3109,9 @@ static int set_card_port(struct pw_manager_object *o, uint32_t device_id,
|
||||
if (!SPA_FLAG_IS_SET(o->permissions, PW_PERM_W | PW_PERM_X))
|
||||
return -EACCES;
|
||||
|
||||
+ if (o->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
pw_device_set_param((struct pw_device*)o->proxy,
|
||||
SPA_PARAM_Route, 0,
|
||||
spa_pod_builder_add_object(&b,
|
||||
@@ -4888,6 +4896,9 @@ static int do_set_profile(struct client *client, uint32_t command, uint32_t tag,
|
||||
if (!SPA_FLAG_IS_SET(o->permissions, PW_PERM_W | PW_PERM_X))
|
||||
return -EACCES;
|
||||
|
||||
+ if (o->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
pw_device_set_param((struct pw_device*)o->proxy,
|
||||
SPA_PARAM_Profile, 0,
|
||||
spa_pod_builder_add_object(&b,
|
||||
@@ -4960,6 +4971,9 @@ static int do_suspend(struct client *client, uint32_t command, uint32_t tag, str
|
||||
if ((o = find_device(client, id, name, sink)) == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
+ if (o->proxy == NULL)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
if (suspend) {
|
||||
cmd = SPA_NODE_COMMAND_Suspend;
|
||||
pw_node_send_command((struct pw_node*)o->proxy, &SPA_NODE_COMMAND_INIT(cmd));
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,99 +0,0 @@
|
||||
From f918e5e2c782b0dbc9d189ebe330a121c829193f Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Thu, 25 Mar 2021 11:30:58 +0100
|
||||
Subject: [PATCH 09/10] impl-port: only add the port when buffers are
|
||||
negotiated
|
||||
|
||||
To avoid crashes when the node is scheduled but buffer have been
|
||||
cleared.
|
||||
|
||||
See #904
|
||||
---
|
||||
src/pipewire/impl-port.c | 24 +++++++++++++++++++-----
|
||||
src/pipewire/private.h | 5 +++--
|
||||
2 files changed, 22 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c
|
||||
index bd6074d7f..9b1a0455b 100644
|
||||
--- a/src/pipewire/impl-port.c
|
||||
+++ b/src/pipewire/impl-port.c
|
||||
@@ -961,8 +961,6 @@ int pw_impl_port_add(struct pw_impl_port *port, struct pw_impl_node *node)
|
||||
if (node->global)
|
||||
pw_impl_port_register(port, NULL);
|
||||
|
||||
- pw_loop_invoke(node->data_loop, do_add_port, SPA_ID_INVALID, NULL, 0, false, port);
|
||||
-
|
||||
if (port->state <= PW_IMPL_PORT_STATE_INIT)
|
||||
pw_impl_port_update_state(port, PW_IMPL_PORT_STATE_CONFIGURE, 0, NULL);
|
||||
|
||||
@@ -1001,10 +999,13 @@ static void pw_impl_port_remove(struct pw_impl_port *port)
|
||||
if (node == NULL)
|
||||
return;
|
||||
|
||||
- pw_log_debug(NAME" %p: remove", port);
|
||||
+ pw_log_debug(NAME" %p: remove added:%d", port, port->added);
|
||||
|
||||
- pw_loop_invoke(port->node->data_loop, do_remove_port,
|
||||
- SPA_ID_INVALID, NULL, 0, true, port);
|
||||
+ if (port->added) {
|
||||
+ pw_loop_invoke(node->data_loop, do_remove_port,
|
||||
+ SPA_ID_INVALID, NULL, 0, true, port);
|
||||
+ port->added = false;
|
||||
+ }
|
||||
|
||||
if (SPA_FLAG_IS_SET(port->flags, PW_IMPL_PORT_FLAG_TO_REMOVE)) {
|
||||
if ((res = spa_node_remove_port(node->node, port->direction, port->port_id)) < 0)
|
||||
@@ -1295,6 +1296,10 @@ int pw_impl_port_set_param(struct pw_impl_port *port, uint32_t id, uint32_t flag
|
||||
if (id == SPA_PARAM_Format) {
|
||||
pw_log_debug(NAME" %p: %d %p %d", port, port->state, param, res);
|
||||
|
||||
+ if (port->added) {
|
||||
+ pw_loop_invoke(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, true, port);
|
||||
+ port->added = false;
|
||||
+ }
|
||||
/* setting the format always destroys the negotiated buffers */
|
||||
pw_buffers_clear(&port->buffers);
|
||||
pw_buffers_clear(&port->mix_buffers);
|
||||
@@ -1327,6 +1332,11 @@ static int negotiate_mixer_buffers(struct pw_impl_port *port, uint32_t flags,
|
||||
pw_log_debug(NAME" %p: %d.%d negotiate %d buffers on node: %p",
|
||||
port, port->direction, port->port_id, n_buffers, node->node);
|
||||
|
||||
+ if (port->added) {
|
||||
+ pw_loop_invoke(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, true, port);
|
||||
+ port->added = false;
|
||||
+ }
|
||||
+
|
||||
pw_buffers_clear(&port->mix_buffers);
|
||||
|
||||
if (n_buffers > 0) {
|
||||
@@ -1356,6 +1366,10 @@ static int negotiate_mixer_buffers(struct pw_impl_port *port, uint32_t flags,
|
||||
pw_direction_reverse(port->direction), 0,
|
||||
0, buffers, n_buffers);
|
||||
}
|
||||
+ if (!port->added && n_buffers > 0) {
|
||||
+ pw_loop_invoke(node->data_loop, do_add_port, SPA_ID_INVALID, NULL, 0, false, port);
|
||||
+ port->added = true;
|
||||
+ }
|
||||
return res;
|
||||
}
|
||||
|
||||
diff --git a/src/pipewire/private.h b/src/pipewire/private.h
|
||||
index 186de6fd1..e6b6788aa 100644
|
||||
--- a/src/pipewire/private.h
|
||||
+++ b/src/pipewire/private.h
|
||||
@@ -786,9 +786,10 @@ struct pw_impl_port {
|
||||
struct spa_list mix_list;
|
||||
struct spa_list node_link;
|
||||
} rt; /**< data only accessed from the data thread */
|
||||
+ unsigned int added:1;
|
||||
|
||||
- void *owner_data; /**< extra owner data */
|
||||
- void *user_data; /**< extra user data */
|
||||
+ void *owner_data; /**< extra owner data */
|
||||
+ void *user_data; /**< extra user data */
|
||||
};
|
||||
|
||||
struct pw_control_link {
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,48 +0,0 @@
|
||||
From d53adf0ba12761fa690ce1b8e1d4f85dc961338d Mon Sep 17 00:00:00 2001
|
||||
From: Wim Taymans <wtaymans@redhat.com>
|
||||
Date: Thu, 25 Mar 2021 15:33:18 +0100
|
||||
Subject: [PATCH 10/10] pulse-server: avoid returning NULL strings
|
||||
|
||||
Don't return a NULL string when converting an id to a string because
|
||||
some callers don't expect this and crash.
|
||||
---
|
||||
src/modules/module-protocol-pulse/format.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/modules/module-protocol-pulse/format.c b/src/modules/module-protocol-pulse/format.c
|
||||
index 33d8ffb48..f4424cd3f 100644
|
||||
--- a/src/modules/module-protocol-pulse/format.c
|
||||
+++ b/src/modules/module-protocol-pulse/format.c
|
||||
@@ -129,7 +129,8 @@ static inline const char *format_id2paname(uint32_t id)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < SPA_N_ELEMENTS(audio_formats); i++) {
|
||||
- if (id == audio_formats[i].id)
|
||||
+ if (id == audio_formats[i].id &&
|
||||
+ audio_formats[i].name != NULL)
|
||||
return audio_formats[i].name;
|
||||
}
|
||||
return "invalid";
|
||||
@@ -371,7 +372,8 @@ static inline const char *channel_id2paname(uint32_t id, uint32_t *aux)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < SPA_N_ELEMENTS(audio_channels); i++) {
|
||||
- if (id == audio_channels[i].channel)
|
||||
+ if (id == audio_channels[i].channel &&
|
||||
+ audio_channels[i].name != NULL)
|
||||
return audio_channels[i].name;
|
||||
}
|
||||
return audio_channels[CHANNEL_POSITION_AUX0 + (*aux)++].name;
|
||||
@@ -512,7 +514,8 @@ static const char *encoding_names[] = {
|
||||
|
||||
static inline const char *format_encoding2name(enum encoding enc)
|
||||
{
|
||||
- if (enc >= 0 && enc < (int)SPA_N_ELEMENTS(encoding_names))
|
||||
+ if (enc >= 0 && enc < (int)SPA_N_ELEMENTS(encoding_names) &&
|
||||
+ encoding_names[enc] != NULL)
|
||||
return encoding_names[enc];
|
||||
return "INVALID";
|
||||
}
|
||||
--
|
||||
2.26.3
|
||||
|
@ -1,6 +1,6 @@
|
||||
%global majorversion 0
|
||||
%global minorversion 3
|
||||
%global microversion 24
|
||||
%global microversion 26
|
||||
|
||||
%global apiversion 0.3
|
||||
%global spaversion 0.2
|
||||
@ -8,7 +8,7 @@
|
||||
%global libversion %{soversion}.%(bash -c '((intversion = (%{minorversion} * 100) + %{microversion})); echo ${intversion}').0
|
||||
|
||||
# For rpmdev-bumpspec and releng automation
|
||||
%global baserelease 5
|
||||
%global baserelease 1
|
||||
|
||||
#global snapdate 20210107
|
||||
#global gitcommit b17db2cebc1a5ab2c01851d29c05f79cd2f262bb
|
||||
@ -27,18 +27,19 @@
|
||||
# Features disabled for RHEL 8
|
||||
%if 0%{?rhel} && 0%{?rhel} < 9
|
||||
%bcond_with pulse
|
||||
%bcond_with jack
|
||||
%else
|
||||
%bcond_without pulse
|
||||
%bcond_without jack
|
||||
%endif
|
||||
|
||||
# Features disabled for RHEL
|
||||
%if 0%{?rhel}
|
||||
%bcond_with jack
|
||||
%bcond_with jackserver_plugin
|
||||
%else
|
||||
%bcond_without jack
|
||||
%bcond_without jackserver_plugin
|
||||
%endif
|
||||
|
||||
|
||||
Name: pipewire
|
||||
Summary: Media Sharing Server
|
||||
Version: %{majorversion}.%{minorversion}.%{microversion}
|
||||
@ -56,16 +57,7 @@ Source0: https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/%{version}/p
|
||||
## upstreamable patches
|
||||
|
||||
## fedora patches
|
||||
Patch0: 0001-conf-start-media-session-through-pipewire.patch
|
||||
Patch1: 0002-pipewire-pulse-set-correct-errno-values.patch
|
||||
Patch2: 0003-media-session-check-stream-move-after-configuring-a-.patch
|
||||
Patch3: 0004-pulse-server-don-t-send-invalid-port-profile-arrays.patch
|
||||
Patch4: 0005-pulse-server-fix-route-profile-numbering.patch
|
||||
Patch5: 0006-impl-node-first-start-the-node-then-make-it-schedula.patch
|
||||
Patch6: 0007-alsa-never-queue-buffers-when-rate-matching.patch
|
||||
Patch7: 0008-pulse-server-handle-NULL-proxy.patch
|
||||
Patch8: 0009-impl-port-only-add-the-port-when-buffers-are-negotia.patch
|
||||
Patch9: 0010-pulse-server-avoid-returning-NULL-strings.patch
|
||||
Patch1001: 0001-conf-start-media-session-through-pipewire.patch
|
||||
|
||||
|
||||
BuildRequires: gettext
|
||||
@ -179,7 +171,6 @@ Summary: PipeWire JACK implementation
|
||||
License: MIT
|
||||
Recommends: %{name}%{?_isa} = %{version}-%{release}
|
||||
Requires: %{name}-libjack%{?_isa} = %{version}-%{release}
|
||||
BuildRequires: jack-audio-connection-kit-devel >= 1.9.10
|
||||
Conflicts: jack-audio-connection-kit
|
||||
Conflicts: jack-audio-connection-kit-dbus
|
||||
# Fixed jack subpackages
|
||||
@ -200,6 +191,19 @@ Obsoletes: jack-audio-connection-kit < 1.9.16-2
|
||||
%description jack-audio-connection-kit
|
||||
This package provides a JACK implementation based on PipeWire
|
||||
|
||||
%package jack-audio-connection-kit-devel
|
||||
Summary: Development files for %{name}-jack-audio-connection-kit
|
||||
License: MIT
|
||||
Requires: %{name}-jack-audio-connection-kit%{?_isa} = %{version}-%{release}
|
||||
Conflicts: jack-audio-connection-kit-devel
|
||||
Enhances: %{name}-jack-audio-connection-kit
|
||||
|
||||
%description jack-audio-connection-kit-devel
|
||||
This package provides development files for building JACK applications
|
||||
using PipeWire's JACK library.
|
||||
%endif
|
||||
|
||||
%if %{with jackserver_plugin}
|
||||
%package plugin-jack
|
||||
Summary: PipeWire media server JACK support
|
||||
License: MIT
|
||||
@ -262,7 +266,9 @@ This package provides a PulseAudio implementation based on PipeWire
|
||||
%ifarch s390x
|
||||
-D bluez5-codec-ldac=disabled \
|
||||
%endif
|
||||
%{!?with_jack:-D jack=disabled -D pipewire-jack=disabled} \
|
||||
%{!?with_jack:-D pipewire-jack=disabled} \
|
||||
%{!?with_jackserver_plugin:-D jack=disabled} \
|
||||
%{?with_jack:-D jack-devel=enabled} \
|
||||
%{!?with_alsa:-D pipewire-alsa=disabled} \
|
||||
%{?with_vulkan:-D vulkan=enabled}
|
||||
%meson_build
|
||||
@ -402,6 +408,8 @@ systemctl --no-reload preset --global pipewire.socket >/dev/null 2>&1 || :
|
||||
%{_bindir}/pw-dot
|
||||
%{_bindir}/pw-cat
|
||||
%{_bindir}/pw-dump
|
||||
%{_bindir}/pw-link
|
||||
%{_bindir}/pw-loopback
|
||||
%{_bindir}/pw-play
|
||||
%{_bindir}/pw-profiler
|
||||
%{_bindir}/pw-record
|
||||
@ -436,13 +444,22 @@ systemctl --no-reload preset --global pipewire.socket >/dev/null 2>&1 || :
|
||||
%files jack-audio-connection-kit
|
||||
%{_bindir}/pw-jack
|
||||
%{_mandir}/man1/pw-jack.1*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjack.so*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjacknet.so*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjackserver.so*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjack.so.*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjacknet.so.*
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjackserver.so.*
|
||||
%config(noreplace) %{_sysconfdir}/pipewire/jack.conf
|
||||
%config(noreplace) %{_sysconfdir}/pipewire/media-session.d/with-jack
|
||||
%{_sysconfdir}/ld.so.conf.d/pipewire-jack-%{_arch}.conf
|
||||
|
||||
%files jack-audio-connection-kit-devel
|
||||
%{_includedir}/jack/
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjack.so
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjacknet.so
|
||||
%{_libdir}/pipewire-%{apiversion}/jack/libjackserver.so
|
||||
%{_libdir}/pkgconfig/jack.pc
|
||||
%endif
|
||||
|
||||
%if %{with jackserver_plugin}
|
||||
%files plugin-jack
|
||||
%{_libdir}/spa-%{spaversion}/jack/
|
||||
%endif
|
||||
@ -456,6 +473,10 @@ systemctl --no-reload preset --global pipewire.socket >/dev/null 2>&1 || :
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Sat Apr 24 2021 Neal Gompa <ngompa13@gmail.com> - 0.3.26-1
|
||||
- Update to 0.3.26
|
||||
- Add jack-devel subpackage, enable JACK support on RHEL 9+ (#1945951)
|
||||
|
||||
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 0.3.24-5
|
||||
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
||||
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (pipewire-0.3.24.tar.gz) = be1fd3b15aae4fc276dd7e4be385cd58e6e9626d6e0a42b7bc3eb46ba324759c05320547aa857510ecf24b1628b76555222d342350d6406ad4d7b536cb3db497
|
||||
SHA512 (pipewire-0.3.26.tar.gz) = d771956a42801a6e07fac48a175363eb4107a9fba13d649ff5c2cdc40044c84a61bf56050783507f6dd8efae8c59a2be07ec67433827335ae60f8116c4a4e178
|
||||
|
Loading…
Reference in New Issue
Block a user