Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pipewire for openSUSE:Factory checked in at 2026-05-28 17:24:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pipewire (Old) and /work/SRC/openSUSE:Factory/.pipewire.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pipewire" Thu May 28 17:24:01 2026 rev:156 rq:1355396 version:1.6.6 Changes: -------- --- /work/SRC/openSUSE:Factory/pipewire/pipewire.changes 2026-05-16 19:25:27.108312773 +0200 +++ /work/SRC/openSUSE:Factory/.pipewire.new.1937/pipewire.changes 2026-05-28 17:24:41.554139319 +0200 @@ -1,0 +2,39 @@ +Tue May 26 16:34:26 UTC 2026 - Antonio Larrosa <[email protected]> + +- Update to version 1.6.6 + * This is a bugfix release that is API and ABI compatible with + the previous 1.6.x releases. + * Highlights + - Fix a bug in the server code that could leave snap clients + without sound. (#5270 (closed)) + - Relax LADSPA path loading again, absolute paths are only + blocked in unsafe cases. + - Fix a volume restore issue in filter-graph when using custom + volume controls. + - Small fixes and improvements. + * PipeWire + - Fix the meta permission check on metadata. + - Make sure we don't accept too many fds. + - Fix potential race with buffer allocation and Suspend. + (#3547) + * SPA + - Relax LADSPA path loading. Absolute paths are allowed when + loading modules from a config file. They are now only blocked + when loading the pulse ladspa modules and filter-chains in + nodes because those can load ladspa plugins in other + processes. (#5222 (closed)) + - Fix a regression in the dither noise that was silent when no + input was available. (#5260 (closed)) + - Fix volume initialization in filter-graph. (#5192 (closed)) + * Pulse-server + - Fix a bug in the server code that could leave snap clients + without sound. (#5270 (closed)) + - Be more careful with the stream suspend messages and only + send them when the stream is monitoring. (#5273 (closed)) + - Fix monitor mode in pavucontrol. + * Tools + - Fix midifile SysEx writing in pw-cat and ensure the header + is written correctly on close. + - Make sure pw-cat does not try to convert Midi to UMP. + +------------------------------------------------------------------- Old: ---- pipewire-1.6.5.tar.xz New: ---- pipewire-1.6.6.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pipewire.spec ++++++ --- /var/tmp/diff_new_pack.JGLJ2z/_old 2026-05-28 17:24:43.158205717 +0200 +++ /var/tmp/diff_new_pack.JGLJ2z/_new 2026-05-28 17:24:43.158205717 +0200 @@ -71,7 +71,7 @@ %bcond_with aptx Name: pipewire -Version: 1.6.5 +Version: 1.6.6 Release: 0 Summary: A Multimedia Framework designed to be an audio and video server and more License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.JGLJ2z/_old 2026-05-28 17:24:43.198207372 +0200 +++ /var/tmp/diff_new_pack.JGLJ2z/_new 2026-05-28 17:24:43.202207538 +0200 @@ -3,7 +3,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://gitlab.freedesktop.org/pipewire/pipewire.git</param> - <param name="revision">1.6.5</param> + <param name="revision">1.6.6</param> <param name="versionformat">@PARENT_TAG@</param> <!-- <param name="revision">636cbae9b6cebc4ba55903e2a686f4c4a2bd4193</param> ++++++ pipewire-1.6.5.tar.xz -> pipewire-1.6.6.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/NEWS new/pipewire-1.6.6/NEWS --- old/pipewire-1.6.5/NEWS 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/NEWS 2026-05-26 10:09:28.000000000 +0200 @@ -1,3 +1,46 @@ +# PipeWire 1.6.6 (2026-05-26) + +This is a bugfix release that is API and ABI compatible with the previous +1.6.x releases. + +## Highlights + - Fix a bug in the server code that could leave snap clients without + sound. (#5270) + - Relax LADSPA path loading again, absolute paths are only blocked in + unsafe cases. + - Fix a volume restore issue in filter-graph when using custom volume + controls. + - Small fixes and improvements. + + +## PipeWire + - Fix the meta permission check on metadata. + - Make sure we don't accept too many fds. + - Fix potential race with buffer allocation and Suspend. (#3547) + +## SPA + - Relax LADSPA path loading. Absolute paths are allowed when loading + modules from a config file. They are now only blocked when loading + the pulse ladspa modules and filter-chains in nodes because those + can load ladspa plugins in other processes. (#5222) + - Fix a regression in the dither noise that was silent when no input + was available. (#5260) + - Fix volume initialization in filter-graph. (#5192) + +## Pulse-server + - Fix a bug in the server code that could leave snap clients without + sound. (#5270) + - Be more careful with the stream suspend messages and only send them + when the stream is monitoring. (#5273) + - Fix monitor mode in pavucontrol. + +## Tools + - Fix midifile SysEx writing in pw-cat and ensure the header is written + correctly on close. + - Make sure pw-cat does not try to convert Midi to UMP. + +Older versions: + # PipeWire 1.6.5 (2026-05-13) This is a bugfix release that is API and ABI compatible with the previous @@ -30,9 +73,6 @@ ## Pulse-server - A whole bunch of extra security checks and hardening fixes. - -Older versions: - # PipeWire 1.6.4 (2026-04-22) This is a bugfix release that is API and ABI compatible with the previous diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/meson.build new/pipewire-1.6.6/meson.build --- old/pipewire-1.6.5/meson.build 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/meson.build 2026-05-26 10:09:28.000000000 +0200 @@ -1,5 +1,5 @@ project('pipewire', ['c' ], - version : '1.6.5', + version : '1.6.6', license : [ 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ], meson_version : '>= 0.61.1', default_options : [ 'warning_level=3', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/spa/plugins/audioconvert/audioconvert.c new/pipewire-1.6.6/spa/plugins/audioconvert/audioconvert.c --- old/pipewire-1.6.5/spa/plugins/audioconvert/audioconvert.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/spa/plugins/audioconvert/audioconvert.c 2026-05-26 10:09:28.000000000 +0200 @@ -1417,6 +1417,7 @@ &SPA_DICT_ITEMS( SPA_DICT_ITEM(SPA_KEY_LIBRARY_NAME, "filter-graph/libspa-filter-graph"), SPA_DICT_ITEM("clock.quantum-limit", qlimit), + SPA_DICT_ITEM("library.filter-path", "true"), SPA_DICT_ITEM("filter.graph", graph))); if (new_handle == NULL) goto error; @@ -2113,8 +2114,8 @@ if ((res = convert_init(&in->conv)) < 0) return res; - spa_log_debug(this->log, "%p: got converter features %08x:%08x passthrough:%d remap:%d %s", this, - this->cpu_flags, in->conv.cpu_flags, in->conv.is_passthrough, + spa_log_debug(this->log, "%p: got converter features %08x:%08x flags:%08x remap:%d %s", this, + this->cpu_flags, in->conv.cpu_flags, in->conv.flags, remap, in->conv.func_name); return 0; @@ -2410,9 +2411,9 @@ return res; spa_log_debug(this->log, "%p: got converter features %08x:%08x quant:%d:%d" - " passthrough:%d remap:%d %s", this, + " flags:%08x remap:%d %s", this, this->cpu_flags, out->conv.cpu_flags, out->conv.method, - out->conv.noise_bits, out->conv.is_passthrough, remap, out->conv.func_name); + out->conv.noise_bits, out->conv.flags, remap, out->conv.func_name); return 0; } @@ -3571,7 +3572,7 @@ } else { dst = c->datas[s->out_idx]; } - if (c->empty && dir->conv.clear) + if (c->empty && dir->conv.clear && convert_is_clear_on_empty(&dir->conv)) convert_clear(&dir->conv, dst, c->n_samples); else convert_process(&dir->conv, dst, (const void**)c->datas[s->in_idx], c->n_samples); @@ -3685,7 +3686,7 @@ struct dir *dir = &impl->dir[SPA_DIRECTION_OUTPUT]; void *remap_datas[MAX_PORTS], **src; - spa_log_trace_fp(impl->log, "%p: output convert %d", impl, c->n_samples); + spa_log_trace_fp(impl->log, "%p: output convert %d %d", impl, c->n_samples, c->empty); if (dir->need_remap) { uint32_t i; for (i = 0; i < dir->conv.n_channels; i++) { @@ -3696,7 +3697,7 @@ } else { src = c->datas[s->in_idx]; } - if (c->empty && dir->conv.clear) + if (c->empty && dir->conv.clear && convert_is_clear_on_empty(&dir->conv)) convert_clear(&dir->conv, c->datas[s->out_idx], c->n_samples); else convert_process(&dir->conv, c->datas[s->out_idx], (const void **)src, c->n_samples); @@ -3733,11 +3734,11 @@ /* set bits for things we need to do */ dir = &this->dir[SPA_DIRECTION_INPUT]; - SPA_FLAG_UPDATE(ctx->bits, SRC_CONVERT_BIT, !dir->conv.is_passthrough); + SPA_FLAG_UPDATE(ctx->bits, SRC_CONVERT_BIT, !convert_is_passthrough(&dir->conv)); in_need_remap = dir->need_remap; dir = &this->dir[SPA_DIRECTION_OUTPUT]; - SPA_FLAG_UPDATE(ctx->bits, DST_CONVERT_BIT, !dir->conv.is_passthrough); + SPA_FLAG_UPDATE(ctx->bits, DST_CONVERT_BIT, !convert_is_passthrough(&dir->conv)); out_need_remap = dir->need_remap; this->resample_passthrough = resample_is_passthrough(this); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/spa/plugins/audioconvert/fmt-ops.c new/pipewire-1.6.6/spa/plugins/audioconvert/fmt-ops.c --- old/pipewire-1.6.5/spa/plugins/audioconvert/fmt-ops.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/spa/plugins/audioconvert/fmt-ops.c 2026-05-26 10:09:28.000000000 +0200 @@ -630,7 +630,8 @@ for (i = 0; i < RANDOM_SIZE; i++) conv->random[i] = random(); - conv->is_passthrough = conv->src_fmt == conv->dst_fmt; + SPA_FLAG_UPDATE(conv->flags, CONVERT_FLAG_CLEAR_ON_EMPTY, conv->noise_bits == 0); + SPA_FLAG_UPDATE(conv->flags, CONVERT_FLAG_PASSTHROUGH, conv->src_fmt == conv->dst_fmt); conv->cpu_flags = info->cpu_flags; conv->update_noise = ninfo->noise; conv->process = info->process; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/spa/plugins/audioconvert/fmt-ops.h new/pipewire-1.6.6/spa/plugins/audioconvert/fmt-ops.h --- old/pipewire-1.6.5/spa/plugins/audioconvert/fmt-ops.h 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/spa/plugins/audioconvert/fmt-ops.h 2026-05-26 10:09:28.000000000 +0200 @@ -221,7 +221,9 @@ uint32_t cpu_flags; const char *func_name; - unsigned int is_passthrough:1; +#define CONVERT_FLAG_PASSTHROUGH (1u<<0) +#define CONVERT_FLAG_CLEAR_ON_EMPTY (1u<<1) + uint32_t flags; float scale; uint32_t *random; @@ -282,6 +284,9 @@ #define convert_clear(conv,...) (conv)->clear(conv, __VA_ARGS__) #define convert_free(conv) (conv)->free(conv) +#define convert_is_passthrough(conv) SPA_FLAG_IS_SET((conv)->flags, CONVERT_FLAG_PASSTHROUGH) +#define convert_is_clear_on_empty(conv) SPA_FLAG_IS_SET((conv)->flags, CONVERT_FLAG_CLEAR_ON_EMPTY) + #define DEFINE_NOISE_FUNCTION(name,arch) \ void conv_noise_##name##_##arch(struct convert *conv, float *noise, \ uint32_t n_samples) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/spa/plugins/filter-graph/filter-graph.c new/pipewire-1.6.6/spa/plugins/filter-graph/filter-graph.c --- old/pipewire-1.6.5/spa/plugins/filter-graph/filter-graph.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/spa/plugins/filter-graph/filter-graph.c 2026-05-26 10:09:28.000000000 +0200 @@ -230,6 +230,7 @@ uint32_t quantum_limit; uint32_t max_align; long unsigned rate; + bool filter_path; struct spa_list plugin_list; @@ -739,6 +740,9 @@ } v = v * (vol->max[n_port] - vol->min[n_port]) + vol->min[n_port]; + p->control_initialized = true; + p->control_current = v; + n_hndl = SPA_MAX(1u, p->node->n_hndl); res += port_id_set_control_value(p, i % n_hndl, v); } @@ -884,7 +888,7 @@ struct spa_handle *hndl = NULL; struct plugin *plugin; char module[PATH_MAX]; - char factory_name[256], dsp_ptr[256]; + char factory_name[256], dsp_ptr[256], filter[16]; void *iface; int res; @@ -902,11 +906,14 @@ "filter.graph.plugin.%s", type); spa_scnprintf(dsp_ptr, sizeof(dsp_ptr), "pointer:%p", impl->dsp); + spa_scnprintf(filter, sizeof(filter), + "%s", impl->filter_path ? "true" : "false"); hndl = spa_plugin_loader_load(impl->loader, factory_name, &SPA_DICT_ITEMS( SPA_DICT_ITEM(SPA_KEY_LIBRARY_NAME, module), SPA_DICT_ITEM("filter.graph.path", path), + SPA_DICT_ITEM("library.filter-path", filter), SPA_DICT_ITEM("filter.graph.audio.dsp", dsp_ptr))); if (hndl == NULL) { @@ -2400,6 +2407,8 @@ spa_atou32(s, &impl->info.n_inputs, 0); if (spa_streq(k, "filter-graph.n_outputs")) spa_atou32(s, &impl->info.n_outputs, 0); + if (spa_streq(k, "library.filter-path")) + impl->filter_path = spa_atob(s); } if (impl->quantum_limit == 0) return -EINVAL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/spa/plugins/filter-graph/plugin_ladspa.c new/pipewire-1.6.6/spa/plugins/filter-graph/plugin_ladspa.c --- old/pipewire-1.6.5/spa/plugins/filter-graph/plugin_ladspa.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/spa/plugins/filter-graph/plugin_ladspa.c 2026-05-26 10:09:28.000000000 +0200 @@ -21,6 +21,7 @@ struct plugin { struct spa_handle handle; struct spa_fga_plugin plugin; + bool filter_path; struct spa_log *log; @@ -233,13 +234,13 @@ return s; } -static void make_search_paths(const char **path, const char **search_dirs) +static void make_search_paths(const char **path, const char **search_dirs, bool filter) { - const char *p; - - while ((p = strstr(*path, "../")) != NULL) - *path = p + 3; - + if (filter) { + const char *p; + while ((p = strstr(*path, "../")) != NULL) + *path = p + 3; + } *search_dirs = getenv("LADSPA_PATH"); if (!*search_dirs) *search_dirs = "/usr/lib64/ladspa:/usr/lib/ladspa:" LIBDIR; @@ -252,6 +253,8 @@ char filename[PATH_MAX]; size_t len; + if (!impl->filter_path && path[0] == '/') + return ladspa_handle_load_by_path(impl, path); /* * set the errno for the case when `ladspa_handle_load_by_path()` * is never called, which can only happen if the supplied @@ -337,11 +340,13 @@ const char *s = info->items[i].value; if (spa_streq(k, "filter.graph.path")) path = s; + else if (spa_streq(k, "library.filter-path")) + impl->filter_path = spa_atob(s); } if (path == NULL) return -EINVAL; - make_search_paths(&path, &search_dirs); + make_search_paths(&path, &search_dirs, impl->filter_path); if ((res = load_ladspa_plugin(impl, path, search_dirs)) < 0) { spa_log_error(impl->log, "failed to load plugin '%s' in '%s': %s", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-native/connection.c new/pipewire-1.6.6/src/modules/module-protocol-native/connection.c --- old/pipewire-1.6.5/src/modules/module-protocol-native/connection.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-native/connection.c 2026-05-26 10:09:28.000000000 +0200 @@ -538,7 +538,8 @@ size -= impl->hdr_size; buf->msg.fds = &buf->fds[buf->fds_offset]; - if (buf->msg.n_fds + buf->fds_offset > buf->n_fds) + if (buf->msg.n_fds > MAX_FDS || + buf->msg.n_fds + buf->fds_offset > buf->n_fds) return -EPROTO; if (size < len) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c new/pipewire-1.6.6/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c --- old/pipewire-1.6.5/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c 2026-05-26 10:09:28.000000000 +0200 @@ -200,6 +200,7 @@ } else { pw_properties_set(props, PW_KEY_NODE_DESCRIPTION, str); } + pw_properties_set(props, "library.filter-path", "true"); if ((str = pw_properties_get(props, "master")) != NULL || (str = pw_properties_get(props, "sink_master")) != NULL) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-pulse/modules/module-ladspa-source.c new/pipewire-1.6.6/src/modules/module-protocol-pulse/modules/module-ladspa-source.c --- old/pipewire-1.6.5/src/modules/module-protocol-pulse/modules/module-ladspa-source.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-pulse/modules/module-ladspa-source.c 2026-05-26 10:09:28.000000000 +0200 @@ -200,6 +200,7 @@ } else { pw_properties_set(props, PW_KEY_NODE_DESCRIPTION, str); } + pw_properties_set(props, "library.filter-path", "true"); if ((str = pw_properties_get(props, "master")) != NULL || (str = pw_properties_get(props, "source_master")) != NULL) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-pulse/pulse-server.c new/pipewire-1.6.6/src/modules/module-protocol-pulse/pulse-server.c --- old/pipewire-1.6.5/src/modules/module-protocol-pulse/pulse-server.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-pulse/pulse-server.c 2026-05-26 10:09:28.000000000 +0200 @@ -1164,16 +1164,16 @@ break; } - /* Don't emit suspended if we are creating a corked stream, as that will have a quick - * RUNNING/SUSPENDED transition for initial negotiation */ + /* Only emit suspended if we are created and not a corked stream, this means the + * paused on our stream needs to be caused by the sink suspend or an unlink. */ if (stream->create_tag == SPA_ID_INVALID && !stream->corked) { if (old == PW_STREAM_STATE_PAUSED && state == PW_STREAM_STATE_STREAMING && - stream->is_suspended) { + stream->dont_inhibit_auto_suspend && stream->is_suspended) { stream_send_suspended(stream, false); stream->is_suspended = false; } if (old == PW_STREAM_STATE_STREAMING && state == PW_STREAM_STATE_PAUSED && - !stream->is_suspended) { + stream->dont_inhibit_auto_suspend && !stream->is_suspended) { if (stream->fail_on_suspend) { stream->killed = true; destroy_stream = true; @@ -1790,6 +1790,7 @@ stream->is_underrun = true; stream->underrun_for = -1; stream->fail_on_suspend = fail_on_suspend; + stream->dont_inhibit_auto_suspend = dont_inhibit_auto_suspend; pw_properties_set(props, "pulse.corked", corked ? "true" : "false"); @@ -2066,6 +2067,7 @@ stream->muted = muted; stream->muted_set = muted_set; stream->fail_on_suspend = fail_on_suspend; + stream->dont_inhibit_auto_suspend = dont_inhibit_auto_suspend; if (client->quirks & QUIRK_REMOVE_CAPTURE_DONT_MOVE) no_move = false; @@ -2110,10 +2112,10 @@ pw_properties_set(props, PW_KEY_TARGET_OBJECT, source_name); } - if (is_monitor) - pw_properties_set(props, - PW_KEY_STREAM_CAPTURE_SINK, "true"); } + if (is_monitor) + pw_properties_set(props, + PW_KEY_STREAM_CAPTURE_SINK, "true"); if (dont_inhibit_auto_suspend) pw_properties_set(props, PW_KEY_NODE_PASSIVE, "true"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-pulse/server.c new/pipewire-1.6.6/src/modules/module-protocol-pulse/server.c --- old/pipewire-1.6.5/src/modules/module-protocol-pulse/server.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-pulse/server.c 2026-05-26 10:09:28.000000000 +0200 @@ -444,10 +444,10 @@ #ifdef SO_PRIORITY val = 6; - if (setsockopt(client_fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)) < 0) + if (setsockopt(client->source->fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)) < 0) pw_log_warn("setsockopt(SO_PRIORITY) failed: %m"); #endif - pid = get_client_pid(client, client_fd); + pid = get_client_pid(client, client->source->fd); if (pid != 0 && pw_check_flatpak(pid, &app_id, &instance_id, &devices) == 1) { /* * XXX: we should really use Portal client access here @@ -483,7 +483,7 @@ } // check SNAP permissions #ifdef HAVE_SNAP - snap_access = pw_snap_get_audio_permissions(client, client_fd, &snap_app_id); + snap_access = pw_snap_get_audio_permissions(client, client->source->fd, &snap_app_id); if ((snap_access & PW_SANDBOX_ACCESS_NOT_A_SANDBOX) == 0) { pw_properties_set(client->props, PW_KEY_SNAP_ID, snap_app_id); @@ -500,12 +500,12 @@ else if (server->addr.ss_family == AF_INET || server->addr.ss_family == AF_INET6) { val = 1; - if (setsockopt(client_fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) < 0) + if (setsockopt(client->source->fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) < 0) pw_log_warn("setsockopt(TCP_NODELAY) failed: %m"); if (server->addr.ss_family == AF_INET) { val = IPTOS_LOWDELAY; - if (setsockopt(client_fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0) + if (setsockopt(client->source->fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0) pw_log_warn("setsockopt(IP_TOS) failed: %m"); } if (client_access == NULL) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/modules/module-protocol-pulse/stream.h new/pipewire-1.6.6/src/modules/module-protocol-pulse/stream.h --- old/pipewire-1.6.5/src/modules/module-protocol-pulse/stream.h 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/modules/module-protocol-pulse/stream.h 2026-05-26 10:09:28.000000000 +0200 @@ -101,6 +101,7 @@ unsigned int is_paused:1; unsigned int fail_on_suspend:1; unsigned int is_suspended:1; + unsigned int dont_inhibit_auto_suspend:1; }; struct stream *stream_new(struct client *client, enum stream_type type, uint32_t create_tag, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/pipewire/impl-metadata.c new/pipewire-1.6.6/src/pipewire/impl-metadata.c --- old/pipewire-1.6.5/src/pipewire/impl-metadata.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/pipewire/impl-metadata.c 2026-05-26 10:09:28.000000000 +0200 @@ -407,7 +407,7 @@ struct pw_impl_client *client = pw_resource_get_client(resource); int res; - if ((res = pw_impl_client_check_permissions(client, subject, PW_PERM_R)) < 0) + if ((res = pw_impl_client_check_permissions(client, subject, PW_PERM_R | PW_PERM_M)) < 0) goto error; pw_metadata_set_property(impl->metadata, subject, key, type, value); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/pipewire/impl-node.c new/pipewire-1.6.6/src/pipewire/impl-node.c --- old/pipewire-1.6.5/src/pipewire/impl-node.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/pipewire/impl-node.c 2026-05-26 10:09:28.000000000 +0200 @@ -554,16 +554,18 @@ if ((res = pw_impl_port_set_param(p, SPA_PARAM_Format, 0, NULL)) < 0) pw_log_warn("%p: error unset format input: %s", this, spa_strerror(res)); - /* force CONFIGURE in case of async */ - p->state = PW_IMPL_PORT_STATE_CONFIGURE; + /* force CONFIGURE in case of async, use update_state to + * notify links so they can cancel pending work */ + pw_impl_port_update_state(p, PW_IMPL_PORT_STATE_CONFIGURE, 0, NULL); } spa_list_for_each(p, &this->output_ports, link) { if ((res = pw_impl_port_set_param(p, SPA_PARAM_Format, 0, NULL)) < 0) pw_log_warn("%p: error unset format output: %s", this, spa_strerror(res)); - /* force CONFIGURE in case of async */ - p->state = PW_IMPL_PORT_STATE_CONFIGURE; + /* force CONFIGURE in case of async, use update_state to + * notify links so they can cancel pending work */ + pw_impl_port_update_state(p, PW_IMPL_PORT_STATE_CONFIGURE, 0, NULL); } node_update_state(this, PW_NODE_STATE_SUSPENDED, 0, NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/tools/midifile.c new/pipewire-1.6.6/src/tools/midifile.c --- old/pipewire-1.6.5/src/tools/midifile.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/tools/midifile.c 2026-05-26 10:09:28.000000000 +0200 @@ -209,21 +209,24 @@ return res; } -static inline int write_n(FILE *file, const void *buf, int count) +static inline int write_n(struct midi_file *mf, const void *buf, int count) { - return fwrite(buf, 1, count, file) == (size_t)count ? count : -errno; + if (fwrite(buf, 1, count, mf->file) != (size_t)count) + return -errno; + mf->pos += count; + return count; } -static inline int write_be16(FILE *file, uint16_t val) +static inline int write_be16(struct midi_file *mf, uint16_t val) { uint8_t buf[2] = { val >> 8, val }; - return write_n(file, buf, 2); + return write_n(mf, buf, 2); } -static inline int write_be32(FILE *file, uint32_t val) +static inline int write_be32(struct midi_file *mf, uint32_t val) { uint8_t buf[4] = { val >> 24, val >> 16, val >> 8, val }; - return write_n(file, buf, 4); + return write_n(mf, buf, 4); } #define CHECK_RES(expr) if ((res = (expr)) < 0) return res @@ -233,17 +236,18 @@ struct midi_track *tr = &mf->tracks[0]; int res; - mf_seek(mf, 0); + if ((res = mf_seek(mf, 0)) < 0) + return -res; mf->length = 6; - CHECK_RES(write_n(mf->file, "MThd", 4)); - CHECK_RES(write_be32(mf->file, mf->length)); - CHECK_RES(write_be16(mf->file, mf->info.format)); - CHECK_RES(write_be16(mf->file, mf->info.ntracks)); - CHECK_RES(write_be16(mf->file, mf->info.division)); + CHECK_RES(write_n(mf, "MThd", 4)); + CHECK_RES(write_be32(mf, mf->length)); + CHECK_RES(write_be16(mf, mf->info.format)); + CHECK_RES(write_be16(mf, mf->info.ntracks)); + CHECK_RES(write_be16(mf, mf->info.division)); - CHECK_RES(write_n(mf->file, "MTrk", 4)); - CHECK_RES(write_be32(mf->file, tr->size)); + CHECK_RES(write_n(mf, "MTrk", 4)); + CHECK_RES(write_be32(mf, tr->size)); return 0; } @@ -314,7 +318,7 @@ if (mf->mode == 2) { uint8_t buf[4] = { 0x00, 0xff, 0x2f, 0x00 }; - CHECK_RES(write_n(mf->file, buf, 4)); + CHECK_RES(write_n(mf, buf, 4)); mf->tracks[0].size += 4; CHECK_RES(write_headers(mf)); } else if (mf->mode != 1) @@ -490,7 +494,7 @@ } do { b = buffer & 0xff; - CHECK_RES(write_n(mf->file, &b, 1)); + CHECK_RES(write_n(mf, &b, 1)); tr->size++; buffer >>= 8; } while (b & 0x80); @@ -502,10 +506,10 @@ { struct midi_track *tr; uint32_t tick; - void *data, *ev_data; + void *data; size_t size; int res, ev_size; - uint8_t ev[32]; + uint8_t ev[32], *ev_data; uint64_t state = 0; spa_return_val_if_fail(event != NULL, -EINVAL); @@ -539,7 +543,18 @@ CHECK_RES(write_varlen(mf, tr, tick - tr->tick)); tr->tick = tick; - CHECK_RES(write_n(mf->file, ev_data, ev_size)); + if (ev_size > 0 && + (ev_data[0] == 0xf0 || ev_data[0] == 0xf7)) { + CHECK_RES(write_n(mf, ev_data, 1)); + ev_size -= 1; + ev_data += 1; + + CHECK_RES(write_varlen(mf, tr, ev_size)); + + tr->size += 1; + } + + CHECK_RES(write_n(mf, ev_data, ev_size)); tr->size += ev_size; } return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pipewire-1.6.5/src/tools/pw-cat.c new/pipewire-1.6.6/src/tools/pw-cat.c --- old/pipewire-1.6.5/src/tools/pw-cat.c 2026-05-13 16:58:43.000000000 +0200 +++ new/pipewire-1.6.6/src/tools/pw-cat.c 2026-05-26 10:09:28.000000000 +0200 @@ -1218,7 +1218,7 @@ " --volume Stream volume 0-1.0 (default %.3f)\n" " -q --quality Resampler quality (0 - 15) (default %d)\n" " -a, --raw RAW mode\n" - " -M, --force-midi Force midi format, one of \"midi\" or \"ump\", (default ump)\n" + " -M, --force-midi Force midi format, one of \"none\", \"midi\" or \"ump\", (default none)\n" " -n, --sample-count COUNT Stop after COUNT samples\n" "\n"), DEFAULT_RATE, @@ -2192,7 +2192,7 @@ /* negative means no volume adjustment */ data.volume = -1.0; data.quality = -1; - data.midi.force_type = MIDI_FORCE_UMP; + data.midi.force_type = MIDI_FORCE_NONE; data.props = pw_properties_new( PW_KEY_APP_NAME, prog, PW_KEY_NODE_NAME, prog, ++++++ pipewire.obsinfo ++++++ --- /var/tmp/diff_new_pack.JGLJ2z/_old 2026-05-28 17:24:44.370255888 +0200 +++ /var/tmp/diff_new_pack.JGLJ2z/_new 2026-05-28 17:24:44.374256053 +0200 @@ -1,5 +1,5 @@ name: pipewire -version: 1.6.5 -mtime: 1778684323 -commit: 55848f4260a2d2302f9f6bd304d82616976ef9af +version: 1.6.6 +mtime: 1779782968 +commit: a1c1d9f9f128ec987f23a0140a1704b8f8781787
