summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac9
-rw-r--r--meson.build6
-rw-r--r--meson_options.txt3
-rw-r--r--src/modules/module-stream-restore.c42
4 files changed, 59 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index fa93172b7..11142cdd6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1477,6 +1477,12 @@ if test "x$enable_legacy_database_entry_format" != "xno" ; then
AC_DEFINE(ENABLE_LEGACY_DATABASE_ENTRY_FORMAT, [1], [Legacy database entry format])
fi
+AC_ARG_ENABLE([stream-restore-clear-old-devices],
+ AS_HELP_STRING([--enable-stream-restore-clear-old-devices], [Forget per-stream routing settings that have been set before version 14.0. Recommended when using GNOME. See https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832]))
+if test "x$enable_stream_restore_clear_old_devices" == "xyes" ; then
+ AC_DEFINE(STREAM_RESTORE_CLEAR_OLD_DEVICES, [1], [module-stream-restore: Clear old devices])
+fi
+
AC_ARG_ENABLE([static-bins],
AS_HELP_STRING([--enable-static-bins],[Statically link executables.]))
AM_CONDITIONAL([STATIC_BINS], [test "x$enable_static_bins" = "xyes"])
@@ -1639,6 +1645,7 @@ AS_IF([test "x$HAVE_ESOUND" = "x1" -a "x$USE_PER_USER_ESOUND_SOCKET" = "x1"], EN
AS_IF([test "x$HAVE_GCOV" = "x1"], ENABLE_GCOV=yes, ENABLE_GCOV=no)
AS_IF([test "x$HAVE_LIBCHECK" = "x1"], ENABLE_TESTS=yes, ENABLE_TESTS=no)
AS_IF([test "x$enable_legacy_database_entry_format" != "xno"], ENABLE_LEGACY_DATABASE_ENTRY_FORMAT=yes, ENABLE_LEGACY_DATABASE_ENTRY_FORMAT=no)
+AS_IF([test "x$enable_stream_restore_clear_old_devices" == "xyes"], ENABLE_STREAM_RESTORE_CLEAR_OLD_DEVICES=yes, ENABLE_STREAM_RESTORE_CLEAR_OLD_DEVICES=no)
echo "
---{ $PACKAGE_NAME $VERSION }---
@@ -1710,6 +1717,8 @@ echo "
Preopened modules: ${PREOPEN_MODS}
Legacy Database Entry Support: ${ENABLE_LEGACY_DATABASE_ENTRY_FORMAT}
+ module-stream-restore:
+ Clear old devices: ${ENABLE_STREAM_RESTORE_CLEAR_OLD_DEVICES}
"
if test "${ENABLE_SPEEX}" = "no" && test "${ENABLE_WEBRTC}" = "no" && test "${ENABLE_ADRIAN_EC}" = "no" ; then
diff --git a/meson.build b/meson.build
index 88394e4b9..abb0ba21c 100644
--- a/meson.build
+++ b/meson.build
@@ -522,6 +522,10 @@ if get_option('legacy-database-entry-format')
cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
endif
+if get_option('stream-restore-clear-old-devices')
+ cdata.set('STREAM_RESTORE_CLEAR_OLD_DEVICES', 1)
+endif
+
if get_option('running-from-build-tree')
cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
endif
@@ -835,6 +839,8 @@ summary = [
'',
'Database: @0@'.format(get_option('database')),
'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
+ 'module-stream-restore:',
+ ' Clear old devices: @0@'.format(get_option('stream-restore-clear-old-devices')),
'Running from build tree: @0@'.format(get_option('running-from-build-tree')),
'System User: @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
'System Group: @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
diff --git a/meson_options.txt b/meson_options.txt
index 817889271..c11b67ea8 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -24,6 +24,9 @@ option('database',
option('legacy-database-entry-format',
type : 'boolean',
description : 'Try to load legacy (< 1.0) database files (card, device and volume restore)')
+option('stream-restore-clear-old-devices',
+ type : 'boolean', value : false,
+ description : 'Forget per-stream routing settings that have been set before version 14.0. Recommended when using GNOME. See https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832')
option('running-from-build-tree',
type : 'boolean',
description : 'Enable running from build tree')
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index a86e6bc31..a3c76714c 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -113,7 +113,7 @@ struct userdata {
#endif
};
-#define ENTRY_VERSION 1
+#define ENTRY_VERSION 2
struct entry {
bool muted_valid, volume_valid, device_valid, card_valid;
@@ -1167,6 +1167,46 @@ static struct entry *entry_read(struct userdata *u, const char *name) {
pa_tagstruct_free(t);
pa_datum_free(&data);
+#ifdef STREAM_RESTORE_CLEAR_OLD_DEVICES
+ if (version < ENTRY_VERSION && e->device_valid) {
+ /* Prior to PulseAudio 14.0, GNOME's sound settings overwrote the
+ * routing for all entries in the stream-restore database when
+ * selecting a device. PulseAudio 14.0 prevents that from happening,
+ * but the old overwritten settings can still be in the database after
+ * updating to PulseAudio 14.0, and they can cause problems, as
+ * documented here:
+ * https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832
+ *
+ * We can't distinguish between devices set by GNOME's sound settings
+ * and devices set by the user, so we discard all old device settings,
+ * even though that is going to cause PulseAudio to forget routing
+ * settings for many users. This is less bad than keeping the incorrect
+ * routing settings in the database, because it's difficult for users
+ * to figure out how to fix the situation when e.g. speaker test tones
+ * go to the internal speakers no matter what device is selected as the
+ * default, whereas old manual configuration can be restored restored
+ * by doing the manual configuration again. Also, it's probably more
+ * common to have at some point changed the default device in GNOME's
+ * sound settings than it is to have any manual per-stream routing
+ * settings. */
+ pa_log_warn("Device set, but it might be incorrect. Clearing the device. If this messes up your manual stream "
+ "routing configuration, sorry about that. This is a workaround for this bug: "
+ "https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832");
+ pa_log_warn("%s: device: %s -> (unset)", name, e->device);
+ pa_xfree(e->device);
+ e->device = NULL;
+ e->device_valid = false;
+ if (e->card_valid) {
+ pa_log_warn("%s: card: %s -> (unset)", name, e->card);
+ pa_xfree(e->card);
+ e->card = NULL;
+ e->card_valid = false;
+ }
+ entry_write(u, name, e, true);
+ trigger_save(u);
+ }
+#endif
+
return e;
fail: