Add -I option to alsactl

Add -I option to alsactl to take back the old restore behavior without
initialization.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2008-11-13 09:28:43 +01:00
parent bbd71560bc
commit 1797b2c290
4 changed files with 26 additions and 6 deletions

View file

@ -60,6 +60,15 @@ and do not set an error exit code when soundcards are not installed.
Used with restore command. Don't restore mismatching control elements. Used with restore command. Don't restore mismatching control elements.
This option was the old default behavior. This option was the old default behavior.
.TP
\fI\-I, \-\-no\-init\-fallback\fP
Don't initialize cards if restore fails. Since version 1.0.18,
\fBalsactl\fP tries to initialize the card with the restore operation
as default. But this can cause incompatibility with the older version.
The caller may expect that the state won't be touched if no state file
exists. This option takes the restore behavior back to the older
version by suppressing the initialization.
.TP .TP
\fI\-r, \-\-runstate\fP \fI\-r, \-\-runstate\fP
Save restore and init state to this file. The file will contain only errors. Save restore and init state to this file. The file will contain only errors.

View file

@ -51,6 +51,8 @@ static void help(void)
printf(" (default mode)\n"); printf(" (default mode)\n");
printf(" -g,--ignore ignore 'No soundcards found' error\n"); printf(" -g,--ignore ignore 'No soundcards found' error\n");
printf(" -P,--pedantic do not restore mismatching controls (old default)\n"); printf(" -P,--pedantic do not restore mismatching controls (old default)\n");
printf(" -I,--no-init-fallback\n"
" don't initialize even if restore fails\n");
printf(" -r,--runstate # save restore and init state to this file (only errors)\n"); printf(" -r,--runstate # save restore and init state to this file (only errors)\n");
printf(" default settings is 'no file set'\n"); printf(" default settings is 'no file set'\n");
printf(" -R,--remove remove runstate file at first, otherwise append errors\n"); printf(" -R,--remove remove runstate file at first, otherwise append errors\n");
@ -76,6 +78,7 @@ int main(int argc, char *argv[])
{"file", 1, NULL, 'f'}, {"file", 1, NULL, 'f'},
{"env", 1, NULL, 'E'}, {"env", 1, NULL, 'E'},
{"initfile", 1, NULL, 'i'}, {"initfile", 1, NULL, 'i'},
{"no-init-fallback", 0, NULL, 'I'},
{"force", 0, NULL, 'F'}, {"force", 0, NULL, 'F'},
{"ignore", 0, NULL, 'g'}, {"ignore", 0, NULL, 'g'},
{"pedantic", 0, NULL, 'P'}, {"pedantic", 0, NULL, 'P'},
@ -96,6 +99,7 @@ int main(int argc, char *argv[])
char *initfile = DATADIR "/init/00main"; char *initfile = DATADIR "/init/00main";
char *cardname, **tmp, ncardname[16]; char *cardname, **tmp, ncardname[16];
int removestate = 0; int removestate = 0;
int init_fallback = 1; /* new default behavior */
int res; int res;
command = argv[0]; command = argv[0];
@ -126,6 +130,9 @@ int main(int argc, char *argv[])
case 'i': case 'i':
initfile = optarg; initfile = optarg;
break; break;
case 'I':
init_fallback = 0;
break;
case 'r': case 'r':
statefile = optarg; statefile = optarg;
break; break;
@ -173,7 +180,7 @@ int main(int argc, char *argv[])
} else if (!strcmp(argv[optind], "restore")) { } else if (!strcmp(argv[optind], "restore")) {
if (removestate) if (removestate)
remove(statefile); remove(statefile);
res = load_state(cfgfile, initfile, cardname); res = load_state(cfgfile, initfile, cardname, init_fallback);
} else { } else {
fprintf(stderr, "alsactl: Unknown command '%s'...\n", fprintf(stderr, "alsactl: Unknown command '%s'...\n",
argv[optind]); argv[optind]);

View file

@ -68,7 +68,8 @@ extern char *statefile;
int init(const char *file, const char *cardname); int init(const char *file, const char *cardname);
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, const char *cardname,
int do_init);
int power(const char *argv[], int argc); int power(const char *argv[], int argc);
int generate_names(const char *cfgfile); int generate_names(const char *cfgfile);

View file

@ -1548,7 +1548,8 @@ int save_state(const char *file, const char *cardname)
return 0; return 0;
} }
int load_state(const char *file, const char *initfile, const char *cardname) int load_state(const char *file, const char *initfile, const char *cardname,
int do_init)
{ {
int err, finalerr = 0; int err, finalerr = 0;
snd_config_t *config; snd_config_t *config;
@ -1586,6 +1587,8 @@ int load_state(const char *file, const char *initfile, const char *cardname)
if (card < 0) if (card < 0)
break; break;
first = 0; first = 0;
if (!do_init)
break;
sprintf(cardname1, "%i", card); sprintf(cardname1, "%i", card);
err = init(initfile, cardname1); err = init(initfile, cardname1);
if (err < 0) { if (err < 0) {
@ -1594,7 +1597,7 @@ int load_state(const char *file, const char *initfile, const char *cardname)
} }
initfailed(card, "restore"); initfailed(card, "restore");
} }
if (!first) if (first)
finalerr = 0; /* no cards, no error code */ finalerr = 0; /* no cards, no error code */
return finalerr; return finalerr;
} }
@ -1621,7 +1624,7 @@ int load_state(const char *file, const char *initfile, const char *cardname)
} }
first = 0; first = 0;
/* do a check if controls matches state file */ /* do a check if controls matches state file */
if (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, cardname1);
if (err < 0) { if (err < 0) {
@ -1644,7 +1647,7 @@ int load_state(const char *file, const char *initfile, const char *cardname)
return -ENODEV; return -ENODEV;
} }
/* do a check if controls matches state file */ /* do a check if controls matches state file */
if (set_controls(cardno, config, 0)) { if (do_init && set_controls(cardno, config, 0)) {
err = init(initfile, cardname); err = init(initfile, cardname);
if (err < 0) { if (err < 0) {
initfailed(cardno, "init"); initfailed(cardno, "init");