Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package feedbackd for openSUSE:Factory checked in at 2025-11-24 14:09:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/feedbackd (Old) and /work/SRC/openSUSE:Factory/.feedbackd.new.14147 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "feedbackd" Mon Nov 24 14:09:17 2025 rev:12 rq:1319175 version:0.8.7 Changes: -------- --- /work/SRC/openSUSE:Factory/feedbackd/feedbackd.changes 2025-10-18 18:36:31.926199501 +0200 +++ /work/SRC/openSUSE:Factory/.feedbackd.new.14147/feedbackd.changes 2025-11-24 14:10:43.865158452 +0100 @@ -1,0 +2,6 @@ +Thu Nov 20 15:04:42 UTC 2025 - Dominique Leuenberger <[email protected]> + +- Update to version 0.8.7: + + Make it simple to use role based audio roles + +------------------------------------------------------------------- Old: ---- feedbackd-0.8.6.obscpio New: ---- feedbackd-0.8.7.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ feedbackd.spec ++++++ --- /var/tmp/diff_new_pack.kfYoxG/_old 2025-11-24 14:10:45.269217521 +0100 +++ /var/tmp/diff_new_pack.kfYoxG/_new 2025-11-24 14:10:45.281218026 +0100 @@ -19,7 +19,7 @@ %define soname libfeedback-0_0-0 Name: feedbackd -Version: 0.8.6 +Version: 0.8.7 Release: 0 Summary: Feedback library for GNOME License: GPL-3.0-only AND LGPL-2.1-only @@ -28,7 +28,7 @@ BuildRequires: c_compiler BuildRequires: dbus-1 -BuildRequires: meson +BuildRequires: meson >= 1.1.0 BuildRequires: vala BuildRequires: pkgconfig(gio-2.0) >= 2.50.0 BuildRequires: pkgconfig(gio-unix-2.0) >= 2.50.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.kfYoxG/_old 2025-11-24 14:10:45.385222401 +0100 +++ /var/tmp/diff_new_pack.kfYoxG/_new 2025-11-24 14:10:45.389222570 +0100 @@ -1,7 +1,7 @@ <services> <service mode="manual" name="obs_scm"> <param name="url">https://github.com/agx/feedbackd.git</param> - <param name="revision">v0.8.6</param> + <param name="revision">v0.8.7</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="scm">git</param> ++++++ feedbackd-0.8.6.obscpio -> feedbackd-0.8.7.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/NEWS new/feedbackd-0.8.7/NEWS --- old/feedbackd-0.8.6/NEWS 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/NEWS 2025-11-08 13:39:43.000000000 +0100 @@ -1,3 +1,10 @@ +feedbackd 0.8.7 +--------------- +Released November 2025 +* Make is simple to use role based audio roles +* Contributors: + * Guido Günther + feedbackd 0.8.6 --------------- Released October 2025 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/data/default.json new/feedbackd-0.8.7/data/default.json --- old/feedbackd-0.8.6/data/default.json 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/data/default.json 2025-11-08 13:39:43.000000000 +0100 @@ -7,7 +7,8 @@ { "event-name" : "alarm-clock-elapsed", "type" : "Sound", - "effect" : "alarm-clock-elapsed" + "effect" : "alarm-clock-elapsed", + "media-role" : "Alarm" }, { "event-name" : "button-pressed", @@ -42,7 +43,8 @@ { "event-name" : "message-new-cellbroadcast", "type" : "Sound", - "effect" : "cellbroadcast" + "effect" : "cellbroadcast", + "media-role" : "Emergency" }, { "event-name" : "message-new-email", @@ -62,7 +64,8 @@ { "event-name" : "phone-incoming-call", "type" : "Sound", - "effect" : "phone-incoming-call" + "effect" : "phone-incoming-call", + "media-role" : "Ringtone" }, { "event-name" : "phone-hangup", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/data/media-role-nodes.conf new/feedbackd-0.8.7/data/media-role-nodes.conf --- old/feedbackd-0.8.6/data/media-role-nodes.conf 1970-01-01 01:00:00.000000000 +0100 +++ new/feedbackd-0.8.7/data/media-role-nodes.conf 2025-11-08 13:39:43.000000000 +0100 @@ -0,0 +1,157 @@ +# Based on https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/src/config/wireplumber.conf.d.examples/media-role-nodes.conf + +wireplumber.profiles = { + main = { + policy.linking.role-based.loopbacks = required + } +} + +wireplumber.settings = { + # Default role + node.stream.default-media-role = "Multimedia" + linking.role-based.duck-level = 0.5 +} + +wireplumber.components.rules = [ + { + matches = [ + { + provides = "~loopback.sink.*" + } + ] + actions = { + merge = { + arguments = { + capture.props = { + # Explicitly mark all these sinks as valid role-based policy + # targets, meaning that any links between streams and these sinks + # will be managed by the role-based policy + policy.role-based.target = true + + audio.position = [ FL, FR ] + media.class = Audio/Sink + } + playback.props = { + # This must be set to ensure that the real audio sink is suspended + # when there is no active client stream linked + node.passive = true + # Set this to an unused role to make sure that loopbacks don't + # accidentally chain-link on to one another, especially when + # node.stream.default-media-role is configured in the settings + media.role = "Loopback" + } + } + requires = [ support.export-core, pw.node-factory.adapter ] + } + } + } +] + +wireplumber.components = [ + { + type = virtual, provides = policy.linking.role-based.loopbacks + requires = [ loopback.sink.role.multimedia + loopback.sink.role.notification + loopback.sink.role.phone + loopback.sink.role.alarm + loopback.sink.role.ringtone + loopback.sink.role.alert ] + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + node.name = "loopback.sink.role.multimedia" + node.description = "Multimedia" + capture.props = { + device.intended-roles = [ "Music", "Movie", "Game", "Multimedia" ] + device.icon-name = "applications-multimedia" + policy.role-based.priority = 10 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "mix" + } + } + provides = loopback.sink.role.multimedia + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # System events from e.g. notifications + node.name = "loopback.sink.role.notification" + node.description = "System Events and Notifications" + capture.props = { + device.intended-roles = [ "Notification" ] + device.icon-name = "preferences-system-notifications" + policy.role-based.priority = 20 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "duck" + } + } + provides = loopback.sink.role.notification + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Voice calls + node.name = "loopback.sink.role.phone" + node.description = "Phone Calls" + capture.props = { + device.intended-roles = [ "Communication", "Phone" ] + device.icon-name = "phone-ongoing-call" + policy.role-based.priority = 25 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "cork" + } + } + provides = loopback.sink.role.phone + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Alarm clocks + node.name = "loopback.sink.role.alarm" + node.description = "Alarm Clocks" + capture.props = { + device.intended-roles = [ "Alarm" ] + device.icon-name = "alarm" + policy.role-based.priority = 30 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "duck" + policy.role-based.preferred-target = "Speaker" + } + } + provides = loopback.sink.role.alarm + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Phone call ring tones + node.name = "loopback.sink.role.ringtone" + node.description = "Ringtones" + capture.props = { + device.intended-roles = [ "Ringtone" ] + device.icon-name = "call-ring" + policy.role-based.priority = 40 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "cork" + } + } + provides = loopback.sink.role.ringtone + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Cell Broadcasts, etc + node.name = "loopback.sink.role.alert" + node.description = "Alerts" + capture.props = { + device.intended-roles = [ "Alert", "Emergency" ] + device.icon-name = "network-cellular" + policy.role-based.priority = 100 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "cork" + policy.role-based.preferred-target = "Speaker" + } + } + provides = loopback.sink.role.alert + } +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/data/meson.build new/feedbackd-0.8.7/data/meson.build --- old/feedbackd-0.8.6/data/meson.build 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/data/meson.build 2025-11-08 13:39:43.000000000 +0100 @@ -91,4 +91,7 @@ install_dir: systemd_user_unit_dir, ) + if get_option('media-roles') + install_data('media-role-nodes.conf', install_dir: wireplumberdir) + endif endif # daemon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/debian/changelog new/feedbackd-0.8.7/debian/changelog --- old/feedbackd-0.8.6/debian/changelog 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/debian/changelog 2025-11-08 13:39:43.000000000 +0100 @@ -1,3 +1,31 @@ +feedbackd (0.8.7) experimental; urgency=medium + + * build: Rename options file. + Bump needed meson version for that + * run: Simplify running. + We usually want the daemon so default to that when nothing + else is passed in. + * data: Set suitable media roles for events. + Mark alarms, alerts and ring tones. + * data: Add media roles configuration. + This ensures we properly duck any "multimedia" streams when playing + event sounds. We also introduce an alert group for e.g. cell broadcasts. + For testing copy to + ~/.config/wireplumber/wireplumber.conf.d/media-role-nodes.conf + and + systemctl --user restart wireplumber + * build: Allow to install media roles. + Install role based config if set. + * dev-sound: Only set media role when role based routing is enabled. + This allows to already update the theme without breaking existing installations. + * data: Add preferred output targets for alarms and alerts. + We usually want them to go to the speaker by default. + This needs https://gitlab.freedesktop.org/pipewire/wireplumber/-/merge_requests/754 + * media-roles: Add Phone role. + E.g. calls and wys already tag streams with this + + -- Guido Günther <[email protected]> Sat, 08 Nov 2025 09:44:20 +0100 + feedbackd (0.8.6) experimental; urgency=medium * ci: Publish docs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/examples/media-role-nodes.conf new/feedbackd-0.8.7/examples/media-role-nodes.conf --- old/feedbackd-0.8.6/examples/media-role-nodes.conf 1970-01-01 01:00:00.000000000 +0100 +++ new/feedbackd-0.8.7/examples/media-role-nodes.conf 2025-11-08 13:39:43.000000000 +0100 @@ -0,0 +1,138 @@ +# Based on https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/src/config/wireplumber.conf.d.examples/media-role-nodes.conf + +wireplumber.profiles = { + main = { + policy.linking.role-based.loopbacks = required + } +} + +wireplumber.settings = { + # Default role + node.stream.default-media-role = "Multimedia" + linking.role-based.duck-level = 0.5 +} + +wireplumber.components.rules = [ + { + matches = [ + { + provides = "~loopback.sink.*" + } + ] + actions = { + merge = { + arguments = { + capture.props = { + # Explicitly mark all these sinks as valid role-based policy + # targets, meaning that any links between streams and these sinks + # will be managed by the role-based policy + policy.role-based.target = true + + audio.position = [ FL, FR ] + media.class = Audio/Sink + } + playback.props = { + # This must be set to ensure that the real audio sink is suspended + # when there is no active client stream linked + node.passive = true + # Set this to an unused role to make sure that loopbacks don't + # accidentally chain-link on to one another, especially when + # node.stream.default-media-role is configured in the settings + media.role = "Loopback" + } + } + requires = [ support.export-core, pw.node-factory.adapter ] + } + } + } +] + +wireplumber.components = [ + { + type = virtual, provides = policy.linking.role-based.loopbacks + requires = [ loopback.sink.role.multimedia + loopback.sink.role.notification + loopback.sink.role.alarm + loopback.sink.role.ringtone + loopback.sink.role.alert ] + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + node.name = "loopback.sink.role.multimedia" + node.description = "Multimedia" + capture.props = { + device.intended-roles = [ "Music", "Movie", "Game", "Multimedia" ] + device.icon-name = "applications-multimedia" + policy.role-based.priority = 10 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "mix" + } + } + provides = loopback.sink.role.multimedia + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # System events from e.g. notifications + node.name = "loopback.sink.role.notification" + node.description = "System Events and Notifications" + capture.props = { + device.intended-roles = [ "Notification" ] + device.icon-name = "preferences-system-notifications" + policy.role-based.priority = 20 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "duck" + } + } + provides = loopback.sink.role.notification + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Alarm clocks + node.name = "loopback.sink.role.alarm" + node.description = "Alarm Clocks" + capture.props = { + device.intended-roles = [ "Alarm" ] + device.icon-name = "alarm" + policy.role-based.priority = 30 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "duck" + } + } + provides = loopback.sink.role.alarm + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Phone call ring tones + node.name = "loopback.sink.role.ringtone" + node.description = "Ringtones" + capture.props = { + device.intended-roles = [ "Ringtone" ] + device.icon-name = "call-ring" + policy.role-based.priority = 40 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "cork" + } + } + provides = loopback.sink.role.ringtone + } + { + name = libpipewire-module-loopback, type = pw-module + arguments = { + # Cell Broadcasts, etc + node.name = "loopback.sink.role.alert" + node.description = "Alerts" + capture.props = { + device.intended-roles = [ "Alert", "Emergency" ] + device.icon-name = "network-cellular" + policy.role-based.priority = 100 + policy.role-based.action.same-priority = "mix" + policy.role-based.action.lower-priority = "cork" + } + } + provides = loopback.sink.role.alert + } +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/meson.build new/feedbackd-0.8.7/meson.build --- old/feedbackd-0.8.6/meson.build 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/meson.build 2025-11-08 13:39:43.000000000 +0100 @@ -1,9 +1,9 @@ project( 'feedbackd', 'c', - version: '0.8.6', + version: '0.8.7', license: 'LGPLv3+', - meson_version: '>= 1.0.0', + meson_version: '>= 1.1.0', default_options: ['warning_level=1', 'buildtype=debugoptimized', 'c_std=gnu11'], ) @@ -42,6 +42,7 @@ else udevdir = prefix / 'lib' / 'udev' / 'rules.d' endif +wireplumberdir = datadir / 'wireplumber' / 'wireplumber.conf.d' run_data = configuration_data() run_data.set('ABS_BUILDDIR', meson.current_build_dir()) @@ -124,6 +125,7 @@ ' Introspection: @0@'.format(introspection), ' Vapi: @0@'.format(get_option('vapi')), ' Tests: @0@'.format(get_option('tests')), + ' Media Roles: @0@'.format(get_option('media-roles')), '---------------', '', ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/meson.options new/feedbackd-0.8.7/meson.options --- old/feedbackd-0.8.6/meson.options 1970-01-01 01:00:00.000000000 +0100 +++ new/feedbackd-0.8.7/meson.options 2025-11-08 13:39:43.000000000 +0100 @@ -0,0 +1,24 @@ +option('introspection', type: 'feature', value: 'auto') +option('vapi', type: 'boolean', value: true) + +option('udev', + type: 'boolean', value: true, + description: 'Whether to install the udev rules') +option('daemon', + type: 'boolean', value: true, + description: 'Whether to build the daemon') +option('gtk_doc', + type: 'boolean', value: false, + description: 'Whether to generate the API reference for Libfeedback') +option('man', + type: 'boolean', value : false, + description : 'generate man pages (requires rst2man)') +option('tests', + type: 'boolean', value: true, + description: 'Whether to compile unit tests') +option('systemd_user_unit_dir', + type: 'string', value: '', + description: 'Directory for systemd user units') +option('media-roles', + type: 'boolean', value: false, + description: 'Use media roles') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/meson_options.txt new/feedbackd-0.8.7/meson_options.txt --- old/feedbackd-0.8.6/meson_options.txt 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/meson_options.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,21 +0,0 @@ -option('introspection', type: 'feature', value: 'auto') -option('vapi', type: 'boolean', value: true) - -option('udev', - type: 'boolean', value: true, - description: 'Whether to install the udev rules') -option('daemon', - type: 'boolean', value: true, - description: 'Whether to build the daemon') -option('gtk_doc', - type: 'boolean', value: false, - description: 'Whether to generate the API reference for Libfeedback') -option('man', - type: 'boolean', value : false, - description : 'generate man pages (requires rst2man)') -option('tests', - type: 'boolean', value: true, - description: 'Whether to compile unit tests') -option('systemd_user_unit_dir', - type: 'string', value: '', - description: 'Directory for systemd user units') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/run.in new/feedbackd-0.8.7/run.in --- old/feedbackd-0.8.6/run.in 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/run.in 2025-11-08 13:39:43.000000000 +0100 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash set -e ABS_BUILDDIR='@ABS_BUILDDIR@' @@ -14,5 +14,7 @@ WRAPPER="gdb --args" fi +EXEC=${@:-${ABS_BUILDDIR}/src/feedbackd} + set -x -exec ${WRAPPER} "$@" +exec ${WRAPPER} $EXEC diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/src/fbd-dev-sound.c new/feedbackd-0.8.7/src/fbd-dev-sound.c --- old/feedbackd-0.8.6/src/fbd-dev-sound.c 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/src/fbd-dev-sound.c 2025-11-08 13:39:43.000000000 +0100 @@ -1,5 +1,6 @@ /* * Copyright (C) 2020 Purism SPC + * 2025 Phosh.mobi e.V. * SPDX-License-Identifier: GPL-3.0+ * Author: Guido Günther <[email protected]> * @@ -9,6 +10,8 @@ #define G_LOG_DOMAIN "fbd-dev-sound" +#include "fbd-config.h" + #include "fbd-dev-sound.h" #include "fbd-feedback-sound.h" @@ -199,11 +202,13 @@ gboolean -fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPlayedCallback callback) +fbd_dev_sound_play (FbdDevSound *self, + FbdFeedbackSound *feedback, + FbdDevSoundPlayedCallback callback) { FbdAsyncData *data; const char *filename; - const char *role; + const char *role = NULL; g_return_val_if_fail (FBD_IS_DEV_SOUND (self), FALSE); g_return_val_if_fail (GSOUND_IS_CONTEXT (self->ctx), FALSE); @@ -213,7 +218,9 @@ if (!g_hash_table_insert (self->playbacks, feedback, data)) g_warning ("Feedback %p already present", feedback); +#ifdef FBD_USE_MEDIA_ROLES role = fbd_feedback_sound_get_media_role (feedback); +#endif if (!role) role = "event"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/feedbackd-0.8.6/src/meson.build new/feedbackd-0.8.7/src/meson.build --- old/feedbackd-0.8.6/src/meson.build 2025-10-05 13:43:15.000000000 +0200 +++ new/feedbackd-0.8.7/src/meson.build 2025-11-08 13:39:43.000000000 +0100 @@ -1,6 +1,11 @@ # Feedback daemon if get_option('daemon') + config_h = configuration_data() + config_h.set_quoted('PACKAGE_VERSION', meson.project_version()) + config_h.set('FBD_USE_MEDIA_ROLES', get_option('media-roles')) + configure_file(output: 'fbd-config.h', configuration: config_h) + fbd_enum_headers = files('fbd-event.h', 'fbd-feedback-led.h', 'fbd-feedback-vibra.h') fbd_enum_sources = gnome.mkenums_simple('fbd-enums', sources: fbd_enum_headers) ++++++ feedbackd.obsinfo ++++++ --- /var/tmp/diff_new_pack.kfYoxG/_old 2025-11-24 14:10:46.041250000 +0100 +++ /var/tmp/diff_new_pack.kfYoxG/_new 2025-11-24 14:10:46.069251179 +0100 @@ -1,5 +1,5 @@ name: feedbackd -version: 0.8.6 -mtime: 1759664595 -commit: f0befe122191e0bae453a2db6e130d8e66057066 +version: 0.8.7 +mtime: 1762605583 +commit: ada7e797360ab2aa6d5542f8446a4dec8ecd0375
