]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsactl: add initial support for UCM init
authorJaroslav Kysela <perex@perex.cz>
Thu, 14 May 2020 15:12:08 +0000 (17:12 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 14 May 2020 16:19:20 +0000 (18:19 +0200)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsactl/Makefile.am
alsactl/alsactl.h
alsactl/init_parse.c
alsactl/init_ucm.c [new file with mode: 0644]

index e9ab2eb28bbfb89c6afa6d4674ffc1c209d51349..c1031ac818aa05bafda542d3850ca6946e2de108 100644 (file)
@@ -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\" \
index 69b539ca6be04f22ccfe138c5ea9c8d1e315a6f2..6e96e78b0cd315c7409d0e400edbc7aa53c34eb9 100644 (file)
@@ -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);
index 12bffa5b006d3c7376f72a2a4a9c8d48910e77ca..f176a7a2d00574c558ef5f51bf9893679cf4bbc9 100644 (file)
@@ -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 (file)
index 0000000..833a1f9
--- /dev/null
@@ -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;
+}