Projects
home:zaitor:branches:Essentials
pipewire-aptx
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Difference Between Revision 3 and
Essentials
/
pipewire-aptx
View file
pipewire-aptx.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Fri Jun 19 13:51:05 UTC 2026 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.6.7 + +------------------------------------------------------------------- Wed May 27 08:06:05 UTC 2026 - Bjørn Lie <zaitor@opensuse.org> - Update to version 1.6.6
View file
pipewire-aptx.spec
Changed
@@ -8,7 +8,7 @@ %define minimum_version 1.6.0 Name: pipewire-aptx -Version: 1.6.6 +Version: 1.6.7 Release: 0 Summary: PipeWire Bluetooth aptX codec plugin License: MIT
View file
_service:download_files:pipewire-1.6.6.tar.bz2/NEWS -> _service:download_files:pipewire-1.6.7.tar.bz2/NEWS
Changed
@@ -1,3 +1,42 @@ +# PipeWire 1.6.7 (2026-06-18) + +This is a bugfix release that is API and ABI compatible with the previous +1.6.x releases. + +## Highlights + - Fix a race issue where some ports would stay silent after a rate change. + - Fix sync regressions between ALSA cards in some cases. + - Small fixes and improvements. + + +## PipeWire + - Fix a scheduler regression where some driver nodes would not run + correctly and cause sync issues. (#5210) + - Fix a race issue with suspend on samplerate changes. It can cause ports + to be silent. (#3547) + +## Modules + - There are some locking issues in the RT portal, for now reduce the + DBus timeout to something more sane. Also disable portal RT for + pipewire and the pulse server. These are not usually run in a sandbox + and can go directly to RTKit. + - Fix potential incorrect delay in combine-stream. + +## SPA + - Fix a regression in ALSA period_size calculations. For non-power-of-2 + periods, it would in some cases round down a a power-of-2, causing a + mismatch between requested and configured period_size. (#5302) + - Fix a potential segfault when removing a card because of bad ALSA api + usage. (#5255) + - Emit a route param update when card properties change. Otherwise, jack + port updates are not always reflected correctly. + +## Misc + - Make sure we don't deal with uninitialized spa_dict. + + +Older versions: + # PipeWire 1.6.6 (2026-05-26) This is a bugfix release that is API and ABI compatible with the previous @@ -39,8 +78,6 @@ 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
View file
_service:download_files:pipewire-1.6.6.tar.bz2/meson.build -> _service:download_files:pipewire-1.6.7.tar.bz2/meson.build
Changed
@@ -1,5 +1,5 @@ project('pipewire', 'c' , - version : '1.6.6', + version : '1.6.7', license : 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' , meson_version : '>= 0.61.1', default_options : 'warning_level=3',
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/include/spa/param/dict-utils.h -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/include/spa/param/dict-utils.h
Changed
@@ -109,7 +109,7 @@ itemsn.key = key; itemsn.value = value; } - dict->items = items; + *dict = SPA_DICT_INIT(items, n); spa_pod_parser_pop(&prs, &f0); return 0; }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/include/spa/param/tag-utils.h -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/include/spa/param/tag-utils.h
Changed
@@ -96,7 +96,7 @@ itemsn.key = key; itemsn.value = value; } - dict->items = items; + *dict = SPA_DICT_INIT(items, n); spa_pod_parser_pop(&prs, &f0); return 0; }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/plugins/alsa/acp/alsa-util.c -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/plugins/alsa/acp/alsa-util.c
Changed
@@ -1723,7 +1723,7 @@ // assertion in alsa-lib since the list is not empty. _helem = snd_mixer_elem_get_private(melem); *_helem = NULL; - snd_mixer_elem_detach(melem, helem); + snd_mixer_elem_remove(melem); } else if (mask & SND_CTL_EVENT_MASK_ADD) { snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem); if (iface == SND_CTL_ELEM_IFACE_CARD || iface == SND_CTL_ELEM_IFACE_PCM) {
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/plugins/alsa/acp/proplist.h -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/plugins/alsa/acp/proplist.h
Changed
@@ -180,8 +180,7 @@ static inline void pa_proplist_as_dict(const pa_proplist *p, struct acp_dict *dict) { - dict->n_items = pa_proplist_size(p); - dict->items = p->array.data; + *dict = ACP_DICT_INIT(p->array.data, pa_proplist_size(p)); } #ifdef __cplusplus
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/plugins/alsa/alsa-acp-device.c -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/plugins/alsa/alsa-acp-device.c
Changed
@@ -897,6 +897,11 @@ { struct impl *this = data; spa_log_info(this->log, "card properties changed"); + + this->info.change_mask |= SPA_DEVICE_CHANGE_MASK_PARAMS; + this->paramsIDX_EnumRoute.user++; + this->paramsIDX_Route.user++; + emit_info(this, false); } static bool has_device(struct acp_card_profile *pr, uint32_t index)
View file
_service:download_files:pipewire-1.6.6.tar.bz2/spa/plugins/alsa/alsa-pcm.c -> _service:download_files:pipewire-1.6.7.tar.bz2/spa/plugins/alsa/alsa-pcm.c
Changed
@@ -2430,9 +2430,15 @@ /* no period size specified. If we are batch or forcing our quantum, * use the graph requested quantum scaled by our rate */ if (period_size == 0 && (state->is_batch || state->force_quantum) && state->position) { - period_size = SPA_SCALE32_UP(state->position->clock.target_duration, - state->rate, state->position->clock.target_rate.denom); - period_size = flp2(period_size); + period_size = state->position->clock.target_duration; + /* only if we are rate adjusting, scale the period size and round down + * to a power of two. */ + if (state->position->clock.target_rate.denom != 0 && + state->rate != (int)state->position->clock.target_rate.denom) { + period_size = SPA_SCALE32_UP(period_size, + state->rate, state->position->clock.target_rate.denom); + period_size = flp2(period_size); + } } if (period_size == 0) period_size = default_period;
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/client.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/client.conf.in
Changed
@@ -47,6 +47,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail condition = { module.rt = !false }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/filter-chain.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/filter-chain.conf.in
Changed
@@ -45,6 +45,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/jack.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/jack.conf.in
Changed
@@ -46,6 +46,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/minimal.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/minimal.conf.in
Changed
@@ -97,6 +97,11 @@ rt.prio = @rtprio_server@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/pipewire-aes67.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/pipewire-aes67.conf.in
Changed
@@ -55,6 +55,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/pipewire-avb.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/pipewire-avb.conf.in
Changed
@@ -30,6 +30,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/pipewire-pulse.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/pipewire-pulse.conf.in
Changed
@@ -31,6 +31,9 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + rtportal.enabled = false + #rtkit.enabled = true #uclamp.min = 0 #uclamp.max = 1024 }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/pipewire-vulkan.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/pipewire-vulkan.conf.in
Changed
@@ -54,6 +54,11 @@ #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + #rtportal.enabled = true + #rtkit.enabled = true + #uclamp.min = 0 + #uclamp.max = 1024 } flags = ifexists nofail }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/daemon/pipewire.conf.in -> _service:download_files:pipewire-1.6.7.tar.bz2/src/daemon/pipewire.conf.in
Changed
@@ -115,6 +115,9 @@ rt.prio = @rtprio_server@ #rt.time.soft = -1 #rt.time.hard = -1 + #rlimits.enabled = true + rtportal.enabled = false + #rtkit.enabled = true #uclamp.min = 0 #uclamp.max = 1024 }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/modules/module-combine-stream.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/modules/module-combine-stream.c
Changed
@@ -771,6 +771,7 @@ break; case PW_STREAM_STATE_STREAMING: update_latency(s->impl); + update_delay(s->impl); break; default: break;
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/modules/module-protocol-pulse/collect.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/modules/module-protocol-pulse/collect.c
Changed
@@ -502,7 +502,8 @@ return SPA_ID_INVALID; } -struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict) +struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict, + struct spa_dict_item *items, size_t capacity) { struct spa_pod_parser prs; struct spa_pod_frame f1; @@ -513,15 +514,18 @@ spa_pod_parser_get_int(&prs, &n_items) < 0) return NULL; + if (n_items < 0 || (size_t) n_items > capacity) + return NULL; + for (n = 0; n < n_items; n++) { if (spa_pod_parser_get(&prs, - SPA_POD_String(&dict->itemsn.key), - SPA_POD_String(&dict->itemsn.value), + SPA_POD_String(&itemsn.key), + SPA_POD_String(&itemsn.value), NULL) < 0) break; } spa_pod_parser_pop(&prs, &f0); - dict->n_items = n; + *dict = SPA_DICT_INIT(items, n); return dict; }
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/modules/module-protocol-pulse/collect.h -> _service:download_files:pipewire-1.6.7.tar.bz2/src/modules/module-protocol-pulse/collect.h
Changed
@@ -142,7 +142,8 @@ /* ========================================================================== */ -struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict); +struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict, + struct spa_dict_item *items, size_t capacity); uint32_t find_profile_index(struct pw_manager_object *card, const char *name); uint32_t find_port_index(struct pw_manager_object *card, uint32_t direction, const char *port_name); struct pw_manager_object *find_peer_for_link(struct pw_manager *m,
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/modules/module-protocol-pulse/pulse-server.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/modules/module-protocol-pulse/pulse-server.c
Changed
@@ -3282,7 +3282,7 @@ static int do_remove_proplist(struct client *client, uint32_t command, uint32_t tag, struct message *m) { uint32_t i, channel; - struct spa_dict dict; + struct spa_dict dict = SPA_DICT_INIT(NULL, 0); struct spa_dict_item *items; spa_autoptr(pw_properties) props = pw_properties_new(NULL, NULL); @@ -3643,8 +3643,7 @@ if (pi->info && pi->n_props > 0) { items = alloca(pi->n_props * sizeof(*items)); - dict.items = items; - pdict = collect_props(pi->info, &dict); + pdict = collect_props(pi->info, &dict, items, pi->n_props); } message_put(m,
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/modules/module-rt.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/modules/module-rt.c
Changed
@@ -185,6 +185,8 @@ #define XDG_PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop" #define XDG_PORTAL_INTERFACE "org.freedesktop.portal.Realtime" +#define DBUS_TIMEOUT_MSEC 2000 /* max time to block on any single message */ + /** \cond */ struct pw_rtkit_bus { DBusConnection *bus; @@ -370,7 +372,7 @@ spa_auto(DBusError) error = DBUS_ERROR_INIT; - if (!(r = dbus_connection_send_with_reply_and_block(connection->bus, m, -1, &error))) + if (!(r = dbus_connection_send_with_reply_and_block(connection->bus, m, DBUS_TIMEOUT_MSEC, &error))) return translate_error(error.name); if (dbus_set_error_from_message(&error, r)) @@ -1132,7 +1134,7 @@ } if (IS_VALID_NICE_LEVEL(impl->nice_level)) { - if (set_nice(impl, impl->nice_level, !use_rtkit) < 0) + if (set_nice(impl, impl->nice_level, !use_rtkit) < 0) use_rtkit = can_use_rtkit; } if (!use_rtkit)
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/context.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/context.c
Changed
@@ -1046,17 +1046,15 @@ } } } - /* now go through all the nodes that have the same link group and - * that are not yet visited. Note how nodes with the same group - * don't get included here. They were added to the same driver but - * need to otherwise stay idle unless some non-passive link activates - * them. */ - if (node->link_groups != NULL) { + /* now go through all the nodes that share groups and link_groups + * that are not yet visited */ + if (node->groups != NULL || node->link_groups != NULL) { spa_list_for_each(t, nodes, sort_link) { if (t->exported || !t->active || SPA_FLAG_IS_SET(t->checked, 1u<<direction)) continue; - if (pw_strv_find_common(t->link_groups, node->link_groups) < 0) + if (pw_strv_find_common(t->groups, node->groups) < 0 && + pw_strv_find_common(t->link_groups, node->link_groups) < 0) continue; pw_log_debug(" group %p: '%s'", t, t->name);
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/impl-link.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/impl-link.c
Changed
@@ -1046,15 +1046,28 @@ struct pw_impl_port *other, enum pw_impl_port_state old, enum pw_impl_port_state state, const char *error) { + struct impl *impl = SPA_CONTAINER_OF(this, struct impl, this); + struct port_info *info; + pw_log_debug("%p: port %p old:%d -> state:%d prepared:%d preparing:%d", this, port, old, state, this->prepared, this->preparing); + if (port == impl->output.port) + info = &impl->output; + else + info = &impl->input; + switch (state) { case PW_IMPL_PORT_STATE_ERROR: link_update_state(this, PW_LINK_STATE_ERROR, -EIO, error ? strdup(error) : NULL); break; case PW_IMPL_PORT_STATE_INIT: case PW_IMPL_PORT_STATE_CONFIGURE: + if (old == PW_IMPL_PORT_STATE_INIT) { + port_set_busy_id(this, info, SPA_ID_INVALID, SPA_ID_INVALID); + pw_work_queue_cancel(impl->work, info, SPA_ID_INVALID); + old = PW_IMPL_PORT_STATE_READY; + } if (this->prepared || state < old) { this->prepared = false; link_update_state(this, PW_LINK_STATE_INIT, 0, NULL);
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/impl-node.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/impl-node.c
Changed
@@ -550,23 +550,10 @@ if (res < 0 && res != -EIO) pw_log_warn("%p: suspend node error %s", this, spa_strerror(res)); - spa_list_for_each(p, &this->input_ports, link) { - 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, 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, 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->input_ports, link) + pw_impl_port_suspend(p); + spa_list_for_each(p, &this->output_ports, link) + pw_impl_port_suspend(p); node_update_state(this, PW_NODE_STATE_SUSPENDED, 0, NULL);
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/impl-port.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/impl-port.c
Changed
@@ -1608,6 +1608,17 @@ free(port); } +void pw_impl_port_suspend(struct pw_impl_port *port) +{ + int res; + if ((res = pw_impl_port_set_param(port, SPA_PARAM_Format, 0, NULL)) < 0) + pw_log_warn("%p: error unset format: %s", port, spa_strerror(res)); + port->state = PW_IMPL_PORT_STATE_INIT; + /* force CONFIGURE in case of async, use update_state to + * notify links so they can cancel pending work */ + pw_impl_port_update_state(port, PW_IMPL_PORT_STATE_CONFIGURE, 0, NULL); +} + struct result_port_params_data { struct impl *impl; void *data;
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/introspect.c -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/introspect.c
Changed
@@ -90,6 +90,7 @@ if (copy->items == NULL) goto no_items; copy->n_items = dict->n_items; + copy->flags = dict->flags & SPA_DICT_FLAG_SORTED; for (i = 0; i < dict->n_items; i++) { itemsi.key = strdup(dict->itemsi.key);
View file
_service:download_files:pipewire-1.6.6.tar.bz2/src/pipewire/private.h -> _service:download_files:pipewire-1.6.7.tar.bz2/src/pipewire/private.h
Changed
@@ -1296,6 +1296,9 @@ /** Destroy a port */ void pw_impl_port_destroy(struct pw_impl_port *port); +/** Suepend a port */ +void pw_impl_port_suspend(struct pw_impl_port *port); + /** Iterate the params of the given port. The callback should return * 1 to fetch the next item, 0 to stop iteration or <0 on error. * The function returns 0 on success or the error returned by the callback. */
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.