diff options
author | Jaroslav Kysela <perex@perex.cz> | 2020-05-14 17:12:08 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2020-05-14 18:19:20 +0200 |
commit | 4bea8fe3a73cd2df8dcad1c8a14c35bab7b21073 (patch) | |
tree | d9a5fc5a07adfdf41166726f1619e4eef6517cbe /alsactl | |
parent | 598488c4af555c31c234ea2e88e52cb39a2c045a (diff) | |
download | alsa-utils-4bea8fe3a73cd2df8dcad1c8a14c35bab7b21073.tar.gz |
alsactl: add initial support for UCM init
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'alsactl')
-rw-r--r-- | alsactl/Makefile.am | 4 | ||||
-rw-r--r-- | alsactl/alsactl.h | 1 | ||||
-rw-r--r-- | alsactl/init_parse.c | 6 | ||||
-rw-r--r-- | alsactl/init_ucm.c | 40 |
4 files changed, 49 insertions, 2 deletions
diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am index e9ab2eb..c1031ac 100644 --- a/alsactl/Makefile.am +++ b/alsactl/Makefile.am @@ -9,8 +9,8 @@ EXTRA_DIST=alsactl.1 alsactl_init.xml AM_CFLAGS = -D_GNU_SOURCE -alsactl_SOURCES=alsactl.c state.c lock.c utils.c init_parse.c daemon.c \ - monitor.c +alsactl_SOURCES=alsactl.c state.c lock.c utils.c init_parse.c init_ucm.c \ + daemon.c monitor.c alsactl_CFLAGS=$(AM_CFLAGS) -D__USE_GNU \ -DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" \ diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h index 69b539c..6e96e78 100644 --- a/alsactl/alsactl.h +++ b/alsactl/alsactl.h @@ -25,6 +25,7 @@ void dbg_(const char *fcn, long line, const char *fmt, ...); #endif int init(const char *file, const char *cardname); +int init_ucm(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); diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c index 12bffa5..f176a7a 100644 --- a/alsactl/init_parse.c +++ b/alsactl/init_parse.c @@ -1762,6 +1762,9 @@ int init(const char *filename, const char *cardname) break; } first = 0; + err = init_ucm(card); + if (err == 0) + continue; err = init_space(&space, card); if (err == 0) { space->rootdir = new_root_dir(filename); @@ -1784,6 +1787,9 @@ int init(const char *filename, const char *cardname) error("Cannot find soundcard '%s'...", cardname); goto error; } + err = init_ucm(card); + if (err == 0) + return 0; memset(&space, 0, sizeof(space)); err = init_space(&space, card); if (err == 0) { diff --git a/alsactl/init_ucm.c b/alsactl/init_ucm.c new file mode 100644 index 0000000..833a1f9 --- /dev/null +++ b/alsactl/init_ucm.c @@ -0,0 +1,40 @@ +/* + * Advanced Linux Sound Architecture Control Program - UCM Initialization + * Copyright (c) by Jaroslav Kysela <perex@perex.cz> + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include <alsa/use-case.h> + +/* + * Keep it as simple as possible. Execute commands from the SectionOnce only. + */ +int init_ucm(int cardno) +{ + snd_use_case_mgr_t *uc_mgr; + char id[32]; + int err; + + snprintf(id, sizeof(id), "hw:%d", cardno); + err = snd_use_case_mgr_open(&uc_mgr, id); + if (err < 0) + return err; + err = snd_use_case_set(uc_mgr, "_once", NULL); + snd_use_case_mgr_close(uc_mgr); + return err; +} |