]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsaucm: do the implicit ucm open only when the command requires it
authorJaroslav Kysela <perex@perex.cz>
Sat, 9 Nov 2019 21:20:00 +0000 (22:20 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 9 Nov 2019 21:20:00 +0000 (22:20 +0100)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsaucm/usecase.c

index 532bac0d68ee3ab4c52a213db73745f42a942eab..48ee816cbfbffa0c6487e81800843653cfeb437d 100644 (file)
@@ -171,6 +171,54 @@ static int parse_line(struct context *context, char *line)
        return 0;
 }
 
+static void my_exit(struct context *context, int exitcode)
+{
+       if (context->uc_mgr)
+               snd_use_case_mgr_close(context->uc_mgr);
+       if (context->arga > 0)
+               free(context->argv);
+       if (context->card)
+               free(context->card);
+       if (context->batch)
+               free(context->batch);
+       free(context);
+       snd_config_update_free_global();
+       exit(exitcode);
+}
+
+static void do_initial_open(struct context *context)
+{
+       const char **list;
+       int err;
+
+       if (!context->no_open && context->card == NULL) {
+               err = snd_use_case_card_list(&list);
+               if (err < 0) {
+                       fprintf(stderr, "%s: unable to obtain card list: %s\n",
+                                       context->command, snd_strerror(err));
+                       my_exit(context, EXIT_FAILURE);
+               }
+               if (err == 0) {
+                       printf("No card found\n");
+                       my_exit(context, EXIT_SUCCESS);
+               }
+               context->card = strdup(list[0]);
+               snd_use_case_free_list(list, err);
+       }
+
+       /* open library */
+       if (!context->no_open) {
+               err = snd_use_case_mgr_open(&context->uc_mgr,
+                                           context->card);
+               if (err < 0) {
+                       fprintf(stderr,
+                               "%s: error failed to open sound card %s: %s\n",
+                               context->command, context->card, snd_strerror(err));
+                       my_exit(context, EXIT_FAILURE);
+               }
+       }
+}
+
 static int do_one(struct context *context, struct cmd *cmd, char **argv)
 {
        const char **list, *str;
@@ -178,6 +226,10 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv)
        int err, i, j, entries;
 
        if (cmd->opencard && context->uc_mgr == NULL) {
+               if (!context->no_open) {
+                       do_initial_open(context);
+                       context->no_open = 1;
+               }
                fprintf(stderr, "%s: command '%s' requires an open card\n",
                                context->command, cmd->id);
                return 0;
@@ -350,21 +402,6 @@ static int do_commands(struct context *context)
        return 0;
 }
 
-static void my_exit(struct context *context, int exitcode)
-{
-       if (context->uc_mgr)
-               snd_use_case_mgr_close(context->uc_mgr);
-       if (context->arga > 0)
-               free(context->argv);
-       if (context->card)
-               free(context->card);
-       if (context->batch)
-               free(context->batch);
-       free(context);
-       snd_config_update_free_global();
-       exit(exitcode);
-}
-
 enum {
        OPT_VERSION = 1,
 };
@@ -383,7 +420,6 @@ int main(int argc, char *argv[])
        };
        struct context *context;
        const char *command = argv[0];
-       const char **list;
        int c, err, option_index;
        char cmd[MAX_BUF];
        FILE *in;
@@ -423,32 +459,6 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (!context->no_open && context->card == NULL) {
-               err = snd_use_case_card_list(&list);
-               if (err < 0) {
-                       fprintf(stderr, "%s: unable to obtain card list: %s\n", command, snd_strerror(err));
-                       my_exit(context, EXIT_FAILURE);
-               }
-               if (err == 0) {
-                       printf("No card found\n");
-                       my_exit(context, EXIT_SUCCESS);
-               }
-               context->card = strdup(list[0]);
-               snd_use_case_free_list(list, err);
-       }
-
-       /* open library */
-       if (!context->no_open) {
-               err = snd_use_case_mgr_open(&context->uc_mgr,
-                                           context->card);
-               if (err < 0) {
-                       fprintf(stderr,
-                               "%s: error failed to open sound card %s: %s\n",
-                               command, context->card, snd_strerror(err));
-                       my_exit(context, EXIT_FAILURE);
-               }
-       }
-
        /* parse and execute any command line commands */
        if (argc > optind) {
                context->argv = argv + optind;