alsactl: add -D argument to execute also the UCM defaults section

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2020-05-14 19:34:18 +02:00
parent 8fb4016a17
commit b68e854d28
6 changed files with 37 additions and 15 deletions

View file

@ -142,6 +142,11 @@ Set the process priority (see 'man nice')
\fI\-c, \-\-sched-idle\fP \fI\-c, \-\-sched-idle\fP
Set the process scheduling policy to idle (SCHED_IDLE). 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 .SH FILES
\fI/var/lib/alsa/asound.state\fP (or whatever file you specify with the \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 \fB\-f\fP flag) is used to store current settings for your

View file

@ -96,6 +96,7 @@ static struct arg args[] = {
{ 's', "syslog", "use syslog for messages" }, { 's', "syslog", "use syslog for messages" },
{ INTARG | 'n', "nice", "set the process priority (see 'man nice')" }, { INTARG | 'n', "nice", "set the process priority (see 'man nice')" },
{ 'c', "sched-idle", "set the process scheduling policy to idle (SCHED_IDLE)" }, { '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:" }, { HEADER, NULL, "Available commands:" },
{ CARDCMD, "store", "save current driver setup for one or each soundcards" }, { CARDCMD, "store", "save current driver setup for one or each soundcards" },
{ EMPCMD, NULL, " to configuration file" }, { EMPCMD, NULL, " to configuration file" },
@ -191,6 +192,7 @@ int main(int argc, char *argv[])
int daemoncmd = 0; int daemoncmd = 0;
int use_nice = NO_NICE; int use_nice = NO_NICE;
int sched_idle = 0; int sched_idle = 0;
int initflags = 0;
struct arg *a; struct arg *a;
struct option *o; struct option *o;
int i, j, k, res; int i, j, k, res;
@ -263,6 +265,9 @@ int main(int argc, char *argv[])
case 'I': case 'I':
init_fallback = 0; init_fallback = 0;
break; break;
case 'D':
initflags |= FLAG_UCM_DEFAULTS;
break;
case 'r': case 'r':
statefile = optarg; statefile = optarg;
break; break;
@ -357,7 +362,7 @@ int main(int argc, char *argv[])
snd_lib_error_set_handler(error_handler); snd_lib_error_set_handler(error_handler);
if (!strcmp(cmd, "init")) { if (!strcmp(cmd, "init")) {
res = init(initfile, cardname); res = init(initfile, initflags, cardname);
snd_config_update_free_global(); snd_config_update_free_global();
} else if (!strcmp(cmd, "store")) { } else if (!strcmp(cmd, "store")) {
res = save_state(cfgfile, cardname); res = save_state(cfgfile, cardname);
@ -366,7 +371,7 @@ int main(int argc, char *argv[])
!strcmp(cmd, "nrestore")) { !strcmp(cmd, "nrestore")) {
if (removestate) if (removestate)
remove(statefile); remove(statefile);
res = load_state(cfgfile, initfile, cardname, init_fallback); res = load_state(cfgfile, initfile, initflags, cardname, init_fallback);
if (!strcmp(cmd, "rdaemon")) { if (!strcmp(cmd, "rdaemon")) {
do_nice(use_nice, sched_idle); do_nice(use_nice, sched_idle);
res = state_daemon(cfgfile, cardname, period, pidfile); res = state_daemon(cfgfile, cardname, period, pidfile);

View 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) #define dbg(args...) do { dbg_(__func__, __LINE__, ##args); } while (0)
#endif #endif
int init(const char *file, const char *cardname); #define FLAG_UCM_DEFAULTS (1<<0)
int init_ucm(int cardno);
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_lock(const char *file, int timeout);
int state_unlock(int fd, const char *file); int state_unlock(int fd, const char *file);
int save_state(const char *file, const char *cardname); int save_state(const char *file, const char *cardname);
int load_state(const char *file, const char *initfile, const char *cardname, int load_state(const char *file, const char *initfile, int initflags,
int do_init); const char *cardname, int do_init);
int power(const char *argv[], int argc); int power(const char *argv[], int argc);
int monitor(const char *name); int monitor(const char *name);
int state_daemon(const char *file, const char *cardname, int period, int state_daemon(const char *file, const char *cardname, int period,

View file

@ -1742,7 +1742,7 @@ static int parse(struct space *space, const char *filename)
return err ? err : -abs(space->exit_code); 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; struct space *space;
int err = 0, lasterr = 0, card, first; int err = 0, lasterr = 0, card, first;
@ -1762,7 +1762,7 @@ int init(const char *filename, const char *cardname)
break; break;
} }
first = 0; first = 0;
err = init_ucm(card); err = init_ucm(flags, card);
if (err == 0) if (err == 0)
continue; continue;
err = init_space(&space, card); err = init_space(&space, card);
@ -1787,7 +1787,7 @@ int init(const char *filename, const char *cardname)
error("Cannot find soundcard '%s'...", cardname); error("Cannot find soundcard '%s'...", cardname);
goto error; goto error;
} }
err = init_ucm(card); err = init_ucm(flags, card);
if (err == 0) if (err == 0)
return 0; return 0;
memset(&space, 0, sizeof(space)); memset(&space, 0, sizeof(space));

View file

@ -19,12 +19,14 @@
* *
*/ */
#include <stddef.h>
#include "alsactl.h"
#include <alsa/use-case.h> #include <alsa/use-case.h>
/* /*
* Keep it as simple as possible. Execute commands from the SectionOnce only. * 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; snd_use_case_mgr_t *uc_mgr;
char id[32]; char id[32];
@ -35,6 +37,14 @@ int init_ucm(int cardno)
if (err < 0) if (err < 0)
return err; return err;
err = snd_use_case_set(uc_mgr, "_once", NULL); 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); snd_use_case_mgr_close(uc_mgr);
return err; return err;
} }

View file

@ -1645,8 +1645,8 @@ out:
return err; return err;
} }
int load_state(const char *file, const char *initfile, const char *cardname, int load_state(const char *file, const char *initfile, int initflags,
int do_init) const char *cardname, int do_init)
{ {
int err, finalerr = 0; int err, finalerr = 0;
snd_config_t *config; snd_config_t *config;
@ -1704,7 +1704,7 @@ single:
if (!do_init) if (!do_init)
break; break;
sprintf(cardname1, "%i", card); sprintf(cardname1, "%i", card);
err = init(initfile, cardname1); err = init(initfile, initflags, cardname1);
if (err < 0) { if (err < 0) {
finalerr = err; finalerr = err;
initfailed(card, "init", err); initfailed(card, "init", err);
@ -1743,7 +1743,7 @@ single:
/* do a check if controls matches state file */ /* do a check if controls matches state file */
if (do_init && set_controls(card, config, 0)) { if (do_init && set_controls(card, config, 0)) {
sprintf(cardname1, "%i", card); sprintf(cardname1, "%i", card);
err = init(initfile, cardname1); err = init(initfile, initflags, cardname1);
if (err < 0) { if (err < 0) {
initfailed(card, "init", err); initfailed(card, "init", err);
finalerr = err; finalerr = err;
@ -1766,7 +1766,7 @@ single:
} }
/* do a check if controls matches state file */ /* do a check if controls matches state file */
if (do_init && set_controls(cardno, config, 0)) { if (do_init && set_controls(cardno, config, 0)) {
err = init(initfile, cardname); err = init(initfile, initflags, cardname);
if (err < 0) { if (err < 0) {
initfailed(cardno, "init", err); initfailed(cardno, "init", err);
finalerr = err; finalerr = err;