From 38407cb16a75f21a790ef478ed1855f245eb2e04abbe67a470dda5632f1be8b6 Mon Sep 17 00:00:00 2001 From: Antonio Larrosa Date: Fri, 13 Jan 2023 11:06:50 +0000 Subject: [PATCH] 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 --- 0001-alsa-dont-set--1-as-node.target.patch | 29 - 0001-alsa-fix-memory-leak-of-properties.patch | 24 - ...p-per-node-quantum-and-rate-settings.patch | 156 ---- 0001-context-rename-a-method.patch | 64 -- 0001-fix-use_buffers-checks.patch | 731 ------------------ ...de-move-2-state-variables-to-private.patch | 99 --- ...idifile-error-won-invalid-track-size.patch | 27 - ...when-xdg-desktop-portal-isnt-running.patch | 45 -- 0001-modules-fix-rate-update.patch | 43 -- ...dd-channel-map-in-echo-cancel-module.patch | 39 - ...er-clear-the-drained-state-correctly.patch | 34 - ...tore-running-state-after-reconfigure.patch | 89 --- ...tive-fix-missing-brace-in-CIND-reply.patch | 26 - 13 files changed, 1406 deletions(-) delete mode 100644 0001-alsa-dont-set--1-as-node.target.patch delete mode 100644 0001-alsa-fix-memory-leak-of-properties.patch delete mode 100644 0001-context-keep-per-node-quantum-and-rate-settings.patch delete mode 100644 0001-context-rename-a-method.patch delete mode 100644 0001-fix-use_buffers-checks.patch delete mode 100644 0001-impl-node-move-2-state-variables-to-private.patch delete mode 100644 0001-midifile-error-won-invalid-track-size.patch delete mode 100644 0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch delete mode 100644 0001-modules-fix-rate-update.patch delete mode 100644 0001-pulse-server-add-channel-map-in-echo-cancel-module.patch delete mode 100644 0001-pulse-server-clear-the-drained-state-correctly.patch delete mode 100644 0002-impl-node-restore-running-state-after-reconfigure.patch delete mode 100644 0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch diff --git a/0001-alsa-dont-set--1-as-node.target.patch b/0001-alsa-dont-set--1-as-node.target.patch deleted file mode 100644 index 739fee9..0000000 --- a/0001-alsa-dont-set--1-as-node.target.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 89ac6b353521fb9a6d6eb6bb74724c4fa968f75c Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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); - diff --git a/0001-alsa-fix-memory-leak-of-properties.patch b/0001-alsa-fix-memory-leak-of-properties.patch deleted file mode 100644 index d0d7b9c..0000000 --- a/0001-alsa-fix-memory-leak-of-properties.patch +++ /dev/null @@ -1,24 +0,0 @@ -From ed463248721cc03c826f80dac9667b238c844e03 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= -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 - diff --git a/0001-context-keep-per-node-quantum-and-rate-settings.patch b/0001-context-keep-per-node-quantum-and-rate-settings.patch deleted file mode 100644 index 97940cb..0000000 --- a/0001-context-keep-per-node-quantum-and-rate-settings.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 9f3237b74edc3df467cca50af7c09f1e3c89abea Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-context-rename-a-method.patch b/0001-context-rename-a-method.patch deleted file mode 100644 index 524d667..0000000 --- a/0001-context-rename-a-method.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 07633f2146e2aa66fad8edb2b3e8495d813a0834 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-fix-use_buffers-checks.patch b/0001-fix-use_buffers-checks.patch deleted file mode 100644 index 6b998ad..0000000 --- a/0001-fix-use_buffers-checks.patch +++ /dev/null @@ -1,731 +0,0 @@ -From 97aafe223493dc001161de44ed26dcf1533eb89d Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-impl-node-move-2-state-variables-to-private.patch b/0001-impl-node-move-2-state-variables-to-private.patch deleted file mode 100644 index 4219fad..0000000 --- a/0001-impl-node-move-2-state-variables-to-private.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 26496724c656b466414f6f40fd52269dc19077d8 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-midifile-error-won-invalid-track-size.patch b/0001-midifile-error-won-invalid-track-size.patch deleted file mode 100644 index f661aac..0000000 --- a/0001-midifile-error-won-invalid-track-size.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0ddf80d470449a3aea04111cd7d1b4a2b9b2f8df Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch b/0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch deleted file mode 100644 index 2fa5535..0000000 --- a/0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 6d58c739371ab6d699871b9864db5f23d987d27e Mon Sep 17 00:00:00 2001 -From: Jan Beich -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 - diff --git a/0001-modules-fix-rate-update.patch b/0001-modules-fix-rate-update.patch deleted file mode 100644 index 129fd51..0000000 --- a/0001-modules-fix-rate-update.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 860b8fc27ffbfd0a095e3fa4b0cd125d536283d3 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-pulse-server-add-channel-map-in-echo-cancel-module.patch b/0001-pulse-server-add-channel-map-in-echo-cancel-module.patch deleted file mode 100644 index 00a9828..0000000 --- a/0001-pulse-server-add-channel-map-in-echo-cancel-module.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f7c49bbdde5f9f09270ac391990264a501761420 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0001-pulse-server-clear-the-drained-state-correctly.patch b/0001-pulse-server-clear-the-drained-state-correctly.patch deleted file mode 100644 index 8c427ae..0000000 --- a/0001-pulse-server-clear-the-drained-state-correctly.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 624e265fd6e5027e11027822eb943c533feab85f Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0002-impl-node-restore-running-state-after-reconfigure.patch b/0002-impl-node-restore-running-state-after-reconfigure.patch deleted file mode 100644 index c8fe96d..0000000 --- a/0002-impl-node-restore-running-state-after-reconfigure.patch +++ /dev/null @@ -1,89 +0,0 @@ -From ba374a7b47b690d819e9fc60d2e3b5a2533e52f8 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -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 - diff --git a/0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch b/0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch deleted file mode 100644 index 9f605d4..0000000 --- a/0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch +++ /dev/null @@ -1,26 +0,0 @@ -From c7b3ef0d9ff16a1e69a299870860bebcb628e298 Mon Sep 17 00:00:00 2001 -From: Pauli Virtanen -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 -