]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsactl: add -D argument to execute also the UCM defaults section
authorJaroslav Kysela <perex@perex.cz>
Thu, 14 May 2020 17:34:18 +0000 (19:34 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 14 May 2020 17:34:18 +0000 (19:34 +0200)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsactl/alsactl.1
alsactl/alsactl.c
alsactl/alsactl.h
alsactl/init_parse.c
alsactl/init_ucm.c
alsactl/state.c

index c515fdde7e2be4aa34f8d62364ceca05c0096b92..8423b822bc6f0529d40cae28721b1a34738d9dee 100644 (file)
@@ -142,6 +142,11 @@ Set the process priority (see 'man nice')
 \fI\-c, \-\-sched-idle\fP
 Set the process scheduling policy to idle (SCHED_IDLE).
 
+.TP
+\fI\-D, \-\-ucm-defaults\fP
+Execute also the 'defaults' section from the UCM configuration. The standard
+behaviour is to execute only 'once' section.
+
 .SH FILES
 \fI/var/lib/alsa/asound.state\fP (or whatever file you specify with the
 \fB\-f\fP flag) is used to store current settings for your
index 92ce2702dd7f73bbfcf755b98c4b45ff2e00a295..1971d4e53fdfa0a2f73b126a331cfbab5d481619 100644 (file)
@@ -96,6 +96,7 @@ static struct arg args[] = {
 { 's', "syslog", "use syslog for messages" },
 { INTARG | 'n', "nice", "set the process priority (see 'man nice')" },
 { 'c', "sched-idle", "set the process scheduling policy to idle (SCHED_IDLE)" },
+{ 'D', "ucm-defaults", "execute also the UCM 'defaults' section" },
 { HEADER, NULL, "Available commands:" },
 { CARDCMD, "store", "save current driver setup for one or each soundcards" },
 { EMPCMD, NULL, "  to configuration file" },
@@ -191,6 +192,7 @@ int main(int argc, char *argv[])
        int daemoncmd = 0;
        int use_nice = NO_NICE;
        int sched_idle = 0;
+       int initflags = 0;
        struct arg *a;
        struct option *o;
        int i, j, k, res;
@@ -263,6 +265,9 @@ int main(int argc, char *argv[])
                case 'I':
                        init_fallback = 0;
                        break;
+               case 'D':
+                       initflags |= FLAG_UCM_DEFAULTS;
+                       break;
                case 'r':
                        statefile = optarg;
                        break;
@@ -357,7 +362,7 @@ int main(int argc, char *argv[])
        snd_lib_error_set_handler(error_handler);
 
        if (!strcmp(cmd, "init")) {
-               res = init(initfile, cardname);
+               res = init(initfile, initflags, cardname);
                snd_config_update_free_global();
        } else if (!strcmp(cmd, "store")) {
                res = save_state(cfgfile, cardname);
@@ -366,7 +371,7 @@ int main(int argc, char *argv[])
                   !strcmp(cmd, "nrestore")) {
                if (removestate)
                        remove(statefile);
-               res = load_state(cfgfile, initfile, cardname, init_fallback);
+               res = load_state(cfgfile, initfile, initflags, cardname, init_fallback);
                if (!strcmp(cmd, "rdaemon")) {
                        do_nice(use_nice, sched_idle);
                        res = state_daemon(cfgfile, cardname, period, pidfile);
index 853a70125aef5f13949c55f180104cf6b7fb0fe4..2352f4c6a8bd2e774a72efb9431048b3371a9e16 100644 (file)
@@ -25,13 +25,15 @@ void error_handler(const char *file, int line, const char *function, int err, co
 #define dbg(args...) do { dbg_(__func__, __LINE__, ##args); }  while (0)
 #endif 
 
-int init(const char *file, const char *cardname);
-int init_ucm(int cardno);
+#define FLAG_UCM_DEFAULTS      (1<<0)
+
+int init(const char *file, int flags, const char *cardname);
+int init_ucm(int flags, int cardno);
 int state_lock(const char *file, int timeout);
 int state_unlock(int fd, const char *file);
 int save_state(const char *file, const char *cardname);
-int load_state(const char *file, const char *initfile, const char *cardname,
-              int do_init);
+int load_state(const char *file, const char *initfile, int initflags,
+              const char *cardname, int do_init);
 int power(const char *argv[], int argc);
 int monitor(const char *name);
 int state_daemon(const char *file, const char *cardname, int period,
index f176a7a2d00574c558ef5f51bf9893679cf4bbc9..4ece0677faa73ea1a6b137758a97d23f18c82f36 100644 (file)
@@ -1742,7 +1742,7 @@ static int parse(struct space *space, const char *filename)
        return err ? err : -abs(space->exit_code);
 }
 
-int init(const char *filename, const char *cardname)
+int init(const char *filename, int flags, const char *cardname)
 {
        struct space *space;
        int err = 0, lasterr = 0, card, first;
@@ -1762,7 +1762,7 @@ int init(const char *filename, const char *cardname)
                                break;
                        }
                        first = 0;
-                       err = init_ucm(card);
+                       err = init_ucm(flags, card);
                        if (err == 0)
                                continue;
                        err = init_space(&space, card);
@@ -1787,7 +1787,7 @@ int init(const char *filename, const char *cardname)
                        error("Cannot find soundcard '%s'...", cardname);
                        goto error;
                }
-               err = init_ucm(card);
+               err = init_ucm(flags, card);
                if (err == 0)
                        return 0;
                memset(&space, 0, sizeof(space));
index 833a1f941a803fd85b026297fa48d6c06158fd46..9c05300e4d2c5c3f21c0e9e4b009a106a125c0bc 100644 (file)
  *
  */
 
+#include <stddef.h>
+#include "alsactl.h"
 #include <alsa/use-case.h>
 
 /*
  * Keep it as simple as possible. Execute commands from the SectionOnce only.
  */
-int init_ucm(int cardno)
+int init_ucm(int flags, int cardno)
 {
        snd_use_case_mgr_t *uc_mgr;
        char id[32];
@@ -35,6 +37,14 @@ int init_ucm(int cardno)
        if (err < 0)
                return err;
        err = snd_use_case_set(uc_mgr, "_once", NULL);
+       if (err < 0)
+               goto _error;
+       if ((flags & FLAG_UCM_DEFAULTS) != 0) {
+               err = snd_use_case_set(uc_mgr, "_defaults", NULL);
+               if (err < 0)
+                       goto _error;
+       }
+_error:
        snd_use_case_mgr_close(uc_mgr);
        return err;
 }
index 22e0269fd30a95cca2b9f28ea3438f2ab0fd26ea..ea1d3bcaaddfe6dbf18d6726afe709add13eef05 100644 (file)
@@ -1645,8 +1645,8 @@ out:
        return err;
 }
 
-int load_state(const char *file, const char *initfile, const char *cardname,
-              int do_init)
+int load_state(const char *file, const char *initfile, int initflags,
+              const char *cardname, int do_init)
 {
        int err, finalerr = 0;
        snd_config_t *config;
@@ -1704,7 +1704,7 @@ single:
                        if (!do_init)
                                break;
                        sprintf(cardname1, "%i", card);
-                       err = init(initfile, cardname1);
+                       err = init(initfile, initflags, cardname1);
                        if (err < 0) {
                                finalerr = err;
                                initfailed(card, "init", err);
@@ -1743,7 +1743,7 @@ single:
                        /* do a check if controls matches state file */
                        if (do_init && set_controls(card, config, 0)) {
                                sprintf(cardname1, "%i", card);
-                               err = init(initfile, cardname1);
+                               err = init(initfile, initflags, cardname1);
                                if (err < 0) {
                                        initfailed(card, "init", err);
                                        finalerr = err;
@@ -1766,7 +1766,7 @@ single:
                }
                /* do a check if controls matches state file */
                if (do_init && set_controls(cardno, config, 0)) {
-                       err = init(initfile, cardname);
+                       err = init(initfile, initflags, cardname);
                        if (err < 0) {
                                initfailed(cardno, "init", err);
                                finalerr = err;