diff --git a/.files b/.files
index 32d3188..56173e8 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index 9075dfe..5e44ee4 100644
--- a/.rev
+++ b/.rev
@@ -1729,4 +1729,12 @@
896395
+
+ f3093cd418a5e1f23cf76a0b1ca11cff
+ 1.2.5
+
+ dimstar_suse
+
+ 898836
+
diff --git a/0001-conf-fix-load_for_all_cards.patch b/0001-conf-fix-load_for_all_cards.patch
new file mode 100644
index 0000000..24df93d
--- /dev/null
+++ b/0001-conf-fix-load_for_all_cards.patch
@@ -0,0 +1,97 @@
+From ddfc32abf5697de1618b9e7ffdf57a0f97013090 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela
+Date: Wed, 2 Jun 2021 08:49:32 +0200
+Subject: [PATCH] conf: fix load_for_all_cards()
+
+The 63f7745b commit is loading the driver specific configuration
+multiple times which ends with the array merges (see the bug).
+
+Introduce the loaded compound which traces the already loaded
+driver configurations and skip the multiple load requests.
+
+Fixes: https://github.com/alsa-project/alsa-lib/issues/143
+Fixes: 63f7745b ("conf: extend load_for_all_cards hook (id/value table)")
+Signed-off-by: Jaroslav Kysela
+---
+ src/conf.c | 33 ++++++++++++++++++++++++++++-----
+ 1 file changed, 28 insertions(+), 5 deletions(-)
+
+diff --git a/src/conf.c b/src/conf.c
+index f6c80031032e..d863dec637cf 100644
+--- a/src/conf.c
++++ b/src/conf.c
+@@ -4325,18 +4325,23 @@ static int _snd_config_hook_table(snd_config_t *root, snd_config_t *config, snd_
+ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config, snd_config_t **dst, snd_config_t *private_data ATTRIBUTE_UNUSED)
+ {
+ int card = -1, err;
++ snd_config_t *loaded; // trace loaded cards
+
++ err = snd_config_top(&loaded);
++ if (err < 0)
++ return err;
+ do {
+ err = snd_card_next(&card);
+ if (err < 0)
+- return err;
++ goto __fin_err;
+ if (card >= 0) {
+- snd_config_t *n, *private_data = NULL;
++ snd_config_t *n, *m, *private_data = NULL;
+ const char *driver;
+ char *fdriver = NULL;
++ bool load;
+ err = snd_determine_driver(card, &fdriver);
+ if (err < 0)
+- return err;
++ goto __fin_err;
+ if (snd_config_search(root, fdriver, &n) >= 0) {
+ if (snd_config_get_string(n, &driver) < 0) {
+ if (snd_config_get_type(n) == SND_CONFIG_TYPE_COMPOUND) {
+@@ -4357,6 +4362,19 @@ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config,
+ driver = fdriver;
+ }
+ __std:
++ load = true;
++ err = snd_config_imake_integer(&m, driver, 1);
++ if (err < 0)
++ goto __err;
++ err = snd_config_add(loaded, m);
++ if (err < 0) {
++ if (err == -EEXIST) {
++ snd_config_delete(m);
++ load = false;
++ } else {
++ goto __err;
++ }
++ }
+ private_data = _snd_config_hook_private_data(card, driver);
+ if (!private_data) {
+ err = -ENOMEM;
+@@ -4365,17 +4383,22 @@ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config,
+ err = _snd_config_hook_table(root, config, private_data);
+ if (err < 0)
+ goto __err;
+- err = snd_config_hook_load(root, config, &n, private_data);
++ if (load)
++ err = snd_config_hook_load(root, config, &n, private_data);
+ __err:
+ if (private_data)
+ snd_config_delete(private_data);
+ free(fdriver);
+ if (err < 0)
+- return err;
++ goto __fin_err;
+ }
+ } while (card >= 0);
++ snd_config_delete(loaded);
+ *dst = NULL;
+ return 0;
++__fin_err:
++ snd_config_delete(loaded);
++ return err;
+ }
+ #ifndef DOC_HIDDEN
+ SND_DLSYM_BUILD_VERSION(snd_config_hook_load_for_all_cards, SND_CONFIG_DLSYM_VERSION_HOOK);
+--
+2.26.2
+
diff --git a/0002-ucm-add-_alibpref-to-get-the-private-device-prefix.patch b/0002-ucm-add-_alibpref-to-get-the-private-device-prefix.patch
new file mode 100644
index 0000000..7a6b5b8
--- /dev/null
+++ b/0002-ucm-add-_alibpref-to-get-the-private-device-prefix.patch
@@ -0,0 +1,68 @@
+From 0e4ba2ea8c0402f12a645032a14693eb9b1278e6 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela
+Date: Wed, 2 Jun 2021 11:09:43 +0200
+Subject: [PATCH] ucm: add _alibpref to get the private device prefix
+
+It may be useful to get the device prefix for the local configuration.
+
+Link: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1251
+Signed-off-by: Jaroslav Kysela
+---
+ include/use-case.h | 1 +
+ src/ucm/main.c | 21 +++++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+diff --git a/include/use-case.h b/include/use-case.h
+index ec1a97b01e71..7890358b8d8f 100644
+--- a/include/use-case.h
++++ b/include/use-case.h
+@@ -258,6 +258,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
+ * - _verb - return current verb
+ * - _file - return configuration file loaded for current card
+ * - _alibcfg - return private alsa-lib's configuration for current card
++ * - _alibpref - return private alsa-lib's configuration device prefix for current card
+ *
+ * - [=]{NAME}[/[{modifier}|{/device}][/{verb}]]
+ * - value identifier {NAME}
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index 361952f62830..3c9ea15d5642 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -2138,6 +2138,25 @@ static int get_alibcfg(snd_use_case_mgr_t *uc_mgr, char **str)
+ return 0;
+ }
+
++/**
++ * \brief Get device prefix for private alsa-lib configuration
++ * \param uc_mgr Use case manager
++ * \param str Returned value string
++ * \return Zero on success (value is filled), otherwise a negative error code
++ */
++static int get_alibpref(snd_use_case_mgr_t *uc_mgr, char **str)
++{
++ const size_t l = 9;
++ char *s;
++
++ s = malloc(l);
++ if (s == NULL)
++ return -ENOMEM;
++ snprintf(s, l, "_ucm%04X", uc_mgr->ucm_card_number);
++ *str = s;
++ return 0;
++}
++
+ /**
+ * \brief Get current - string
+ * \param uc_mgr Use case manager
+@@ -2193,6 +2212,8 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
+
+ } else if (strcmp(identifier, "_alibcfg") == 0) {
+ err = get_alibcfg(uc_mgr, (char **)value);
++ } else if (strcmp(identifier, "_alibpref") == 0) {
++ err = get_alibpref(uc_mgr, (char **)value);
+ } else if (identifier[0] == '_') {
+ err = -ENOENT;
+ } else {
+--
+2.26.2
+
diff --git a/0003-ucm-fix-_alibpref-string-add-.-delimiter-to-the-end.patch b/0003-ucm-fix-_alibpref-string-add-.-delimiter-to-the-end.patch
new file mode 100644
index 0000000..a5d458d
--- /dev/null
+++ b/0003-ucm-fix-_alibpref-string-add-.-delimiter-to-the-end.patch
@@ -0,0 +1,34 @@
+From 9621d0bff2e60b43e329ffa5059ab19f2914ec14 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela
+Date: Wed, 2 Jun 2021 11:21:54 +0200
+Subject: [PATCH] ucm: fix _alibpref string (add '.' delimiter to the end)
+
+Fixes: 0e4ba2ea ("ucm: add _alibpref to get the private device prefix")
+Signed-off-by: Jaroslav Kysela
+---
+ src/ucm/main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index 3c9ea15d5642..c9b37b68b655 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -2146,13 +2146,13 @@ static int get_alibcfg(snd_use_case_mgr_t *uc_mgr, char **str)
+ */
+ static int get_alibpref(snd_use_case_mgr_t *uc_mgr, char **str)
+ {
+- const size_t l = 9;
++ const size_t l = 10;
+ char *s;
+
+ s = malloc(l);
+ if (s == NULL)
+ return -ENOMEM;
+- snprintf(s, l, "_ucm%04X", uc_mgr->ucm_card_number);
++ snprintf(s, l, "_ucm%04X.", uc_mgr->ucm_card_number);
+ *str = s;
+ return 0;
+ }
+--
+2.26.2
+
diff --git a/alsa.changes b/alsa.changes
index 7a99ca9..4821971 100644
--- a/alsa.changes
+++ b/alsa.changes
@@ -1,4 +1,13 @@
-------------------------------------------------------------------
+Wed Jun 9 08:58:26 CEST 2021 - tiwai@suse.de
+
+- Fix regression in config read and UCM handling on pipewire and
+ pulseaudio (boo#1187079, boo#1187033):
+ 0001-conf-fix-load_for_all_cards.patch
+ 0002-ucm-add-_alibpref-to-get-the-private-device-prefix.patch
+ 0003-ucm-fix-_alibpref-string-add-.-delimiter-to-the-end.patch
+
+-------------------------------------------------------------------
Mon May 31 11:54:06 UTC 2021 - Ferdinand Thiessen
- Update to version 1.2.5
diff --git a/alsa.spec b/alsa.spec
index ff0f734..7485026 100644
--- a/alsa.spec
+++ b/alsa.spec
@@ -52,6 +52,9 @@ Source30: all_notes_off
Source31: all_notes_off.bin
Source32: all_notes_off.mid
Source34: alsa-init.sh
+Patch1: 0001-conf-fix-load_for_all_cards.patch
+Patch2: 0002-ucm-add-_alibpref-to-get-the-private-device-prefix.patch
+Patch3: 0003-ucm-fix-_alibpref-string-add-.-delimiter-to-the-end.patch
# rest suse fixes
Patch101: alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch
BuildRequires: doxygen
@@ -140,6 +143,9 @@ This package contains the library for ALSA topology support.
%prep
%setup -q -n alsa-lib-%{version}
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
%patch101 -p1
%build