mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-12-23 03:46:31 +01:00
alsactl: add -D argument to execute also the UCM defaults section
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
8fb4016a17
commit
b68e854d28
6 changed files with 37 additions and 15 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue