From 4594d6ec9e90db61af0b11dd117d96d6c9a81a7d5ee4fb4b474356248539e5eb Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 23 Apr 2020 12:31:46 +0000 Subject: [PATCH] Accepting request 796086 from home:tiwai:branches:multimedia:libs - 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 OBS-URL: https://build.opensuse.org/request/show/796086 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=271 --- ...dd-back-asrc-to-widget_map-in-dapm.c.patch | 28 +++ ...he-index-syntax-for-the-device-names.patch | 29 +++ 0008-ucm-fix-uc_mgr_scan_master_configs.patch | 31 +++ ...r-the-direction-from-the-upper-level.patch | 31 +++ ...amehint-for-pcm.front-and-pcm.iec958.patch | 43 ++++ ...pcm-add-chmap-option-to-route-plugin.patch | 216 ++++++++++++++++ ...llow-indexes-also-for-modifier-names.patch | 40 +++ ...-ucm-fix-the-device-remove-operation.patch | 55 ++++ ...-copy-n-paste-typo-RemoveDevice-list.patch | 26 ++ ...params-handling-of-timestamp-types-i.patch | 238 ++++++++++++++++++ ...o-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch | 37 +++ alsa.changes | 18 ++ alsa.spec | 22 ++ 13 files changed, 814 insertions(+) create mode 100644 0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch create mode 100644 0007-ucm-clarify-the-index-syntax-for-the-device-names.patch create mode 100644 0008-ucm-fix-uc_mgr_scan_master_configs.patch create mode 100644 0009-namehint-remember-the-direction-from-the-upper-level.patch create mode 100644 0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch create mode 100644 0011-pcm-add-chmap-option-to-route-plugin.patch create mode 100644 0012-usecase-allow-indexes-also-for-modifier-names.patch create mode 100644 0013-ucm-fix-the-device-remove-operation.patch create mode 100644 0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch create mode 100644 0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch create mode 100644 0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch diff --git a/0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch b/0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch new file mode 100644 index 0000000..d99aae1 --- /dev/null +++ b/0006-topology-add-back-asrc-to-widget_map-in-dapm.c.patch @@ -0,0 +1,28 @@ +From caf77a93cef5bda729bc33e0100cc0e769767389 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0007-ucm-clarify-the-index-syntax-for-the-device-names.patch b/0007-ucm-clarify-the-index-syntax-for-the-device-names.patch new file mode 100644 index 0000000..ebd787d --- /dev/null +++ b/0007-ucm-clarify-the-index-syntax-for-the-device-names.patch @@ -0,0 +1,29 @@ +From 79102bf264f8651692fe9435a4d1bb06aa022d55 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0008-ucm-fix-uc_mgr_scan_master_configs.patch b/0008-ucm-fix-uc_mgr_scan_master_configs.patch new file mode 100644 index 0000000..b250fb4 --- /dev/null +++ b/0008-ucm-fix-uc_mgr_scan_master_configs.patch @@ -0,0 +1,31 @@ +From 6137d263f3805c72781ea74b813b0e3754f5fc34 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0009-namehint-remember-the-direction-from-the-upper-level.patch b/0009-namehint-remember-the-direction-from-the-upper-level.patch new file mode 100644 index 0000000..611aca7 --- /dev/null +++ b/0009-namehint-remember-the-direction-from-the-upper-level.patch @@ -0,0 +1,31 @@ +From d434638a683c01bd6decf8f41863044055237a50 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch b/0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch new file mode 100644 index 0000000..3d6ad69 --- /dev/null +++ b/0010-conf-fix-namehint-for-pcm.front-and-pcm.iec958.patch @@ -0,0 +1,43 @@ +From bca39e99d0c2a270a71dad640983fb739dac8bdd Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0011-pcm-add-chmap-option-to-route-plugin.patch b/0011-pcm-add-chmap-option-to-route-plugin.patch new file mode 100644 index 0000000..8ffff5f --- /dev/null +++ b/0011-pcm-add-chmap-option-to-route-plugin.patch @@ -0,0 +1,216 @@ +From 3b46b03f099da2f39c205a25b3cc62ec688fe6b3 Mon Sep 17 00:00:00 2001 +From: Jonas Holmberg +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 +Signed-off-by: Takashi Iwai +--- + 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 + diff --git a/0012-usecase-allow-indexes-also-for-modifier-names.patch b/0012-usecase-allow-indexes-also-for-modifier-names.patch new file mode 100644 index 0000000..5e87207 --- /dev/null +++ b/0012-usecase-allow-indexes-also-for-modifier-names.patch @@ -0,0 +1,40 @@ +From 341326c21ededb8c768c43ec2c9c7a80e7a26d35 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0013-ucm-fix-the-device-remove-operation.patch b/0013-ucm-fix-the-device-remove-operation.patch new file mode 100644 index 0000000..e02fac7 --- /dev/null +++ b/0013-ucm-fix-the-device-remove-operation.patch @@ -0,0 +1,55 @@ +From c9605484d165d2b707f78eef14a224b0b47ba322 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch b/0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch new file mode 100644 index 0000000..07b8c5a --- /dev/null +++ b/0014-ucm-fix-copy-n-paste-typo-RemoveDevice-list.patch @@ -0,0 +1,26 @@ +From fb48ad9e4f6b84fd4ade689bd79e3a3c37d3e034 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +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 +--- + 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 + diff --git a/0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch b/0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch new file mode 100644 index 0000000..77275f6 --- /dev/null +++ b/0015-pcm-dmix-fix-sw_params-handling-of-timestamp-types-i.patch @@ -0,0 +1,238 @@ +From d12df1dc9c095bcb52d104e5a39043b56424e9d2 Mon Sep 17 00:00:00 2001 +From: "sylvain.bertrand@gmail.com" +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 +Signed-off-by: Takashi Iwai +--- + 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 + diff --git a/0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch b/0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch new file mode 100644 index 0000000..cae21ca --- /dev/null +++ b/0016-conf-USB-Audio-Fix-S-PDIF-output-of-ASUS-Xonar-AE.patch @@ -0,0 +1,37 @@ +From c996c9f52ced83a6f7b837fdc742e9b23e53a8a2 Mon Sep 17 00:00:00 2001 +From: Ivan Mironov +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 +Signed-off-by: Jaroslav Kysela +--- + 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 + diff --git a/alsa.changes b/alsa.changes index 6b98251..9584d58 100644 --- a/alsa.changes +++ b/alsa.changes @@ -1,3 +1,21 @@ +------------------------------------------------------------------- +Mon Apr 20 17:55:24 CEST 2020 - tiwai@suse.de + +- 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 + ------------------------------------------------------------------- Fri Mar 13 14:37:03 CET 2020 - tiwai@suse.de diff --git a/alsa.spec b/alsa.spec index 31a10a9..155f7a2 100644 --- a/alsa.spec +++ b/alsa.spec @@ -53,6 +53,17 @@ Patch2: 0002-conf-namehint-add-omit_noargs-to-the-hint-section.patch 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 @@ This package contains the library for ALSA topology support. %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