Hello community,

here is the log from the commit of package alsa for openSUSE:Factory checked in 
at 2020-04-27 23:30:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/alsa (Old)
 and      /work/SRC/openSUSE:Factory/.alsa.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "alsa"

Mon Apr 27 23:30:09 2020 rev:199 rq:796547 version:1.2.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/alsa/alsa.changes        2020-03-16 
10:16:58.179553787 +0100
+++ /work/SRC/openSUSE:Factory/.alsa.new.2738/alsa.changes      2020-04-27 
23:30:15.646572556 +0200
@@ -1,0 +2,18 @@
+Mon Apr 20 17:55:24 CEST 2020 - [email protected]
+
+- Backport recent upstream fixes:
+  topology API fix, UCM fixes/improvements, config fixes, chmap
+  support in route plugin, timestamp type fix for dmix:
+  0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch
+  0007-ucm-clarify-the-index-syntax-for-the-device-names.patch
+  0008-ucm-fix-uc_mgr_scan_master_configs.patch
+  0009-namehint-remember-the-direction-from-the-upper-level.patch
+  0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch
+  0011-pcm-add-chmap-option-to-route-plugin.patch
+  0012-usecase-allow-indexes-also-for-modifier-names.patch
+  0013-ucm-fix-the-device-remove-operation.patch
+  0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch
+  0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch
+  0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch
+
+-------------------------------------------------------------------

New:
----
  0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch
  0007-ucm-clarify-the-index-syntax-for-the-device-names.patch
  0008-ucm-fix-uc_mgr_scan_master_configs.patch
  0009-namehint-remember-the-direction-from-the-upper-level.patch
  0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch
  0011-pcm-add-chmap-option-to-route-plugin.patch
  0012-usecase-allow-indexes-also-for-modifier-names.patch
  0013-ucm-fix-the-device-remove-operation.patch
  0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch
  0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch
  0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ alsa.spec ++++++
--- /var/tmp/diff_new_pack.vvSFzF/_old  2020-04-27 23:30:17.122575438 +0200
+++ /var/tmp/diff_new_pack.vvSFzF/_new  2020-04-27 23:30:17.122575438 +0200
@@ -53,6 +53,17 @@
 Patch3:         0003-Change-PCM-device-number-of-Asus-Xonar-U5.patch
 Patch4:         0004-configure-add-embed-for-python3-config-python-3.8.patch
 Patch5:         0005-conf-USB-Audio-Add-C-Media-USB-Headphone-Set-to-the-.patch
+Patch6:         0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch
+Patch7:         0007-ucm-clarify-the-index-syntax-for-the-device-names.patch
+Patch8:         0008-ucm-fix-uc_mgr_scan_master_configs.patch
+Patch9:         0009-namehint-remember-the-direction-from-the-upper-level.patch
+Patch10:        0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch
+Patch11:        0011-pcm-add-chmap-option-to-route-plugin.patch
+Patch12:        0012-usecase-allow-indexes-also-for-modifier-names.patch
+Patch13:        0013-ucm-fix-the-device-remove-operation.patch
+Patch14:        0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch
+Patch15:        0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch
+Patch16:        0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch
 # rest suse fixes
 Patch101:       alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch
 BuildRequires:  doxygen
@@ -142,6 +153,17 @@
 %patch3 -p1
 %patch4 -p1
 %patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
 %patch101 -p1
 
 %build

++++++ 0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch ++++++
>From caf77a93cef5bda729bc33e0100cc0e769767389 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 13 Mar 2020 17:05:14 +0100
Subject: [PATCH 06/16] topology: add back asrc to widget_map in dapm.c

Fixes: aa1bac2d04bd ("topology: add snd_tplg_save()")
BugLink: https://github.com/thesofproject/sof/issues/2543

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/topology/dapm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index cb85e66734f6..70645126d0bc 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -43,6 +43,7 @@ static const struct map_elem widget_map[] = {
        {"effect", SND_SOC_TPLG_DAPM_EFFECT},
        {"siggen", SND_SOC_TPLG_DAPM_SIGGEN},
        {"src", SND_SOC_TPLG_DAPM_SRC},
+       {"asrc", SND_SOC_TPLG_DAPM_ASRC},
        {"encoder", SND_SOC_TPLG_DAPM_ENCODER},
        {"decoder", SND_SOC_TPLG_DAPM_DECODER},
 };
-- 
2.16.4

++++++ 0007-ucm-clarify-the-index-syntax-for-the-device-names.patch ++++++
>From 79102bf264f8651692fe9435a4d1bb06aa022d55 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Tue, 17 Mar 2020 10:21:10 +0100
Subject: [PATCH 07/16] ucm: clarify the index syntax for the device names

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 include/use-case.h | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/include/use-case.h b/include/use-case.h
index 134303afaa18..27cb3fe1613f 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -117,7 +117,10 @@ extern "C" {
  *
  * If multiple devices with the same name exists, the number suffixes should
  * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
- * allowed. The names with numbers must be continuous.
+ * allowed. The names with numbers must be continuous. It is allowed to put
+ * a whitespace between name and index (like 'Line 1') for the better
+ * readability. The device names 'Line 1' and 'Line1' are equal for
+ * thus purpose.
  *
  * If EnableSequence/DisableSequence controls independent paths in the hardware
  * it is also recommended to split playback and capture UCM devices and use
-- 
2.16.4

++++++ 0008-ucm-fix-uc_mgr_scan_master_configs.patch ++++++
>From 6137d263f3805c72781ea74b813b0e3754f5fc34 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Tue, 17 Mar 2020 16:20:52 +0100
Subject: [PATCH 08/16] ucm: fix uc_mgr_scan_master_configs()

Skip the lookup, if the top level filename does not exist.

Fixes: https://github.com/alsa-project/alsa-ucm-conf/issues/16

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 8d6eea31f8e7..0001e5953707 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1969,6 +1969,9 @@ int uc_mgr_scan_master_configs(const char **_list[])
 
                configuration_filename2(filename, sizeof(filename), 2,
                                        d_name, d_name, ".conf");
+               if (eaccess(filename, R_OK))
+                       continue;
+
                err = uc_mgr_config_load(2, filename, &cfg);
                if (err < 0)
                        goto __err;
-- 
2.16.4

++++++ 0009-namehint-remember-the-direction-from-the-upper-level.patch ++++++
>From d434638a683c01bd6decf8f41863044055237a50 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 27 Mar 2020 11:59:53 +0100
Subject: [PATCH 09/16] namehint: remember the direction from the upper levels

The current code resets the direction info for each level.
Simply remove this code.

Fixes: https://github.com/alsa-project/alsa-lib/issues/39

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/control/namehint.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/control/namehint.c b/src/control/namehint.c
index 169bd4215fc5..ecd470f33d07 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -270,8 +270,6 @@ static int try_config(snd_config_t *config,
        if (snd_config_search(cfg1, "type", &cfg) >= 0 &&
            snd_config_get_string(cfg, &str) >= 0 &&
            strcmp(str, "hw") == 0) {
-               list->device_input = -1;
-               list->device_output = -1;
                if (snd_config_search(cfg1, "device", &cfg) >= 0) {
                        if (snd_config_get_integer(cfg, &dev) < 0) {
                                SNDERR("(%s) device must be an integer", buf);
-- 
2.16.4

++++++ 0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch ++++++
>From bca39e99d0c2a270a71dad640983fb739dac8bdd Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 27 Mar 2020 18:14:02 +0100
Subject: [PATCH 10/16] conf: fix namehint for pcm.front and pcm.iec958

As suggested in:

Fixes: https://github.com/alsa-project/alsa-lib/issues/39

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/conf/pcm/front.conf  | 3 ++-
 src/conf/pcm/iec958.conf | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/conf/pcm/front.conf b/src/conf/pcm/front.conf
index 7aff0cbf007d..0edf6a6953b7 100644
--- a/src/conf/pcm/front.conf
+++ b/src/conf/pcm/front.conf
@@ -53,6 +53,7 @@ pcm.!front {
                        name defaults.namehint.basic
                }
                description "Front speakers"
-               device $DEV
+               device_output $DEV
+               omit_noargs true
        }
 }
diff --git a/src/conf/pcm/iec958.conf b/src/conf/pcm/iec958.conf
index ac139b5e4027..2b084d6fd1d7 100644
--- a/src/conf/pcm/iec958.conf
+++ b/src/conf/pcm/iec958.conf
@@ -78,6 +78,6 @@ pcm.!iec958 {
                        name defaults.namehint.basic
                }
                description "IEC958 (S/PDIF) Digital Audio Output"
-               device $DEV
+               device_output $DEV
        }
 }
-- 
2.16.4

++++++ 0011-pcm-add-chmap-option-to-route-plugin.patch ++++++
>From 3b46b03f099da2f39c205a25b3cc62ec688fe6b3 Mon Sep 17 00:00:00 2001
From: Jonas Holmberg <[email protected]>
Date: Tue, 31 Mar 2020 17:09:25 +0200
Subject: [PATCH 11/16] pcm: add chmap option to route plugin

Add a config definition "chmap" to override the channel maps in the same
way as in the hw and null plugins.

Signed-off-by: Jonas Holmberg <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/pcm/pcm_route.c | 57 +++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 47 insertions(+), 10 deletions(-)

diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c
index bbcc6118b593..d3e5f3ff1f15 100644
--- a/src/pcm/pcm_route.c
+++ b/src/pcm/pcm_route.c
@@ -104,6 +104,7 @@ typedef struct {
        int schannels;
        snd_pcm_route_params_t params;
        snd_pcm_chmap_t *chmap;
+       snd_pcm_chmap_query_t **chmap_override;
 } snd_pcm_route_t;
 
 #endif /* DOC_HIDDEN */
@@ -441,6 +442,7 @@ static int snd_pcm_route_close(snd_pcm_t *pcm)
                free(params->dsts);
        }
        free(route->chmap);
+       snd_pcm_free_chmaps(route->chmap_override);
        return snd_pcm_generic_close(pcm);
 }
 
@@ -634,6 +636,9 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t 
*pcm)
        snd_pcm_chmap_t *map, *slave_map;
        unsigned int src, dst, nsrcs;
 
+       if (route->chmap_override)
+               return _snd_pcm_choose_fixed_chmap(pcm, route->chmap_override);
+
        slave_map = snd_pcm_generic_get_chmap(pcm);
        if (!slave_map)
                return NULL;
@@ -660,8 +665,14 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t 
*pcm)
 
 static snd_pcm_chmap_query_t **snd_pcm_route_query_chmaps(snd_pcm_t *pcm)
 {
+       snd_pcm_route_t *route = pcm->private_data;
        snd_pcm_chmap_query_t **maps;
-       snd_pcm_chmap_t *map = snd_pcm_route_get_chmap(pcm);
+       snd_pcm_chmap_t *map;
+
+       if (route->chmap_override)
+               return _snd_pcm_copy_chmap_query(route->chmap_override);
+
+       map = snd_pcm_route_get_chmap(pcm);
        if (!map)
                return NULL;
        maps = _snd_pcm_make_single_query_chmaps(map);
@@ -818,10 +829,10 @@ err:
        return -EINVAL;
 }
 
