|
Packit Service |
a9274b |
/*
|
|
Packit Service |
a9274b |
* Advanced Linux Sound Architecture Control Program
|
|
Packit Service |
a9274b |
* Copyright (c) by Abramo Bagnara <abramo@alsa-project.org>
|
|
Packit Service |
a9274b |
* Jaroslav Kysela <perex@perex.cz>
|
|
Packit Service |
a9274b |
*
|
|
Packit Service |
a9274b |
*
|
|
Packit Service |
a9274b |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a9274b |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a9274b |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit Service |
a9274b |
* (at your option) any later version.
|
|
Packit Service |
a9274b |
*
|
|
Packit Service |
a9274b |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
a9274b |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a9274b |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
a9274b |
* GNU General Public License for more details.
|
|
Packit Service |
a9274b |
*
|
|
Packit Service |
a9274b |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
a9274b |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
a9274b |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
a9274b |
*
|
|
Packit Service |
a9274b |
*/
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
#include "aconfig.h"
|
|
Packit Service |
a9274b |
#include "version.h"
|
|
Packit Service |
a9274b |
#include <getopt.h>
|
|
Packit Service |
a9274b |
#include <stdarg.h>
|
|
Packit Service |
a9274b |
#include <stdio.h>
|
|
Packit Service |
a9274b |
#include <assert.h>
|
|
Packit Service |
a9274b |
#include <errno.h>
|
|
Packit Service |
a9274b |
#include <syslog.h>
|
|
Packit Service |
a9274b |
#include <sched.h>
|
|
Packit Service |
a9274b |
#include <alsa/asoundlib.h>
|
|
Packit Service |
a9274b |
#include "alsactl.h"
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
#ifndef SYS_ASOUNDRC
|
|
Packit Service |
a9274b |
#define SYS_ASOUNDRC "/var/lib/alsa/asound.state"
|
|
Packit Service |
a9274b |
#endif
|
|
Packit Service |
a9274b |
#ifndef SYS_PIDFILE
|
|
Packit Service |
a9274b |
#define SYS_PIDFILE "/var/run/alsactl.pid"
|
|
Packit Service |
a9274b |
#endif
|
|
Packit Service |
a9274b |
#ifndef SYS_LOCKPATH
|
|
Packit Service |
a9274b |
#define SYS_LOCKPATH "/var/lock"
|
|
Packit Service |
a9274b |
#endif
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
int debugflag = 0;
|
|
Packit Service |
a9274b |
int force_restore = 1;
|
|
Packit Service |
a9274b |
int ignore_nocards = 0;
|
|
Packit Service |
a9274b |
int do_lock = 0;
|
|
Packit Service |
a9274b |
int use_syslog = 0;
|
|
Packit Service |
a9274b |
char *command;
|
|
Packit Service |
a9274b |
char *statefile = NULL;
|
|
Packit Service |
a9274b |
char *lockfile = SYS_LOCKFILE;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
#define TITLE 0x0100
|
|
Packit Service |
a9274b |
#define HEADER 0x0200
|
|
Packit Service |
a9274b |
#define FILEARG 0x0400
|
|
Packit Service |
a9274b |
#define ENVARG 0x0800
|
|
Packit Service |
a9274b |
#define INTARG 0x1000
|
|
Packit Service |
a9274b |
#define EMPCMD 0x2000
|
|
Packit Service |
a9274b |
#define CARDCMD 0x4000
|
|
Packit Service |
a9274b |
#define KILLCMD 0x8000
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
struct arg {
|
|
Packit Service |
a9274b |
int sarg;
|
|
Packit Service |
a9274b |
char *larg;
|
|
Packit Service |
a9274b |
char *comment;
|
|
Packit Service |
a9274b |
};
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
static struct arg args[] = {
|
|
Packit Service |
a9274b |
{ TITLE, NULL, "Usage: alsactl <options> command" },
|
|
Packit Service |
a9274b |
{ HEADER, NULL, "global options:" },
|
|
Packit Service |
a9274b |
{ 'h', "help", "this help" },
|
|
Packit Service |
a9274b |
{ 'd', "debug", "debug mode" },
|
|
Packit Service |
a9274b |
{ 'v', "version", "print version of this program" },
|
|
Packit Service |
a9274b |
{ HEADER, NULL, "Available state options:" },
|
|
Packit Service |
a9274b |
{ FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
|
|
Packit Service |
a9274b |
{ 'l', "lock", "use file locking to serialize concurrent access" },
|
|
Packit Service |
a9274b |
{ 'L', "no-lock", "do not use file locking to serialize concurrent access" },
|
|
Packit Service |
a9274b |
{ FILEARG | 'O', "lock-state-file", "state lock file path (default " SYS_LOCKFILE ")" },
|
|
Packit Service |
a9274b |
{ 'F', "force", "try to restore the matching controls as much as possible" },
|
|
Packit Service |
a9274b |
{ 0, NULL, " (default mode)" },
|
|
Packit Service |
a9274b |
{ 'g', "ignore", "ignore 'No soundcards found' error" },
|
|
Packit Service |
a9274b |
{ 'P', "pedantic", "do not restore mismatching controls (old default)" },
|
|
Packit Service |
a9274b |
{ 'I', "no-init-fallback", "" },
|
|
Packit Service |
a9274b |
{ 0, NULL, "don't initialize even if restore fails" },
|
|
Packit Service |
a9274b |
{ FILEARG | 'r', "runstate", "save restore and init state to this file (only errors)" },
|
|
Packit Service |
a9274b |
{ 0, NULL, " default settings is 'no file set'" },
|
|
Packit Service |
a9274b |
{ 'R', "remove", "remove runstate file at first, otherwise append errors" },
|
|
Packit Service |
a9274b |
{ INTARG | 'p', "period", "store period in seconds for the daemon command" },
|
|
Packit Service |
a9274b |
{ FILEARG | 'e', "pid-file", "pathname for the process id (daemon mode)" },
|
|
Packit Service |
a9274b |
{ HEADER, NULL, "Available init options:" },
|
|
Packit Service |
a9274b |
{ ENVARG | 'E', "env", "set environment variable for init phase (NAME=VALUE)" },
|
|
Packit Service |
a9274b |
{ FILEARG | 'i', "initfile", "main configuation file for init phase" },
|
|
Packit Service |
a9274b |
{ 0, NULL, " (default " DATADIR "/init/00main)" },
|
|
Packit Service |
a9274b |
{ 'b', "background", "run daemon in background" },
|
|
Packit Service |
a9274b |
{ 's', "syslog", "use syslog for messages" },
|
|
Packit Service |
a9274b |
{ INTARG | 'n', "nice", "set the process priority (see 'man nice')" },
|
|
Packit Service |
a9274b |
{ 'c', "sched-idle", "set the process scheduling policy to idle (SCHED_IDLE)" },
|
|
Packit Service |
a9274b |
#ifdef HAVE_ALSA_USE_CASE_H
|
|
Packit Service |
a9274b |
{ 'D', "ucm-defaults", "execute also the UCM 'defaults' section" },
|
|
Packit Service |
a9274b |
{ 'U', "no-ucm", "don't init with UCM" },
|
|
Packit Service |
a9274b |
#endif
|
|
Packit Service |
a9274b |
{ HEADER, NULL, "Available commands:" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "store", "save current driver setup for one or each soundcards" },
|
|
Packit Service |
a9274b |
{ EMPCMD, NULL, " to configuration file" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "restore", "load current driver setup for one or each soundcards" },
|
|
Packit Service |
a9274b |
{ EMPCMD, NULL, " from configuration file" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "nrestore", "like restore, but notify the daemon to rescan soundcards" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "init", "initialize driver to a default state" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "daemon", "store state periodically for one or each soundcards" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "rdaemon", "like daemon but do the state restore at first" },
|
|
Packit Service |
a9274b |
{ KILLCMD, "kill", "notify daemon to quit, rescan or save_and_quit" },
|
|
Packit Service |
a9274b |
{ CARDCMD, "monitor", "monitor control events" },
|
|
Packit Service |
a9274b |
{ 0, NULL, NULL }
|
|
Packit Service |
a9274b |
};
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
static void help(void)
|
|
Packit Service |
a9274b |
{
|
|
Packit Service |
a9274b |
struct arg *n = args, *a;
|
|
Packit Service |
a9274b |
char *larg, sa[4], buf[32];
|
|
Packit Service |
a9274b |
int sarg;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
sa[0] = '-';
|
|
Packit Service |
a9274b |
sa[2] = ',';
|
|
Packit Service |
a9274b |
sa[3] = '\0';
|
|
Packit Service |
a9274b |
while (n->comment) {
|
|
Packit Service |
a9274b |
a = n;
|
|
Packit Service |
a9274b |
n++;
|
|
Packit Service |
a9274b |
sarg = a->sarg;
|
|
Packit Service |
a9274b |
if (sarg & (HEADER|TITLE)) {
|
|
Packit Service |
a9274b |
printf("%s%s\n", (sarg & HEADER) != 0 ? "\n" : "",
|
|
Packit Service |
a9274b |
a->comment);
|
|
Packit Service |
a9274b |
continue;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
buf[0] = '\0';
|
|
Packit Service |
a9274b |
larg = a->larg;
|
|
Packit Service |
a9274b |
if (sarg & (EMPCMD|CARDCMD|KILLCMD)) {
|
|
Packit Service |
a9274b |
if (sarg & CARDCMD)
|
|
Packit Service |
a9274b |
strcat(buf, "<card>");
|
|
Packit Service |
a9274b |
else if (sarg & KILLCMD)
|
|
Packit Service |
a9274b |
strcat(buf, "<cmd>");
|
|
Packit Service |
a9274b |
printf(" %-8s %-6s %s\n", larg ? larg : "",
|
|
Packit Service |
a9274b |
buf, a->comment);
|
|
Packit Service |
a9274b |
continue;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
sa[1] = a->sarg;
|
|
Packit Service |
a9274b |
sprintf(buf, "%s%s%s", sa[1] ? sa : "",
|
|
Packit Service |
a9274b |
larg ? "--" : "", larg ? larg : "");
|
|
Packit Service |
a9274b |
if (sarg & ENVARG)
|
|
Packit Service |
a9274b |
strcat(buf, " #=#");
|
|
Packit Service |
a9274b |
else if (sarg & (FILEARG|INTARG))
|
|
Packit Service |
a9274b |
strcat(buf, " #");
|
|
Packit Service |
a9274b |
printf(" %-15s %s\n", buf, a->comment);
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
#define NO_NICE (-100000)
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
static void do_nice(int use_nice, int sched_idle)
|
|
Packit Service |
a9274b |
{
|
|
Packit Service |
a9274b |
struct sched_param sched_param;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
if (use_nice != NO_NICE && nice(use_nice) < 0)
|
|
Packit Service |
a9274b |
error("nice(%i): %s", use_nice, strerror(errno));
|
|
Packit Service |
a9274b |
if (sched_idle) {
|
|
Packit Service |
a9274b |
if (sched_getparam(0, &sched_param) >= 0) {
|
|
Packit Service |
a9274b |
sched_param.sched_priority = 0;
|
|
Packit Service |
a9274b |
if (sched_setscheduler(0, SCHED_IDLE, &sched_param) < 0)
|
|
Packit Service |
a9274b |
error("sched_setparam failed: %s", strerror(errno));
|
|
Packit Service |
a9274b |
} else {
|
|
Packit Service |
a9274b |
error("sched_getparam failed: %s", strerror(errno));
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
int main(int argc, char *argv[])
|
|
Packit Service |
a9274b |
{
|
|
Packit Service |
a9274b |
static const char *const devfiles[] = {
|
|
Packit Service |
a9274b |
"/dev/snd/controlC",
|
|
Packit Service |
a9274b |
"/dev/snd/pcmC",
|
|
Packit Service |
a9274b |
"/dev/snd/midiC",
|
|
Packit Service |
a9274b |
"/dev/snd/hwC",
|
|
Packit Service |
a9274b |
NULL
|
|
Packit Service |
a9274b |
};
|
|
Packit Service |
a9274b |
char *cfgfile = SYS_ASOUNDRC;
|
|
Packit Service |
a9274b |
char *initfile = DATADIR "/init/00main";
|
|
Packit Service |
a9274b |
char *pidfile = SYS_PIDFILE;
|
|
Packit Service |
a9274b |
char *cardname, ncardname[16];
|
|
Packit Service |
a9274b |
char *cmd;
|
|
Packit Service |
a9274b |
const char *const *tmp;
|
|
Packit Service |
a9274b |
int removestate = 0;
|
|
Packit Service |
a9274b |
int init_fallback = 1; /* new default behavior */
|
|
Packit Service |
a9274b |
int period = 5*60;
|
|
Packit Service |
a9274b |
int background = 0;
|
|
Packit Service |
a9274b |
int daemoncmd = 0;
|
|
Packit Service |
a9274b |
int use_nice = NO_NICE;
|
|
Packit Service |
a9274b |
int sched_idle = 0;
|
|
Packit Service |
a9274b |
int initflags = 0;
|
|
Packit Service |
a9274b |
struct arg *a;
|
|
Packit Service |
a9274b |
struct option *o;
|
|
Packit Service |
a9274b |
int i, j, k, res;
|
|
Packit Service |
a9274b |
struct option *long_option;
|
|
Packit Service |
a9274b |
char *short_option;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
long_option = calloc(ARRAY_SIZE(args), sizeof(struct option));
|
|
Packit Service |
a9274b |
if (long_option == NULL)
|
|
Packit Service |
a9274b |
exit(EXIT_FAILURE);
|
|
Packit Service |
a9274b |
short_option = malloc(128);
|
|
Packit Service |
a9274b |
if (short_option == NULL) {
|
|
Packit Service |
a9274b |
free(long_option);
|
|
Packit Service |
a9274b |
exit(EXIT_FAILURE);
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
for (i = j = k = 0; i < ARRAY_SIZE(args); i++) {
|
|
Packit Service |
a9274b |
a = &args[i];
|
|
Packit Service |
a9274b |
if ((a->sarg & 0xff) == 0)
|
|
Packit Service |
a9274b |
continue;
|
|
Packit Service |
a9274b |
o = &long_option[j];
|
|
Packit Service |
a9274b |
o->name = a->larg;
|
|
Packit Service |
a9274b |
o->has_arg = (a->sarg & (ENVARG|FILEARG|INTARG)) != 0;
|
|
Packit Service |
a9274b |
o->flag = NULL;
|
|
Packit Service |
a9274b |
o->val = a->sarg & 0xff;
|
|
Packit Service |
a9274b |
j++;
|
|
Packit Service |
a9274b |
short_option[k++] = o->val;
|
|
Packit Service |
a9274b |
if (o->has_arg)
|
|
Packit Service |
a9274b |
short_option[k++] = ':';
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
short_option[k] = '\0';
|
|
Packit Service |
a9274b |
command = argv[0];
|
|
Packit Service |
a9274b |
while (1) {
|
|
Packit Service |
a9274b |
int c;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
if ((c = getopt_long(argc, argv, short_option, long_option,
|
|
Packit Service |
a9274b |
NULL)) < 0)
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
switch (c) {
|
|
Packit Service |
a9274b |
case 'h':
|
|
Packit Service |
a9274b |
help();
|
|
Packit Service |
a9274b |
res = EXIT_SUCCESS;
|
|
Packit Service |
a9274b |
goto out;
|
|
Packit Service |
a9274b |
case 'f':
|
|
Packit Service |
a9274b |
cfgfile = optarg;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'l':
|
|
Packit Service |
a9274b |
do_lock = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'L':
|
|
Packit Service |
a9274b |
do_lock = -1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'O':
|
|
Packit Service |
a9274b |
lockfile = optarg;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'F':
|
|
Packit Service |
a9274b |
force_restore = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'g':
|
|
Packit Service |
a9274b |
ignore_nocards = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'E':
|
|
Packit Service |
a9274b |
if (putenv(optarg)) {
|
|
Packit Service |
a9274b |
fprintf(stderr, "environment string '%s' is wrong\n", optarg);
|
|
Packit Service |
a9274b |
res = EXIT_FAILURE;
|
|
Packit Service |
a9274b |
goto out;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'i':
|
|
Packit Service |
a9274b |
initfile = optarg;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'I':
|
|
Packit Service |
a9274b |
init_fallback = 0;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'D':
|
|
Packit Service |
a9274b |
initflags |= FLAG_UCM_DEFAULTS;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'U':
|
|
Packit Service |
a9274b |
initflags |= FLAG_UCM_DISABLED;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'r':
|
|
Packit Service |
a9274b |
statefile = optarg;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'R':
|
|
Packit Service |
a9274b |
removestate = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'P':
|
|
Packit Service |
a9274b |
force_restore = 0;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'p':
|
|
Packit Service |
a9274b |
period = atoi(optarg);
|
|
Packit Service |
a9274b |
if (period < 10)
|
|
Packit Service |
a9274b |
period = 5*60;
|
|
Packit Service |
a9274b |
else if (period > 24*60*60)
|
|
Packit Service |
a9274b |
period = 24*60*60;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'e':
|
|
Packit Service |
a9274b |
pidfile = optarg;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'b':
|
|
Packit Service |
a9274b |
background = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 's':
|
|
Packit Service |
a9274b |
use_syslog = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'n':
|
|
Packit Service |
a9274b |
use_nice = atoi(optarg);
|
|
Packit Service |
a9274b |
if (use_nice < -20)
|
|
Packit Service |
a9274b |
use_nice = -20;
|
|
Packit Service |
a9274b |
else if (use_nice > 19)
|
|
Packit Service |
a9274b |
use_nice = 19;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'c':
|
|
Packit Service |
a9274b |
sched_idle = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'd':
|
|
Packit Service |
a9274b |
debugflag = 1;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
case 'v':
|
|
Packit Service |
a9274b |
printf("alsactl version " SND_UTIL_VERSION_STR "\n");
|
|
Packit Service |
a9274b |
res = EXIT_SUCCESS;
|
|
Packit Service |
a9274b |
goto out;
|
|
Packit Service |
a9274b |
case '?': // error msg already printed
|
|
Packit Service |
a9274b |
help();
|
|
Packit Service |
a9274b |
res = EXIT_FAILURE;
|
|
Packit Service |
a9274b |
goto out;
|
|
Packit Service |
a9274b |
default: // should never happen
|
|
Packit Service |
a9274b |
fprintf(stderr,
|
|
Packit Service |
a9274b |
"Invalid option '%c' (%d) not handled??\n", c, c);
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
free(short_option);
|
|
Packit Service |
a9274b |
short_option = NULL;
|
|
Packit Service |
a9274b |
free(long_option);
|
|
Packit Service |
a9274b |
long_option = NULL;
|
|
Packit Service |
a9274b |
if (argc - optind <= 0) {
|
|
Packit Service |
a9274b |
fprintf(stderr, "alsactl: Specify command...\n");
|
|
Packit Service |
a9274b |
res = 0;
|
|
Packit Service |
a9274b |
goto out;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
cardname = argc - optind > 1 ? argv[optind + 1] : NULL;
|
|
Packit Service |
a9274b |
for (tmp = devfiles; cardname != NULL && *tmp != NULL; tmp++) {
|
|
Packit Service |
a9274b |
int len = strlen(*tmp);
|
|
Packit Service |
a9274b |
if (!strncmp(cardname, *tmp, len)) {
|
|
Packit Service |
a9274b |
long l = strtol(cardname + len, NULL, 0);
|
|
Packit Service |
a9274b |
sprintf(ncardname, "%li", l);
|
|
Packit Service |
a9274b |
cardname = ncardname;
|
|
Packit Service |
a9274b |
break;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
/* the global system file should be always locked */
|
|
Packit Service |
a9274b |
if (strcmp(cfgfile, SYS_ASOUNDRC) == 0 && do_lock >= 0)
|
|
Packit Service |
a9274b |
do_lock = 1;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
/* when running in background, use syslog for reports */
|
|
Packit Service |
a9274b |
if (background) {
|
|
Packit Service |
a9274b |
use_syslog = 1;
|
|
Packit Service |
a9274b |
daemon(0, 0);
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
cmd = argv[optind];
|
|
Packit Service |
a9274b |
daemoncmd = strcmp(cmd, "daemon") == 0 || strcmp(cmd, "rdaemon") == 0;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
if (use_syslog) {
|
|
Packit Service |
a9274b |
openlog("alsactl", LOG_CONS|LOG_PID, LOG_DAEMON);
|
|
Packit Service |
a9274b |
if (daemoncmd)
|
|
Packit Service |
a9274b |
syslog(LOG_INFO, "alsactl " SND_UTIL_VERSION_STR " daemon started");
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
snd_lib_error_set_handler(error_handler);
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
if (!strcmp(cmd, "init")) {
|
|
Packit Service |
a9274b |
res = init(initfile, initflags, cardname);
|
|
Packit Service |
a9274b |
snd_config_update_free_global();
|
|
Packit Service |
a9274b |
} else if (!strcmp(cmd, "store")) {
|
|
Packit Service |
a9274b |
res = save_state(cfgfile, cardname);
|
|
Packit Service |
a9274b |
} else if (!strcmp(cmd, "restore") ||
|
|
Packit Service |
a9274b |
!strcmp(cmd, "rdaemon") ||
|
|
Packit Service |
a9274b |
!strcmp(cmd, "nrestore")) {
|
|
Packit Service |
a9274b |
if (removestate)
|
|
Packit Service |
a9274b |
remove(statefile);
|
|
Packit Service |
a9274b |
res = load_state(cfgfile, initfile, initflags, cardname, init_fallback);
|
|
Packit Service |
a9274b |
if (!strcmp(cmd, "rdaemon")) {
|
|
Packit Service |
a9274b |
do_nice(use_nice, sched_idle);
|
|
Packit Service |
a9274b |
res = state_daemon(cfgfile, cardname, period, pidfile);
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
if (!strcmp(cmd, "nrestore"))
|
|
Packit Service |
a9274b |
res = state_daemon_kill(pidfile, "rescan");
|
|
Packit Service |
a9274b |
} else if (!strcmp(cmd, "daemon")) {
|
|
Packit Service |
a9274b |
do_nice(use_nice, sched_idle);
|
|
Packit Service |
a9274b |
res = state_daemon(cfgfile, cardname, period, pidfile);
|
|
Packit Service |
a9274b |
} else if (!strcmp(cmd, "kill")) {
|
|
Packit Service |
a9274b |
res = state_daemon_kill(pidfile, cardname);
|
|
Packit Service |
a9274b |
} else if (!strcmp(cmd, "monitor")) {
|
|
Packit Service |
a9274b |
res = monitor(cardname);
|
|
Packit Service |
a9274b |
} else {
|
|
Packit Service |
a9274b |
fprintf(stderr, "alsactl: Unknown command '%s'...\n", cmd);
|
|
Packit Service |
a9274b |
res = -ENODEV;
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
snd_config_update_free_global();
|
|
Packit Service |
a9274b |
if (use_syslog) {
|
|
Packit Service |
a9274b |
if (daemoncmd)
|
|
Packit Service |
a9274b |
syslog(LOG_INFO, "alsactl daemon stopped");
|
|
Packit Service |
a9274b |
closelog();
|
|
Packit Service |
a9274b |
}
|
|
Packit Service |
a9274b |
return res < 0 ? -res : 0;
|
|
Packit Service |
a9274b |
|
|
Packit Service |
a9274b |
out:
|
|
Packit Service |
a9274b |
free(short_option);
|
|
Packit Service |
a9274b |
free(long_option);
|
|
Packit Service |
a9274b |
return res;
|
|
Packit Service |
a9274b |
}
|