kselftest: alsa: Use private alsa-lib configuration in mixer test
authorJaroslav Kysela <perex@perex.cz>
Fri, 10 Dec 2021 18:54:10 +0000 (18:54 +0000)
committerTakashi Iwai <tiwai@suse.de>
Sun, 12 Dec 2021 09:04:30 +0000 (10:04 +0100)
As mentined by Takashi Sakamoto, the system-wide alsa-lib configuration
may override the standard device declarations. This patch use the private
alsa-lib configuration to set the predictable environment.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20211208095209.1772296-1-perex@perex.cz
[Restructure version test to keep the preprocessor happy -- broonie]
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20211210185410.740009-4-broonie@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
tools/testing/selftests/alsa/mixer-test.c

index f65a904..b798a76 100644 (file)
@@ -46,22 +46,74 @@ struct ctl_data {
        struct ctl_data *next;
 };
 
+static const char *alsa_config =
+"ctl.hw {\n"
+"      @args [ CARD ]\n"
+"      @args.CARD.type string\n"
+"      type hw\n"
+"      card $CARD\n"
+"}\n"
+;
+
 int num_cards = 0;
 int num_controls = 0;
 struct card_data *card_list = NULL;
 struct ctl_data *ctl_list = NULL;
 
+#ifdef SND_LIB_VER
+#if SND_LIB_VERSION >= SND_LIB_VER(1, 2, 6)
+#define LIB_HAS_LOAD_STRING
+#endif
+#endif
+
+#ifndef LIB_HAS_LOAD_STRING
+int snd_config_load_string(snd_config_t **config, const char *s, size_t size)
+{
+       snd_input_t *input;
+       snd_config_t *dst;
+       int err;
+
+       assert(config && s);
+       if (size == 0)
+               size = strlen(s);
+       err = snd_input_buffer_open(&input, s, size);
+       if (err < 0)
+               return err;
+       err = snd_config_top(&dst);
+       if (err < 0) {
+               snd_input_close(input);
+               return err;
+       }
+       err = snd_config_load(dst, input);
+       snd_input_close(input);
+       if (err < 0) {
+               snd_config_delete(dst);
+               return err;
+       }
+       *config = dst;
+       return 0;
+}
+#endif
+
 void find_controls(void)
 {
        char name[32];
        int card, ctl, err;
        struct card_data *card_data;
        struct ctl_data *ctl_data;
+       snd_config_t *config;
 
        card = -1;
        if (snd_card_next(&card) < 0 || card < 0)
                return;
 
+       err = snd_config_load_string(&config, alsa_config, strlen(alsa_config));
+       if (err < 0) {
+               ksft_print_msg("Unable to parse custom alsa-lib configuration: %s\n",
+                              snd_strerror(err));
+               ksft_exit_fail();
+       }
+
        while (card >= 0) {
                sprintf(name, "hw:%d", card);
 
@@ -69,7 +121,7 @@ void find_controls(void)
                if (!card_data)
                        ksft_exit_fail_msg("Out of memory\n");
 
-               err = snd_ctl_open(&card_data->handle, name, 0);
+               err = snd_ctl_open_lconf(&card_data->handle, name, 0, config);
                if (err < 0) {
                        ksft_print_msg("Failed to get hctl for card %d: %s\n",
                                       card, snd_strerror(err));
@@ -137,6 +189,8 @@ void find_controls(void)
                        break;
                }
        }
+
+       snd_config_delete(config);
 }
 
 /*