-static int find_matching_chmap(snd_pcm_t *spcm, snd_pcm_chmap_t *tt_chmap,
+static int find_matching_chmap(snd_pcm_chmap_query_t **chmaps,
+                              snd_pcm_chmap_t *tt_chmap,
                               snd_pcm_chmap_t **found_chmap, int *schannels)
 {
-       snd_pcm_chmap_query_t** chmaps = snd_pcm_query_chmaps(spcm);
        int i;
 
        *found_chmap = NULL;
@@ -854,7 +865,6 @@ static int find_matching_chmap(snd_pcm_t *spcm, 
snd_pcm_chmap_t *tt_chmap,
                        int size = sizeof(snd_pcm_chmap_t) + c->channels * 
sizeof(unsigned int);
                        *found_chmap = malloc(size);
                        if (!*found_chmap) {
-                               snd_pcm_free_chmaps(chmaps);
                                return -ENOMEM;
                        }
                        memcpy(*found_chmap, c, size);
@@ -863,8 +873,6 @@ static int find_matching_chmap(snd_pcm_t *spcm, 
snd_pcm_chmap_t *tt_chmap,
                }
        }
 
-       snd_pcm_free_chmaps(chmaps);
-
        if (*found_chmap == NULL) {
                SNDERR("Found no matching channel map");
                return -EINVAL;
@@ -1252,6 +1260,7 @@ pcm.name {
                         SCHANNEL REAL   # route value (0.0 - 1.0)
                 }
         }
+        [chmap MAP]             # Override channel maps; MAP is a string array
 }
 \endcode
 
@@ -1292,6 +1301,7 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
        snd_pcm_route_ttable_entry_t *ttable = NULL;
        unsigned int csize, ssize;
        unsigned int cused, sused;
+       snd_pcm_chmap_query_t **chmaps = NULL;
        snd_config_for_each(i, next, conf) {
                snd_config_t *n = snd_config_iterator_entry(i);
                const char *id;
@@ -1306,31 +1316,45 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
                if (strcmp(id, "ttable") == 0) {
                        if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) 
{
                                SNDERR("Invalid type for %s", id);
+                               snd_pcm_free_chmaps(chmaps);
                                return -EINVAL;
                        }
                        tt = n;
                        continue;
                }
+               if (strcmp(id, "chmap") == 0) {
+                       chmaps = _snd_pcm_parse_config_chmaps(n);
+                       if (!chmaps) {
+                               SNDERR("Invalid channel map for %s", id);
+                               return -EINVAL;
+                       }
+                       continue;
+               }
                SNDERR("Unknown field %s", id);
                return -EINVAL;
        }
        if (!slave) {
                SNDERR("slave is not defined");
+               snd_pcm_free_chmaps(chmaps);
                return -EINVAL;
        }
        if (!tt) {
                SNDERR("ttable is not defined");
+               snd_pcm_free_chmaps(chmaps);
                return -EINVAL;
        }
        err = snd_pcm_slave_conf(root, slave, &sconf, 2,
                                 SND_PCM_HW_PARAM_FORMAT, 0, &sformat,
                                 SND_PCM_HW_PARAM_CHANNELS, 0, &schannels);
-       if (err < 0)
+       if (err < 0) {
+               snd_pcm_free_chmaps(chmaps);
                return err;
+       }
        if (sformat != SND_PCM_FORMAT_UNKNOWN &&
            snd_pcm_format_linear(sformat) != 1) {
                snd_config_delete(sconf);
                SNDERR("slave format is not linear");
+               snd_pcm_free_chmaps(chmaps);
                return -EINVAL;
        }
 
