From 4bea8fe3a73cd2df8dcad1c8a14c35bab7b21073 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 14 May 2020 17:12:08 +0200 Subject: [PATCH] alsactl: add initial support for UCM init Signed-off-by: Jaroslav Kysela --- alsactl/Makefile.am | 4 ++-- alsactl/alsactl.h | 1 + alsactl/init_parse.c | 6 ++++++ alsactl/init_ucm.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 alsactl/init_ucm.c 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 + * + * + * 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 + +/* + * 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; +} -- 2.47.1