]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Fix parsing config with multiple hw_configs
authorKirill Marinushkin <k.marinushkin@gmail.com>
Wed, 21 Mar 2018 19:08:04 +0000 (20:08 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 21 Mar 2018 19:10:38 +0000 (20:10 +0100)
Currently, if the config file includes several hw_configs sections,
parse_hw_config_refs() returns after parsing only the first section.

For example, the following config, based on
alsa-lib/src/conf/topology/broadwell/broadwell.conf, is parsed incorrectly:

~~~~
SectionHWConfig."CodecHWConfig" {
        id "1"
        format "I2S"            # physical audio format.
        bclk   "master"         # Platform is master of bit clock
        fsync  "master"         # platform is master of fsync
}

SectionHWConfig."CodecHWConfig2" {
        id "2"
        format "AC97"
}

SectionLink."Codec" {

        # used for binding to the physical link
        id "0"

        hw_configs [
                "CodecHWConfig"
                "CodecHWConfig2"
        ]

        default_hw_conf_id "2"
}
~~~~

Signed-off-by: Kirill Marinushkin <k.marinushkin@gmail.com>
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.com>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/topology/pcm.c

index 58cee31d1b27f18032b10709e87e3de38d67314b..d38366770d855233e6e1f9c4706fc6111d54733a 100644 (file)
@@ -882,6 +882,7 @@ static int parse_hw_config_refs(snd_tplg_t *tplg, snd_config_t *cfg,
        /* refer to a list of HW configs */
        snd_config_for_each(i, next, cfg) {
                const char *val;
+               int err;
 
                n = snd_config_iterator_entry(i);
                if (snd_config_get_string(n, &val) < 0)
@@ -893,7 +894,9 @@ static int parse_hw_config_refs(snd_tplg_t *tplg, snd_config_t *cfg,
                }
 
                link->num_hw_configs++;
-               return tplg_ref_add(elem, SND_TPLG_TYPE_HW_CONFIG, val);
+               err = tplg_ref_add(elem, SND_TPLG_TYPE_HW_CONFIG, val);
+               if (err < 0)
+                       return err;
        }
 
        return 0;