@@ -1345,13 +1369,19 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
        if (err < 0) {
                free(tt_chmap);
                free(ttable);
+               snd_pcm_free_chmaps(chmaps);
                return err;
        }
 
        if (tt_chmap) {
-               err = find_matching_chmap(spcm, tt_chmap, &chmap, &schannels);
+               if (!chmaps)
+                       chmaps = snd_pcm_query_chmaps(spcm);
+               if (chmaps)
+                       err = find_matching_chmap(chmaps, tt_chmap, &chmap,
+                                                 &schannels);
                free(tt_chmap);
-               if (err < 0) {
+               if (chmaps && err < 0) {
+                       snd_pcm_free_chmaps(chmaps);
                        snd_pcm_close(spcm);
                        return err;
                }
@@ -1360,12 +1390,14 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
        err = _snd_pcm_route_determine_ttable(tt, &csize, &ssize, chmap);
        if (err < 0) {
                free(chmap);
+               snd_pcm_free_chmaps(chmaps);
                snd_pcm_close(spcm);
                return err;
        }
        ttable = malloc(csize * ssize * sizeof(snd_pcm_route_ttable_entry_t));
        if (ttable == NULL) {
                free(chmap);
+               snd_pcm_free_chmaps(chmaps);
                snd_pcm_close(spcm);
                return -ENOMEM;
        }
@@ -1374,6 +1406,7 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
        if (err < 0) {
                free(chmap);
                free(ttable);
+               snd_pcm_free_chmaps(chmaps);
                snd_pcm_close(spcm);
                return err;
        }
@@ -1385,9 +1418,13 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char 
*name,
        free(ttable);
        if (err < 0) {
                free(chmap);
+               snd_pcm_free_chmaps(chmaps);
                snd_pcm_close(spcm);
        } else {
-               ((snd_pcm_route_t*) (*pcmp)->private_data)->chmap = chmap;
+               snd_pcm_route_t *route = (*pcmp)->private_data;
+
+               route->chmap = chmap;
+               route->chmap_override = chmaps;
        }
 
        return err;
-- 
2.16.4

++++++ 0012-usecase-allow-indexes-also-for-modifier-names.patch ++++++
>From 341326c21ededb8c768c43ec2c9c7a80e7a26d35 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 3 Apr 2020 18:00:43 +0200
Subject: [PATCH 12/16] usecase: allow indexes also for modifier names

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 include/use-case.h | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/use-case.h b/include/use-case.h
index 27cb3fe1613f..c2ba79a9fdb1 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -120,7 +120,7 @@ extern "C" {
  * allowed. The names with numbers must be continuous. It is allowed to put
  * a whitespace between name and index (like 'Line 1') for the better
  * readability. The device names 'Line 1' and 'Line1' are equal for
- * thus purpose.
+ * this purpose.
  *
  * If EnableSequence/DisableSequence controls independent paths in the hardware
  * it is also recommended to split playback and capture UCM devices and use
@@ -149,6 +149,13 @@ extern "C" {
  * The use case modifier allows runtime configuration changes to deal with
  * asynchronous events.
  *
+ * If multiple modifiers with the same name exists, the number suffixes should
+ * be added to these names like 'Echo Reference 1','Echo Reference 2' etc.
+ * No number gaps are allowed. The names with numbers must be continuous.
+ * It is allowed to put a whitespace between name and index for the better
+ * readability. The modifier names 'Something 1' and 'Something1' are equal
+ * for this purpose.
+ *
  * e.g. to record a voice call :-
  *  1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call)
  *  2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required.
-- 
2.16.4

++++++ 0013-ucm-fix-the-device-remove-operation.patch ++++++
>From c9605484d165d2b707f78eef14a224b0b47ba322 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Mon, 6 Apr 2020 13:25:43 +0200
Subject: [PATCH 13/16] ucm: fix the device remove operation

- allow to remove device only from conflicting lists
- unify the error codes when the device is not found (ENODEV)

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/utils.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index 50b2a1df4a6a..d78ba91c3844 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -371,7 +371,7 @@ int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, 
const char *src,
                        return 0;
                }
        }
-       return -ENOENT;
+       return -ENODEV;
 }
 
 int uc_mgr_remove_from_dev_list(struct dev_list *dev_list, const char *name)
@@ -528,17 +528,22 @@ int uc_mgr_remove_device(struct use_case_verb *verb, 
const char *name)
 {
        struct use_case_device *device;
        struct list_head *pos, *npos;
+       int err, found = 0;
 
        list_for_each_safe(pos, npos, &verb->device_list) {
                device = list_entry(pos, struct use_case_device, list);
                if (strcmp(device->name, name) == 0) {
                        uc_mgr_free_device(device);
+                       found++;
                        continue;
                }
-               uc_mgr_remove_from_dev_list(&device->dev_list, name);
-               return 0;
+               err = uc_mgr_remove_from_dev_list(&device->dev_list, name);
+               if (err < 0 && err != -ENODEV)
+                       return err;
+               if (err == 0)
+                       found++;
        }
-       return -ENOENT;
+       return found == 0 ? -ENODEV : 0;
 }
 
 void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
-- 
2.16.4

++++++ 0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch ++++++
>From fb48ad9e4f6b84fd4ade689bd79e3a3c37d3e034 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Mon, 6 Apr 2020 17:20:24 +0200
Subject: [PATCH 14/16] ucm: fix copy-n-paste typo (RemoveDevice list)

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 0001e5953707..aca5ea8c3cea 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1176,7 +1176,7 @@ static int verb_device_management(struct use_case_verb 
*verb)
        }
 
        /* remove devices */
