Accepting request 1058207 from home:alarrosa:branches:multimedia:libs

OBS-URL: https://build.opensuse.org/request/show/1058207
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/pipewire?expand=0&rev=104
This commit is contained in:
Antonio Larrosa 2023-01-13 11:06:50 +00:00 committed by Git OBS Bridge
parent 95609343fc
commit 38407cb16a
13 changed files with 0 additions and 1406 deletions

View File

@ -1,29 +0,0 @@
From 89ac6b353521fb9a6d6eb6bb74724c4fa968f75c Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Sat, 17 Dec 2022 18:17:33 +0100
Subject: [PATCH] =?UTF-8?q?alsa:=20don=C2=B4t=20set=20-1=20as=20node.targe?=
=?UTF-8?q?t?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Leave the target unset when -1, just like what pw-stream does.
See #2893
---
pipewire-alsa/alsa-plugins/pcm_pipewire.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pipewire-alsa/alsa-plugins/pcm_pipewire.c b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
index 37a907b24..96b57da78 100644
--- a/pipewire-alsa/alsa-plugins/pcm_pipewire.c
+++ b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
@@ -579,7 +579,7 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
pw_properties_setf(props, PW_KEY_NODE_LATENCY, "%lu/%u", pw->min_avail, io->rate);
if (pw_properties_get(props, PW_KEY_NODE_RATE) == NULL)
pw_properties_setf(props, PW_KEY_NODE_RATE, "1/%u", io->rate);
- if (pw->target != NULL &&
+ if (pw->target != NULL && !spa_streq(pw->target, "-1") &&
pw_properties_get(props, PW_KEY_NODE_TARGET) == NULL)
pw_properties_setf(props, PW_KEY_NODE_TARGET, "%s", pw->target);

View File

@ -1,24 +0,0 @@
From ed463248721cc03c826f80dac9667b238c844e03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Sun, 1 Jan 2023 02:00:36 +0000
Subject: [PATCH] alsa: fix memory leak of properties
---
pipewire-alsa/alsa-plugins/ctl_pipewire.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/pipewire-alsa/alsa-plugins/ctl_pipewire.c b/pipewire-alsa/alsa-plugins/ctl_pipewire.c
index 71f02f90e..67bd2f432 100644
--- a/pipewire-alsa/alsa-plugins/ctl_pipewire.c
+++ b/pipewire-alsa/alsa-plugins/ctl_pipewire.c
@@ -1083,6 +1083,7 @@ static void proxy_destroy(void *data)
struct global *g = data;
spa_list_remove(&g->link);
g->proxy = NULL;
+ pw_properties_free(g->props);
}
static const struct pw_proxy_events proxy_events = {
--
GitLab

View File

@ -1,156 +0,0 @@
From 9f3237b74edc3df467cca50af7c09f1e3c89abea Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Mon, 9 Jan 2023 17:54:23 +0100
Subject: [PATCH] context: keep per node quantum and rate settings
Copy the global quantum and rate limits before applying node specific
settings. Otherwise one node settings will propagate to the defaults
of the next nodes, which can result in impossible or wrong settings.
See #2925
---
src/pipewire/context.c | 57 ++++++++++++++++++++++++++----------------
1 file changed, 36 insertions(+), 21 deletions(-)
diff --git a/src/pipewire/context.c b/src/pipewire/context.c
index ab798c20e..384682701 100644
--- a/src/pipewire/context.c
+++ b/src/pipewire/context.c
@@ -917,7 +917,7 @@ static inline void get_quantums(struct pw_context *context, uint32_t *def,
*limit = s->clock_quantum_limit;
}
-static inline uint32_t *get_rates(struct pw_context *context, uint32_t *def, uint32_t *n_rates,
+static inline const uint32_t *get_rates(struct pw_context *context, uint32_t *def, uint32_t *n_rates,
bool *force)
{
struct settings *s = &context->settings;
@@ -971,7 +971,7 @@ static int fraction_compare(const struct spa_fraction *a, const struct spa_fract
return fa < fb ? -1 : (fa > fb ? 1 : 0);
}
-static uint32_t find_best_rate(uint32_t *rates, uint32_t n_rates, uint32_t rate, uint32_t best)
+static uint32_t find_best_rate(const uint32_t *rates, uint32_t n_rates, uint32_t rate, uint32_t best)
{
uint32_t i;
for (i = 0; i < n_rates; i++) {
@@ -1005,9 +1005,10 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
struct impl *impl = SPA_CONTAINER_OF(context, struct impl, this);
struct settings *settings = &context->settings;
struct pw_impl_node *n, *s, *target, *fallback;
+ const uint32_t *rates;
uint32_t max_quantum, min_quantum, def_quantum, lim_quantum, rate_quantum;
- uint32_t *rates, n_rates, def_rate;
- bool freewheel = false, global_force_rate, force_rate, force_quantum, global_force_quantum;
+ uint32_t n_rates, def_rate;
+ bool freewheel = false, global_force_rate, global_force_quantum;
struct spa_list collect;
pw_log_info("%p: busy:%d reason:%s", context, impl->recalc, reason);
@@ -1023,8 +1024,7 @@ again:
get_quantums(context, &def_quantum, &min_quantum, &max_quantum, &lim_quantum, &rate_quantum);
rates = get_rates(context, &def_rate, &n_rates, &global_force_rate);
- force_quantum = global_force_quantum = rate_quantum == 0;
- force_rate = global_force_rate;
+ global_force_quantum = rate_quantum == 0;
/* start from all drivers and group all nodes that are linked
* to it. Some nodes are not (yet) linked to anything and they
@@ -1121,10 +1121,25 @@ again:
struct spa_fraction rate = SPA_FRACTION(0, 0);
uint32_t quantum, target_rate, current_rate;
uint64_t quantum_stamp = 0, rate_stamp = 0;
+ bool force_rate, force_quantum;
+ const uint32_t *node_rates;
+ uint32_t node_n_rates, node_def_rate;
+ uint32_t node_max_quantum, node_min_quantum, node_def_quantum, node_rate_quantum;
if (!n->driving || n->exported)
continue;
+ node_def_quantum = def_quantum;
+ node_min_quantum = min_quantum;
+ node_max_quantum = max_quantum;
+ node_rate_quantum = rate_quantum;
+ force_quantum = global_force_quantum;
+
+ node_def_rate = def_rate;
+ node_n_rates = n_rates;
+ node_rates = rates;
+ force_rate = global_force_rate;
+
/* collect quantum and rate */
spa_list_for_each(s, &n->follower_list, follower_link) {
@@ -1138,17 +1153,17 @@ again:
}
if (!global_force_quantum && s->force_quantum > 0 &&
s->stamp > quantum_stamp) {
- def_quantum = min_quantum = max_quantum = s->force_quantum;
- rate_quantum = 0;
+ node_def_quantum = node_min_quantum = node_max_quantum = s->force_quantum;
+ node_rate_quantum = 0;
quantum_stamp = s->stamp;
force_quantum = true;
}
if (!global_force_rate && s->force_rate > 0 &&
s->stamp > rate_stamp) {
- def_rate = s->force_rate;
+ node_def_rate = s->force_rate;
+ node_n_rates = 1;
+ node_rates = &s->force_rate;
force_rate = true;
- n_rates = 1;
- rates = &s->force_rate;
rate_stamp = s->stamp;
}
@@ -1198,9 +1213,9 @@ again:
/* Here we are allowed to change the rate of the driver.
* Start with the default rate. If the desired rate is
* allowed, switch to it */
- target_rate = def_rate;
+ target_rate = node_def_rate;
if (rate.denom != 0 && rate.num == 1)
- target_rate = find_best_rate(rates, n_rates,
+ target_rate = find_best_rate(node_rates, node_n_rates,
rate.denom, target_rate);
}
@@ -1233,24 +1248,24 @@ again:
goto again;
}
- if (rate_quantum != 0 && current_rate != rate_quantum) {
+ if (node_rate_quantum != 0 && current_rate != node_rate_quantum) {
/* the quantum values are scaled with the current rate */
- def_quantum = def_quantum * current_rate / rate_quantum;
- min_quantum = min_quantum * current_rate / rate_quantum;
- max_quantum = max_quantum * current_rate / rate_quantum;
+ node_def_quantum = node_def_quantum * current_rate / node_rate_quantum;
+ node_min_quantum = node_min_quantum * current_rate / node_rate_quantum;
+ node_max_quantum = node_max_quantum * current_rate / node_rate_quantum;
}
/* calculate desired quantum */
if (max_latency.denom != 0) {
uint32_t tmp = (max_latency.num * current_rate / max_latency.denom);
- if (tmp < max_quantum)
- max_quantum = tmp;
+ if (tmp < node_max_quantum)
+ node_max_quantum = tmp;
}
- quantum = def_quantum;
+ quantum = node_def_quantum;
if (latency.denom != 0)
quantum = (latency.num * current_rate / latency.denom);
- quantum = SPA_CLAMP(quantum, min_quantum, max_quantum);
+ quantum = SPA_CLAMP(quantum, node_min_quantum, node_max_quantum);
quantum = SPA_MIN(quantum, lim_quantum);
if (settings->clock_power_of_two_quantum)
--
GitLab

View File

@ -1,64 +0,0 @@
From 07633f2146e2aa66fad8edb2b3e8495d813a0834 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Mon, 9 Jan 2023 11:06:37 +0100
Subject: [PATCH] context: rename a method
Rename suspend_driver -> reconfigure_driver because that is more like
what it does.
---
src/pipewire/context.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/pipewire/context.c b/src/pipewire/context.c
index 39f224a60..2301d34ad 100644
--- a/src/pipewire/context.c
+++ b/src/pipewire/context.c
@@ -933,7 +933,7 @@ static inline uint32_t *get_rates(struct pw_context *context, uint32_t *def, uin
return s->clock_rates;
}
}
-static void suspend_driver(struct pw_context *context, struct pw_impl_node *n)
+static void reconfigure_driver(struct pw_context *context, struct pw_impl_node *n)
{
struct pw_impl_node *s;
@@ -1199,7 +1199,7 @@ again:
}
if (target_rate != current_rate) {
- bool do_suspend = false;
+ bool do_reconfigure = false;
/* we doing a rate switch */
pw_log_info("(%s-%u) state:%s new rate:%u->%u",
n->name, n->info.id,
@@ -1209,13 +1209,13 @@ again:
if (force_rate) {
if (settings->clock_rate_update_mode == CLOCK_RATE_UPDATE_MODE_HARD)
- do_suspend = true;
+ do_reconfigure = true;
} else {
if (n->info.state >= PW_NODE_STATE_SUSPENDED)
- do_suspend = true;
+ do_reconfigure = true;
}
- if (do_suspend)
- suspend_driver(context, n);
+ if (do_reconfigure)
+ reconfigure_driver(context, n);
#
/* we're setting the pending rate. This will become the new
* current rate in the next iteration of the graph. */
n->current_rate = SPA_FRACTION(1, target_rate);
@@ -1223,7 +1223,7 @@ again:
n->current_pending = true;
current_rate = target_rate;
/* we might be suspended now and the links need to be prepared again */
- if (do_suspend)
+ if (do_reconfigure)
goto again;
}
--
GitLab

View File

@ -1,731 +0,0 @@
From 97aafe223493dc001161de44ed26dcf1533eb89d Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Tue, 10 Jan 2023 12:30:25 +0100
Subject: [PATCH] fix use_buffers checks
We can set 0 buffers even if there is no format.
Return -ENOSPC when too many buffers are set.
---
pipewire-jack/src/pipewire-jack.c | 2 +-
spa/plugins/alsa/alsa-pcm-sink.c | 14 ++++++++------
spa/plugins/alsa/alsa-pcm-source.c | 8 +++++---
spa/plugins/alsa/alsa-seq-bridge.c | 8 +++++---
spa/plugins/audioconvert/audioconvert.c | 7 +++++--
spa/plugins/audiomixer/audiomixer.c | 7 +++++--
spa/plugins/audiomixer/mixer-dsp.c | 7 +++++--
spa/plugins/audiotestsrc/audiotestsrc.c | 8 +++++---
spa/plugins/avb/avb-pcm-sink.c | 10 +++++-----
spa/plugins/avb/avb-pcm-source.c | 10 +++++-----
spa/plugins/bluez5/media-sink.c | 8 +++++---
spa/plugins/bluez5/media-source.c | 8 +++++---
spa/plugins/bluez5/sco-sink.c | 8 +++++---
spa/plugins/bluez5/sco-source.c | 8 +++++---
spa/plugins/control/mixer.c | 7 +++++--
spa/plugins/jack/jack-sink.c | 8 +++++---
spa/plugins/jack/jack-source.c | 8 +++++---
spa/plugins/libcamera/libcamera-source.cpp | 7 ++++---
spa/plugins/support/null-audio-sink.c | 8 +++++---
spa/plugins/test/fakesink.c | 8 +++++---
spa/plugins/test/fakesrc.c | 8 +++++---
spa/plugins/v4l2/v4l2-source.c | 7 ++++---
spa/plugins/videotestsrc/videotestsrc.c | 8 +++++---
spa/plugins/volume/volume.c | 8 +++++---
spa/plugins/vulkan/vulkan-compute-filter.c | 8 +++++---
spa/plugins/vulkan/vulkan-compute-source.c | 8 +++++---
src/examples/export-source.c | 6 +++++-
src/examples/local-v4l2.c | 6 +++++-
src/modules/module-client-node/client-node.c | 1 -
src/pipewire/filter.c | 9 ++++++---
src/pipewire/stream.c | 6 +++---
31 files changed, 146 insertions(+), 88 deletions(-)
diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c
index ab837f603..b8e84915d 100644
--- a/pipewire-jack/src/pipewire-jack.c
+++ b/pipewire-jack/src/pipewire-jack.c
@@ -2219,7 +2219,7 @@ static int client_node_port_use_buffers(void *data,
if (n_buffers > MAX_BUFFERS) {
pw_log_error("%p: too many buffers %u > %u", c, n_buffers, MAX_BUFFERS);
- return -EINVAL;
+ return -ENOSPC;
}
if (p->object->port.type_id == TYPE_ID_VIDEO && direction == SPA_DIRECTION_INPUT) {
diff --git a/spa/plugins/alsa/alsa-pcm-sink.c b/spa/plugins/alsa/alsa-pcm-sink.c
index 73c421eec..260550305 100644
--- a/spa/plugins/alsa/alsa-pcm-sink.c
+++ b/spa/plugins/alsa/alsa-pcm-sink.c
@@ -731,6 +731,7 @@ impl_node_port_use_buffers(void *object,
{
struct state *this = object;
uint32_t i;
+ int res;
spa_return_val_if_fail(this != NULL, -EINVAL);
@@ -738,14 +739,15 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "%p: use %d buffers", this, n_buffers);
- if (!this->have_format)
- return -EIO;
-
- if (n_buffers == 0) {
+ if (this->n_buffers > 0) {
spa_alsa_pause(this);
- clear_buffers(this);
- return 0;
+ if ((res = clear_buffers(this)) < 0)
+ return res;
}
+ if (n_buffers > 0 && !this->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &this->buffers[i];
diff --git a/spa/plugins/alsa/alsa-pcm-source.c b/spa/plugins/alsa/alsa-pcm-source.c
index 7f72d53ab..f079bf6f4 100644
--- a/spa/plugins/alsa/alsa-pcm-source.c
+++ b/spa/plugins/alsa/alsa-pcm-source.c
@@ -673,9 +673,6 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
- if (!this->have_format)
- return -EIO;
-
spa_log_debug(this->log, "%p: use %d buffers", this, n_buffers);
if (this->n_buffers > 0) {
@@ -683,6 +680,11 @@ impl_node_port_use_buffers(void *object,
if ((res = clear_buffers(this)) < 0)
return res;
}
+ if (n_buffers > 0 && !this->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &this->buffers[i];
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/alsa/alsa-seq-bridge.c b/spa/plugins/alsa/alsa-seq-bridge.c
index 4ec8e3c6e..ee50163c4 100644
--- a/spa/plugins/alsa/alsa-seq-bridge.c
+++ b/spa/plugins/alsa/alsa-seq-bridge.c
@@ -748,11 +748,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "%p: port %d.%d buffers:%d format:%d", this,
direction, port_id, n_buffers, port->have_format);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/audioconvert/audioconvert.c b/spa/plugins/audioconvert/audioconvert.c
index ccf4e30c5..578f70ff9 100644
--- a/spa/plugins/audioconvert/audioconvert.c
+++ b/spa/plugins/audioconvert/audioconvert.c
@@ -2049,13 +2049,16 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- spa_return_val_if_fail(port->have_format, -EIO);
-
spa_log_debug(this->log, "%p: use buffers %d on port %d:%d",
this, n_buffers, direction, port_id);
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
maxsize = this->quantum_limit * sizeof(float);
for (i = 0; i < n_buffers; i++) {
diff --git a/spa/plugins/audiomixer/audiomixer.c b/spa/plugins/audiomixer/audiomixer.c
index 41e7e3f7e..25da9780a 100644
--- a/spa/plugins/audiomixer/audiomixer.c
+++ b/spa/plugins/audiomixer/audiomixer.c
@@ -649,10 +649,13 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- spa_return_val_if_fail(port->have_format, -EIO);
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/audiomixer/mixer-dsp.c b/spa/plugins/audiomixer/mixer-dsp.c
index f93796b97..534cfabaf 100644
--- a/spa/plugins/audiomixer/mixer-dsp.c
+++ b/spa/plugins/audiomixer/mixer-dsp.c
@@ -586,10 +586,13 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- spa_return_val_if_fail(port->have_format, -EIO);
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/audiotestsrc/audiotestsrc.c b/spa/plugins/audiotestsrc/audiotestsrc.c
index c0c9c7a68..1501e1d55 100644
--- a/spa/plugins/audiotestsrc/audiotestsrc.c
+++ b/spa/plugins/audiotestsrc/audiotestsrc.c
@@ -829,11 +829,13 @@ impl_node_port_use_buffers(void *object,
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/avb/avb-pcm-sink.c b/spa/plugins/avb/avb-pcm-sink.c
index 00f4e9593..0a102480c 100644
--- a/spa/plugins/avb/avb-pcm-sink.c
+++ b/spa/plugins/avb/avb-pcm-sink.c
@@ -629,14 +629,14 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "%p: use %d buffers", this, n_buffers);
- if (!port->have_format)
- return -EIO;
-
- if (n_buffers == 0) {
+ if (port->n_buffers > 0) {
spa_avb_pause(this);
clear_buffers(this, port);
- return 0;
}
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
diff --git a/spa/plugins/avb/avb-pcm-source.c b/spa/plugins/avb/avb-pcm-source.c
index 5bf0a6e51..e7891a1a8 100644
--- a/spa/plugins/avb/avb-pcm-source.c
+++ b/spa/plugins/avb/avb-pcm-source.c
@@ -629,14 +629,14 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "%p: use %d buffers", this, n_buffers);
- if (!port->have_format)
- return -EIO;
-
- if (n_buffers == 0) {
+ if (port->n_buffers > 0) {
spa_avb_pause(this);
clear_buffers(this, port);
- return 0;
}
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
diff --git a/spa/plugins/bluez5/media-sink.c b/spa/plugins/bluez5/media-sink.c
index 4bf7310cf..cab508ffc 100644
--- a/spa/plugins/bluez5/media-sink.c
+++ b/spa/plugins/bluez5/media-sink.c
@@ -1453,11 +1453,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "use buffers %d", n_buffers);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
diff --git a/spa/plugins/bluez5/media-source.c b/spa/plugins/bluez5/media-source.c
index d260335ce..360f812bd 100644
--- a/spa/plugins/bluez5/media-source.c
+++ b/spa/plugins/bluez5/media-source.c
@@ -1202,11 +1202,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "use buffers %d", n_buffers);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/bluez5/sco-sink.c b/spa/plugins/bluez5/sco-sink.c
index 7025c78a9..18a34f64b 100644
--- a/spa/plugins/bluez5/sco-sink.c
+++ b/spa/plugins/bluez5/sco-sink.c
@@ -1186,11 +1186,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "use buffers %d", n_buffers);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
diff --git a/spa/plugins/bluez5/sco-source.c b/spa/plugins/bluez5/sco-source.c
index b4c40983a..6f5fe08fd 100644
--- a/spa/plugins/bluez5/sco-source.c
+++ b/spa/plugins/bluez5/sco-source.c
@@ -1155,11 +1155,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, "use buffers %d", n_buffers);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/control/mixer.c b/spa/plugins/control/mixer.c
index 1ef212b46..9d28bef3d 100644
--- a/spa/plugins/control/mixer.c
+++ b/spa/plugins/control/mixer.c
@@ -506,10 +506,13 @@ impl_node_port_use_buffers(void *object,
spa_log_debug(this->log, NAME " %p: use buffers %d on port %d:%d",
this, n_buffers, direction, port_id);
- spa_return_val_if_fail(port->have_format, -EIO);
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/jack/jack-sink.c b/spa/plugins/jack/jack-sink.c
index 50dec321b..e9ca5a8bc 100644
--- a/spa/plugins/jack/jack-sink.c
+++ b/spa/plugins/jack/jack-sink.c
@@ -693,11 +693,13 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
diff --git a/spa/plugins/jack/jack-source.c b/spa/plugins/jack/jack-source.c
index 7a82f0768..7004eed12 100644
--- a/spa/plugins/jack/jack-source.c
+++ b/spa/plugins/jack/jack-source.c
@@ -693,11 +693,13 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
diff --git a/spa/plugins/libcamera/libcamera-source.cpp b/spa/plugins/libcamera/libcamera-source.cpp
index 50954e5e3..26ef14874 100644
--- a/spa/plugins/libcamera/libcamera-source.cpp
+++ b/spa/plugins/libcamera/libcamera-source.cpp
@@ -774,14 +774,15 @@ static int impl_node_port_use_buffers(void *object,
port = GET_PORT(impl, direction, port_id);
- if (!port->current_format)
- return -EIO;
-
if (port->n_buffers) {
spa_libcamera_stream_off(impl);
if ((res = spa_libcamera_clear_buffers(impl, port)) < 0)
return res;
}
+ if (n_buffers > 0 && !port->current_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
if (buffers == NULL)
return 0;
diff --git a/spa/plugins/support/null-audio-sink.c b/spa/plugins/support/null-audio-sink.c
index c39c15afb..e5b9f04a7 100644
--- a/spa/plugins/support/null-audio-sink.c
+++ b/spa/plugins/support/null-audio-sink.c
@@ -685,11 +685,13 @@ impl_node_port_use_buffers(void *object,
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/test/fakesink.c b/spa/plugins/test/fakesink.c
index 3c42b2239..16bb012d0 100644
--- a/spa/plugins/test/fakesink.c
+++ b/spa/plugins/test/fakesink.c
@@ -585,11 +585,13 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/test/fakesrc.c b/spa/plugins/test/fakesrc.c
index d4965a98b..f41454323 100644
--- a/spa/plugins/test/fakesrc.c
+++ b/spa/plugins/test/fakesrc.c
@@ -597,11 +597,13 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c
index 3d967f255..cd859463c 100644
--- a/spa/plugins/v4l2/v4l2-source.c
+++ b/spa/plugins/v4l2/v4l2-source.c
@@ -756,14 +756,15 @@ static int impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- if (!port->have_format)
- return -EIO;
-
if (port->n_buffers) {
spa_v4l2_stream_off(this);
if ((res = spa_v4l2_clear_buffers(this)) < 0)
return res;
}
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
if (buffers == NULL)
return 0;
diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c
index af3bc9688..8d96b1b38 100644
--- a/spa/plugins/videotestsrc/videotestsrc.c
+++ b/spa/plugins/videotestsrc/videotestsrc.c
@@ -712,11 +712,13 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/volume/volume.c b/spa/plugins/volume/volume.c
index 08102a428..63237661e 100644
--- a/spa/plugins/volume/volume.c
+++ b/spa/plugins/volume/volume.c
@@ -528,11 +528,13 @@ impl_node_port_use_buffers(void *object,
port = GET_PORT(this, direction, port_id);
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
struct spa_data *d = buffers[i]->datas;
diff --git a/spa/plugins/vulkan/vulkan-compute-filter.c b/spa/plugins/vulkan/vulkan-compute-filter.c
index 66157075a..94efec3aa 100644
--- a/spa/plugins/vulkan/vulkan-compute-filter.c
+++ b/spa/plugins/vulkan/vulkan-compute-filter.c
@@ -505,11 +505,13 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = &this->port[direction];
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
diff --git a/spa/plugins/vulkan/vulkan-compute-source.c b/spa/plugins/vulkan/vulkan-compute-source.c
index dade5a5d3..4602e5d52 100644
--- a/spa/plugins/vulkan/vulkan-compute-source.c
+++ b/spa/plugins/vulkan/vulkan-compute-source.c
@@ -740,11 +740,13 @@ impl_node_port_use_buffers(void *object,
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = &this->port;
- if (!port->have_format)
- return -EIO;
-
clear_buffers(this, port);
+ if (n_buffers > 0 && !port->have_format)
+ return -EIO;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b;
diff --git a/src/examples/export-source.c b/src/examples/export-source.c
index 22dfa1426..eb8fdb5ac 100644
--- a/src/examples/export-source.c
+++ b/src/examples/export-source.c
@@ -46,6 +46,7 @@
#define M_PI_M2 ( M_PI + M_PI )
#define BUFFER_SAMPLES 128
+#define MAX_BUFFERS 32
struct buffer {
uint32_t id;
@@ -79,7 +80,7 @@ struct data {
struct spa_audio_info_raw format;
- struct buffer buffers[32];
+ struct buffer buffers[MAX_BUFFERS];
uint32_t n_buffers;
struct spa_list empty;
@@ -325,6 +326,9 @@ static int impl_port_use_buffers(void *object,
struct data *d = object;
uint32_t i;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &d->buffers[i];
struct spa_data *datas = buffers[i]->datas;
diff --git a/src/examples/local-v4l2.c b/src/examples/local-v4l2.c
index 5f7476727..1d70e9ec1 100644
--- a/src/examples/local-v4l2.c
+++ b/src/examples/local-v4l2.c
@@ -34,6 +34,7 @@
#define WIDTH 640
#define HEIGHT 480
#define BPP 3
+#define MAX_BUFFERS 32
#include "sdl.h"
@@ -68,7 +69,7 @@ struct data {
struct spa_video_info_raw format;
int32_t stride;
- struct spa_buffer *buffers[32];
+ struct spa_buffer *buffers[MAX_BUFFERS];
int n_buffers;
struct pw_proxy *out, *in, *link;
@@ -264,6 +265,9 @@ static int impl_port_use_buffers(void *object,
struct data *d = object;
uint32_t i;
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++)
d->buffers[i] = buffers[i];
d->n_buffers = n_buffers;
diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c
index 563585553..b1f58289f 100644
--- a/src/modules/module-client-node/client-node.c
+++ b/src/modules/module-client-node/client-node.c
@@ -754,7 +754,6 @@ do_port_use_buffers(struct impl *impl,
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
-
spa_log_debug(this->log, "%p: %s port %d.%d use buffers %p %u flags:%08x", this,
direction == SPA_DIRECTION_INPUT ? "input" : "output",
port_id, mix_id, buffers, n_buffers, flags);
diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c
index 4af39fbbe..cc18606b9 100644
--- a/src/pipewire/filter.c
+++ b/src/pipewire/filter.c
@@ -885,16 +885,19 @@ static int impl_port_use_buffers(void *object,
pw_log_debug("%p: port:%d.%d buffers:%u disconnecting:%d", impl,
direction, port_id, n_buffers, impl->disconnecting);
+ if ((port = get_port(impl, direction, port_id)) == NULL)
+ return -EINVAL;
+
if (impl->disconnecting && n_buffers > 0)
return -EIO;
- if ((port = get_port(impl, direction, port_id)) == NULL)
- return -EINVAL;
+ clear_buffers(port);
impl_flags = port->flags;
prot = PROT_READ | (direction == SPA_DIRECTION_OUTPUT ? PROT_WRITE : 0);
- clear_buffers(port);
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
int buf_size = 0;
diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c
index a7c1da187..3b0d8adb4 100644
--- a/src/pipewire/stream.c
+++ b/src/pipewire/stream.c
@@ -922,13 +922,13 @@ static int impl_port_use_buffers(void *object,
if (impl->disconnecting && n_buffers > 0)
return -EIO;
- if (n_buffers > MAX_BUFFERS)
- return -EINVAL;
-
prot = PROT_READ | (direction == SPA_DIRECTION_OUTPUT ? PROT_WRITE : 0);
clear_buffers(stream);
+ if (n_buffers > MAX_BUFFERS)
+ return -ENOSPC;
+
for (i = 0; i < n_buffers; i++) {
int buf_size = 0;
struct buffer *b = &impl->buffers[i];
--
GitLab

View File

@ -1,99 +0,0 @@
From 26496724c656b466414f6f40fd52269dc19077d8 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Thu, 5 Jan 2023 13:54:38 +0100
Subject: [PATCH] impl-node: move 2 state variables to private
So that they can be used when making scheduler decisions.
---
src/pipewire/impl-node.c | 21 ++++++++++-----------
src/pipewire/private.h | 2 ++
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c
index dd20620a9..015a3096c 100644
--- a/src/pipewire/impl-node.c
+++ b/src/pipewire/impl-node.c
@@ -59,8 +59,6 @@ struct impl {
struct spa_list param_list;
struct spa_list pending_list;
- unsigned int pause_on_idle:1;
- unsigned int suspend_on_idle:1;
unsigned int cache_params:1;
unsigned int pending_play:1;
};
@@ -221,12 +219,12 @@ static int idle_node(struct pw_impl_node *this)
pw_log_debug("%p: idle node state:%s pending:%s pause-on-idle:%d", this,
pw_node_state_as_string(this->info.state),
pw_node_state_as_string(impl->pending_state),
- impl->pause_on_idle);
+ this->pause_on_idle);
if (impl->pending_state <= PW_NODE_STATE_IDLE)
return 0;
- if (!impl->pause_on_idle)
+ if (!this->pause_on_idle)
return 0;
node_deactivate(this);
@@ -385,7 +383,7 @@ static void node_update_state(struct pw_impl_node *node, enum pw_node_state stat
case PW_NODE_STATE_IDLE:
case PW_NODE_STATE_SUSPENDED:
case PW_NODE_STATE_ERROR:
- if (state != PW_NODE_STATE_IDLE || impl->pause_on_idle)
+ if (state != PW_NODE_STATE_IDLE || node->pause_on_idle)
pw_loop_invoke(node->data_loop, do_node_remove, 1, NULL, 0, true, node);
break;
default:
@@ -422,8 +420,9 @@ static void node_update_state(struct pw_impl_node *node, enum pw_node_state stat
}
if (old == PW_NODE_STATE_RUNNING &&
state == PW_NODE_STATE_IDLE &&
- impl->suspend_on_idle)
- pw_impl_node_set_state(node, PW_NODE_STATE_SUSPENDED);
+ node->suspend_on_idle) {
+ pw_impl_node_set_state(node, PW_NODE_STATE_SUSPENDED);
+ }
}
static int suspend_node(struct pw_impl_node *this)
@@ -917,10 +916,10 @@ static void check_properties(struct pw_impl_node *node)
pw_log_debug("%p: name '%s'", node, node->name);
}
- impl->pause_on_idle = pw_properties_get_bool(node->properties, PW_KEY_NODE_PAUSE_ON_IDLE, true);
- impl->suspend_on_idle = pw_properties_get_bool(node->properties, PW_KEY_NODE_SUSPEND_ON_IDLE, false);
- impl->cache_params = pw_properties_get_bool(node->properties, PW_KEY_NODE_CACHE_PARAMS, true);
+ node->pause_on_idle = pw_properties_get_bool(node->properties, PW_KEY_NODE_PAUSE_ON_IDLE, true);
+ node->suspend_on_idle = pw_properties_get_bool(node->properties, PW_KEY_NODE_SUSPEND_ON_IDLE, false);
node->transport_sync = pw_properties_get_bool(node->properties, PW_KEY_NODE_TRANSPORT_SYNC, false);
+ impl->cache_params = pw_properties_get_bool(node->properties, PW_KEY_NODE_CACHE_PARAMS, true);
driver = pw_properties_get_bool(node->properties, PW_KEY_NODE_DRIVER, false);
if (node->driver != driver) {
@@ -2215,7 +2214,7 @@ int pw_impl_node_set_state(struct pw_impl_node *node, enum pw_node_state state)
pw_node_state_as_string(old),
pw_node_state_as_string(state),
node->active,
- impl->pause_on_idle);
+ node->pause_on_idle);
if (old != state)
pw_impl_node_emit_state_request(node, state);
diff --git a/src/pipewire/private.h b/src/pipewire/private.h
index 659f4ab8f..8abd68502 100644
--- a/src/pipewire/private.h
+++ b/src/pipewire/private.h
@@ -719,6 +719,8 @@ struct pw_impl_node {
unsigned int current_pending:1; /**< a quantum/rate update is pending */
unsigned int moved:1; /**< the node was moved drivers */
unsigned int added:1; /**< the node was add to graph */
+ unsigned int pause_on_idle:1; /**< Pause processing when IDLE */
+ unsigned int suspend_on_idle:1;
uint32_t port_user_data_size; /**< extra size for port user data */
--
GitLab

View File

@ -1,27 +0,0 @@
From 0ddf80d470449a3aea04111cd7d1b4a2b9b2f8df Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Thu, 5 Jan 2023 13:49:52 +0100
Subject: [PATCH] midifile: error won invalid track size
When the track data would exceed the file size, return an error.
---
src/tools/midifile.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/tools/midifile.c b/src/tools/midifile.c
index fbd19ce4a..5276ade73 100644
--- a/src/tools/midifile.c
+++ b/src/tools/midifile.c
@@ -118,6 +118,9 @@ static int read_mtrk(struct midi_file *mf, struct midi_track *track)
track->size = parse_be32(mf->p + 4);
mf->p = track->data + track->size;
+ if (mf->p > mf->data + mf->size)
+ return -EINVAL;
+
return 0;
}
--
GitLab

View File

@ -1,45 +0,0 @@
From 6d58c739371ab6d699871b9864db5f23d987d27e Mon Sep 17 00:00:00 2001
From: Jan Beich <jbeich@FreeBSD.org>
Date: Sun, 8 Jan 2023 02:06:35 +0000
Subject: [PATCH] module-rt: fix warning when xdg-desktop-portal isn't running
$ pipewire
...
[W][1234.001] mod.rt | [ module-rt.c: 278 pw_rtkit_check_xdg_portal()] Can't find xdg-portal: (null)
...
---
src/modules/module-rt.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/src/modules/module-rt.c b/src/modules/module-rt.c
index 5cfd766e4..6f3dbecd5 100644
--- a/src/modules/module-rt.c
+++ b/src/modules/module-rt.c
@@ -269,20 +269,12 @@ struct pw_rtkit_bus *pw_rtkit_bus_get_session(void)
bool pw_rtkit_check_xdg_portal(struct pw_rtkit_bus *system_bus)
{
- DBusError error;
- bool ret = true;
-
- dbus_error_init(&error);
-
- if (!dbus_bus_name_has_owner(system_bus->bus, XDG_PORTAL_SERVICE_NAME, &error)) {
- pw_log_warn("Can't find xdg-portal: %s", error.name);
- ret = false;
- goto finish;
+ if (!dbus_bus_name_has_owner(system_bus->bus, XDG_PORTAL_SERVICE_NAME, NULL)) {
+ pw_log_warn("Can't find %s. Is xdg-desktop-portal running?", XDG_PORTAL_SERVICE_NAME);
+ return false;
}
-finish:
- dbus_error_free(&error);
- return ret;
+ return true;
}
void pw_rtkit_bus_free(struct pw_rtkit_bus *system_bus)
--
GitLab

View File

@ -1,43 +0,0 @@
From 860b8fc27ffbfd0a095e3fa4b0cd125d536283d3 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Thu, 29 Dec 2022 12:22:56 +0100
Subject: [PATCH] modules: fix rate update
Setting the rate with the PROP_rate would actually result in a rate
adjustment of 1.0f / rate, so do the same here.
See #2891
---
src/modules/module-pulse-tunnel.c | 2 +-
src/modules/module-rtp-source.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/modules/module-pulse-tunnel.c b/src/modules/module-pulse-tunnel.c
index 916400d22..be89a51b3 100644
--- a/src/modules/module-pulse-tunnel.c
+++ b/src/modules/module-pulse-tunnel.c
@@ -270,7 +270,7 @@ static void update_rate(struct impl *impl, bool playback)
impl->current_latency, impl->target_latency);
SPA_FLAG_SET(impl->rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE);
- impl->rate_match->rate = corr;
+ impl->rate_match->rate = 1.0f / corr;
}
static void playback_stream_process(void *d)
diff --git a/src/modules/module-rtp-source.c b/src/modules/module-rtp-source.c
index bc25cdc3d..6d1443e6c 100644
--- a/src/modules/module-rtp-source.c
+++ b/src/modules/module-rtp-source.c
@@ -272,7 +272,7 @@ static void stream_process(void *data)
if (sess->rate_match) {
SPA_FLAG_SET(sess->rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE);
- sess->rate_match->rate = corr;
+ sess->rate_match->rate = 1.0f / corr;
}
}
spa_ringbuffer_read_data(&sess->ring,
--
GitLab

View File

@ -1,39 +0,0 @@
From f7c49bbdde5f9f09270ac391990264a501761420 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Thu, 15 Dec 2022 13:12:47 +0100
Subject: [PATCH] pulse-server: add channel-map in echo-cancel module
---
.../module-protocol-pulse/modules/module-echo-cancel.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
index 47dfa75bb..72e0095b5 100644
--- a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
+++ b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
@@ -70,6 +70,7 @@ static int module_echo_cancel_load(struct module *module)
const char *str;
char *args;
size_t size;
+ uint32_t i;
if ((f = open_memstream(&args, &size)) == NULL)
return -errno;
@@ -85,7 +86,13 @@ static int module_echo_cancel_load(struct module *module)
fprintf(f, " audio.rate = %u", data->info.rate);
if (data->info.channels != 0) {
fprintf(f, " audio.channels = %u", data->info.channels);
- /* TODO: convert channel positions to string */
+ if (!(data->info.flags & SPA_AUDIO_FLAG_UNPOSITIONED)) {
+ fprintf(f, " audio.position = [ ");
+ for (i = 0; i < data->info.channels; i++)
+ fprintf(f, "%s%s", i == 0 ? "" : ",",
+ channel_id2name(data->info.position[i]));
+ fprintf(f, " ]");
+ }
}
fprintf(f, " source.props = {");
pw_properties_serialize_dict(f, &data->source_props->dict, 0);
--
2.39.0

View File

@ -1,34 +0,0 @@
From 624e265fd6e5027e11027822eb943c533feab85f Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Tue, 10 Jan 2023 12:49:22 +0100
Subject: [PATCH] pulse-server: clear the drained state correctly
When we start the drain, we unpause the stream. When we conplete the
drain, we unpause again, which does nothing when the stream was already
unpaused. However, this leaves the drained state on the stream and so
the stream will never be able to play new data.
Trigger a new pw_stream_set_active() with the current stream state to
clear the drained state.
Fixes #2928
---
src/modules/module-protocol-pulse/pulse-server.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c
index 97405e039..97d247d26 100644
--- a/src/modules/module-protocol-pulse/pulse-server.c
+++ b/src/modules/module-protocol-pulse/pulse-server.c
@@ -1541,7 +1541,7 @@ static void stream_drained(void *data)
reply_simple_ack(stream->client, stream->drain_tag);
stream->drain_tag = 0;
- stream_set_paused(stream, false, "complete drain");
+ pw_stream_set_active(stream->stream, !stream->is_paused);
}
}
--
GitLab

View File

@ -1,89 +0,0 @@
From ba374a7b47b690d819e9fc60d2e3b5a2533e52f8 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
Date: Mon, 9 Jan 2023 11:42:49 +0100
Subject: [PATCH] impl-node: restore running state after reconfigure
Add a reconfigure state on the node that is set when the node was IDLE
or RUNNING when reconfigured.
The node state will be set to the running state as long as the
reconfigure state is active. When the node is running, the reconfigure
state is unset again and the node is allowed to IDLE as usual.
This fixes the case where an IDLE (but not paused node) will be
suspended when a rate change happens but will then not resume
afterwards.
This causes problems with rate changes and nodes that have the suspend
disabled by the session manager. They will be suspened anyway and this
can cause problems for devices that need to keep running to keep the
amplifiers active.
Fixes #2929
---
src/pipewire/context.c | 8 +++++++-
src/pipewire/impl-node.c | 8 ++++++++
src/pipewire/private.h | 1 +
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/pipewire/context.c b/src/pipewire/context.c
index 2301d34ad..ab798c20e 100644
--- a/src/pipewire/context.c
+++ b/src/pipewire/context.c
@@ -946,6 +946,9 @@ static void reconfigure_driver(struct pw_context *context, struct pw_impl_node *
}
pw_log_debug("%p: driver %p: '%s' suspend",
context, n, n->name);
+
+ if (n->info.state >= PW_NODE_STATE_IDLE)
+ n->reconfigure = true;
pw_impl_node_set_state(n, PW_NODE_STATE_SUSPENDED);
}
@@ -1180,8 +1183,11 @@ again:
if (force_rate)
lock_rate = false;
+ if (n->reconfigure)
+ running = true;
+
current_rate = n->current_rate.denom;
- if (lock_rate ||
+ if (lock_rate || n->reconfigure ||
(!force_rate &&
(n->info.state > PW_NODE_STATE_IDLE)))
/* when someone wants us to lock the rate of this driver or
diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c
index 015a3096c..6200e8002 100644
--- a/src/pipewire/impl-node.c
+++ b/src/pipewire/impl-node.c
@@ -418,6 +418,14 @@ static void node_update_state(struct pw_impl_node *node, enum pw_node_state stat
spa_list_for_each(resource, &node->global->resource_list, link)
pw_resource_error(resource, res, error);
}
+ if (node->reconfigure) {
+ if (state == PW_NODE_STATE_SUSPENDED &&
+ node->pause_on_idle) {
+ node->reconfigure = false;
+ }
+ if (state == PW_NODE_STATE_RUNNING)
+ node->reconfigure = false;
+ }
if (old == PW_NODE_STATE_RUNNING &&
state == PW_NODE_STATE_IDLE &&
node->suspend_on_idle) {
diff --git a/src/pipewire/private.h b/src/pipewire/private.h
index 8abd68502..92d004508 100644
--- a/src/pipewire/private.h
+++ b/src/pipewire/private.h
@@ -721,6 +721,7 @@ struct pw_impl_node {
unsigned int added:1; /**< the node was add to graph */
unsigned int pause_on_idle:1; /**< Pause processing when IDLE */
unsigned int suspend_on_idle:1;
+ unsigned int reconfigure:1;
uint32_t port_user_data_size; /**< extra size for port user data */
--
GitLab

View File

@ -1,26 +0,0 @@
From c7b3ef0d9ff16a1e69a299870860bebcb628e298 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pav@iki.fi>
Date: Wed, 21 Dec 2022 12:54:52 +0200
Subject: [PATCH] bluez5: backend-native: fix missing brace in CIND reply
It should look like ...,("battchg,(0-5)) not ...,"battchg",(0-5))
---
spa/plugins/bluez5/backend-native.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c
index eed23f66e..ab543a621 100644
--- a/spa/plugins/bluez5/backend-native.c
+++ b/spa/plugins/bluez5/backend-native.c
@@ -74,7 +74,7 @@ enum {
HFP_AG_INITIAL_CODEC_SETUP_WAIT
};
-#define CIND_INDICATORS "(\"service\",(0-1)),(\"call\",(0-1)),(\"callsetup\",(0-3)),(\"callheld\",(0-2)),(\"signal\",(0-5)),(\"roam\",(0-1)),\"battchg\",(0-5))"
+#define CIND_INDICATORS "(\"service\",(0-1)),(\"call\",(0-1)),(\"callsetup\",(0-3)),(\"callheld\",(0-2)),(\"signal\",(0-5)),(\"roam\",(0-1)),(\"battchg\",(0-5))"
enum {
CIND_SERVICE = 1,
CIND_CALL,
--
2.39.0