-       list_for_each(pos, &verb->rename_list) {
+       list_for_each(pos, &verb->remove_list) {
                dev = list_entry(pos, struct ucm_dev_name, list);
                err = uc_mgr_remove_device(verb, dev->name2);
                if (err < 0) {
-- 
2.16.4

++++++ 0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch ++++++
>From d12df1dc9c095bcb52d104e5a39043b56424e9d2 Mon Sep 17 00:00:00 2001
From: "[email protected]" <[email protected]>
Date: Wed, 15 Apr 2020 00:44:39 +0000
Subject: [PATCH 15/16] pcm: dmix: fix sw_params handling of timestamp types in
 direct plugins

In pcms using direct plugins (dmix/dsnoop/dshare), the timestamp type could
be different from the terminating hw plugin, then the kernel driver.

Be sure such pcms have plugins using consistently the same timestamp type.

signed-off-by: Sylvain Bertrand <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/conf/alsa.conf       |  1 +
 src/conf/pcm/dmix.conf   |  4 ++++
 src/conf/pcm/dsnoop.conf |  4 ++++
 src/pcm/pcm_direct.c     | 36 +++++++++++++++++++++++++++++++++++-
 src/pcm/pcm_direct.h     |  2 ++
 src/pcm/pcm_dmix.c       |  4 ++++
 src/pcm/pcm_dshare.c     |  4 ++++
 src/pcm/pcm_dsnoop.c     |  4 ++++
 src/pcm/pcm_local.h      |  2 ++
 9 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf
index a091b810f9ed..0e01c887dc28 100644
--- a/src/conf/alsa.conf
+++ b/src/conf/alsa.conf
@@ -69,6 +69,7 @@ defaults.pcm.minperiodtime 5000               # in us
 defaults.pcm.ipc_key 5678293
 defaults.pcm.ipc_gid audio
 defaults.pcm.ipc_perm 0660
+defaults.pcm.tstamp_type "default"
 defaults.pcm.dmix.max_periods 0
 defaults.pcm.dmix.channels 2
 defaults.pcm.dmix.rate 48000
diff --git a/src/conf/pcm/dmix.conf b/src/conf/pcm/dmix.conf
index 7fa5c8b2e20a..50e573da5d35 100644
--- a/src/conf/pcm/dmix.conf
+++ b/src/conf/pcm/dmix.conf
@@ -56,6 +56,10 @@ pcm.!dmix {
                @func refer
                name defaults.pcm.ipc_perm
        }
+       tstamp_type {
+               @func refer
+               name defaults.pcm.tstamp_type
+       }
        slave {
                pcm {
                        type hw
diff --git a/src/conf/pcm/dsnoop.conf b/src/conf/pcm/dsnoop.conf
index abbd44f7fd79..f4336e5f5e07 100644
--- a/src/conf/pcm/dsnoop.conf
+++ b/src/conf/pcm/dsnoop.conf
@@ -49,6 +49,10 @@ pcm.!dsnoop {
                @func refer
                name defaults.pcm.ipc_perm
        }
+       tstamp_type {
+               @func refer
+               name defaults.pcm.tstamp_type
+       }
        slave {
                pcm {
                        type hw
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
index 54d99005461b..aa60a47774ae 100644
--- a/src/pcm/pcm_direct.c
+++ b/src/pcm/pcm_direct.c
@@ -991,8 +991,11 @@ int snd_pcm_direct_hw_free(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
        return 0;
 }
 
-int snd_pcm_direct_sw_params(snd_pcm_t *pcm ATTRIBUTE_UNUSED, 
snd_pcm_sw_params_t * params ATTRIBUTE_UNUSED)
+int snd_pcm_direct_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
 {
+       if (params->tstamp_type != pcm->tstamp_type)
+               return -EINVAL;
+
        /* values are cached in the pcm structure */
        return 0;
 }
@@ -1318,6 +1321,15 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t 
*dmix, snd_pcm_t *spcm, str
                return ret;
        }
 
+       if (dmix->tstamp_type != -1) {
+               ret = snd_pcm_sw_params_set_tstamp_type(spcm, &sw_params,
+                                                       dmix->tstamp_type);
+               if (ret < 0) {
+                       SNDERR("unable to set tstamp type");
+                       return ret;
+               }
+       }
+
        if (dmix->type != SND_PCM_TYPE_DMIX &&
            dmix->type != SND_PCM_TYPE_DSHARE)
                goto __skip_silencing;
@@ -1878,6 +1890,7 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, 
snd_config_t *conf,
        rec->var_periodsize = 0;
        rec->direct_memory_access = 1;
        rec->hw_ptr_alignment = SND_PCM_HW_PTR_ALIGNMENT_AUTO;
+       rec->tstamp_type = -1;
 
        /* read defaults */
        if (snd_config_search(root, "defaults.pcm.dmix_max_periods", &n) >= 0) {
@@ -1941,6 +1954,27 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, 
snd_config_t *conf,
 
                        continue;
                }
+               if (strcmp(id, "tstamp_type") == 0) {
+                       const char *str;
+                       err = snd_config_get_string(n, &str);
+                       if (err < 0) {
+                               SNDERR("Invalid type for %s", id);
+                               return -EINVAL;
+                       }
+                       if (strcmp(str, "default") == 0)
+                               rec->tstamp_type = -1;
+                       else if (strcmp(str, "gettimeofday") == 0)
+                               rec->tstamp_type = 
SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY;
+                       else if (strcmp(str, "monotonic") == 0)
+                               rec->tstamp_type = 
SND_PCM_TSTAMP_TYPE_MONOTONIC;
+                       else if (strcmp(str, "monotonic_raw") == 0)
+                               rec->tstamp_type = 
SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW;
+                       else {
+                               SNDERR("The field tstamp_type is invalid : %s", 
str);
+                               return -EINVAL;
+                       }
+                       continue;
+               }
                if (strcmp(id, "ipc_gid") == 0) {
                        char *group;
                        char *endp;
diff --git a/src/pcm/pcm_direct.h b/src/pcm/pcm_direct.h
index 221edbe16879..8a236970a3a1 100644
--- a/src/pcm/pcm_direct.h
+++ b/src/pcm/pcm_direct.h
@@ -173,6 +173,7 @@ struct snd_pcm_direct {
        unsigned int recoveries;        /* mirror of executed recoveries on 
slave */
        int direct_memory_access;       /* use arch-optimized buffer RW */
        snd_pcm_direct_hw_ptr_alignment_t hw_ptr_alignment;
+       int tstamp_type;                /* cached from conf, can be -1(default) 
on top of real types */
        union {
                struct {
                        int shmid_sum;                  /* IPC global sum ring 
buffer memory identification */
@@ -357,6 +358,7 @@ struct snd_pcm_direct_open_conf {
        int var_periodsize;
        int direct_memory_access;
        snd_pcm_direct_hw_ptr_alignment_t hw_ptr_alignment;
+       int tstamp_type;
        snd_config_t *slave;
        snd_config_t *bindings;
 };
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index d533f40c5892..843fa3168756 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -1038,6 +1038,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
        dmix->ipc_key = opts->ipc_key;
        dmix->ipc_perm = opts->ipc_perm;
        dmix->ipc_gid = opts->ipc_gid;
+       dmix->tstamp_type = opts->tstamp_type;
        dmix->semid = -1;
        dmix->shmid = -1;
 
@@ -1237,6 +1238,9 @@ pcm.name {
                                # roundup
                                # rounddown
                                # auto (default)
+       tstamp_type STR         # timestamp type
+                               # STR can be one of the below strings :
+                               # default, gettimeofday, monotonic, 
monotonic_raw
        slave STR
        # or
        slave {                 # Slave definition
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
index 59448cfb5883..6a99452b80fb 100644
--- a/src/pcm/pcm_dshare.c
+++ b/src/pcm/pcm_dshare.c
@@ -723,6 +723,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
        dshare->ipc_key = opts->ipc_key;
        dshare->ipc_perm = opts->ipc_perm;
        dshare->ipc_gid = opts->ipc_gid;
+       dshare->tstamp_type = opts->tstamp_type;
        dshare->semid = -1;
        dshare->shmid = -1;
 
@@ -929,6 +930,9 @@ pcm.name {
                # roundup
                # rounddown
                # auto (default)
+       tstamp_type STR         # timestamp type
+                               # STR can be one of the below strings :
+                               # default, gettimeofday, monotonic, 
monotonic_raw
        slave STR
        # or
        slave {                 # Slave definition
diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
index 24f472c72c8e..c64df381e225 100644
--- a/src/pcm/pcm_dsnoop.c
+++ b/src/pcm/pcm_dsnoop.c
@@ -591,6 +591,7 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
        dsnoop->ipc_key = opts->ipc_key;
        dsnoop->ipc_perm = opts->ipc_perm;
        dsnoop->ipc_gid = opts->ipc_gid;
+       dsnoop->tstamp_type = opts->tstamp_type;
        dsnoop->semid = -1;
        dsnoop->shmid = -1;
 
@@ -780,6 +781,9 @@ pcm.name {
                # roundup
                # rounddown
                # auto (default)
+       tstamp_type STR         # timestamp type
+                               # STR can be one of the below strings :
+                               # default, gettimeofday, monotonic, 
monotonic_raw
        slave STR
        # or
        slave {                 # Slave definition
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
index 05ed935f1f16..89d4125b875d 100644
--- a/src/pcm/pcm_local.h
+++ b/src/pcm/pcm_local.h
@@ -928,6 +928,8 @@ int 
INTERNAL(snd_pcm_hw_params_set_buffer_size_last)(snd_pcm_t *pcm, snd_pcm_hw_
 
 int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t 
*params, snd_pcm_tstamp_t val);
 int INTERNAL(snd_pcm_sw_params_get_tstamp_mode)(const snd_pcm_sw_params_t 
*params, snd_pcm_tstamp_t *val);
+int snd_pcm_sw_params_set_tstamp_type(snd_pcm_t *pcm, snd_pcm_sw_params_t 
*params, snd_pcm_tstamp_type_t val);
+int snd_pcm_sw_params_get_tstamp_type(const snd_pcm_sw_params_t *params, 
snd_pcm_tstamp_type_t *val);
 int snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm, snd_pcm_sw_params_t 
*params, snd_pcm_uframes_t val);
 int INTERNAL(snd_pcm_sw_params_get_avail_min)(const snd_pcm_sw_params_t 
*params, snd_pcm_uframes_t *val);
 int snd_pcm_sw_params_set_start_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t 
*params, snd_pcm_uframes_t val);
-- 
2.16.4

++++++ 0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch ++++++
>From c996c9f52ced83a6f7b837fdc742e9b23e53a8a2 Mon Sep 17 00:00:00 2001
From: Ivan Mironov <[email protected]>
Date: Fri, 27 Mar 2020 00:46:45 +0500
Subject: [PATCH 16/16] conf: USB-Audio: Fix S/PDIF output of ASUS Xonar AE

ASUS Xonar AE is a PCI-Express card containing USB controller:

        USB controller [0c03]: ASMedia Technology Inc. ASM1042A USB 3.0 Host 
Controller [1b21:1142]

and the actual USB sound card:

        ID 0b05:180f ASUSTek Computer, Inc. XONAR SOUND CARD

As other Xonar USB sound cards, it uses second device for digital
output.

Signed-off-by: Ivan Mironov <[email protected]>
Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/conf/cards/USB-Audio.conf | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index 89811086db1d..3f4c421b7e2c 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -40,6 +40,7 @@ USB-Audio.pcm.iec958_device {
        "USB Sound Blaster HD" 1
        "Xonar U7" 1
        "ASUS XONAR U5" 1
+       "XONAR SOUND CARD" 1
        
        # The below don't have digital in/out, so prevent them from being 
opened.
        "Andrea PureAudio USB-SA Headset" 999
-- 
2.16.4





Reply via email to