1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file control/control_empty.c 3d5ac70f0Sopenharmony_ci * \ingroup Control_Plugins 4d5ac70f0Sopenharmony_ci * \brief Control Empty Plugin Interface 5d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz> 6d5ac70f0Sopenharmony_ci * \date 2021 7d5ac70f0Sopenharmony_ci */ 8d5ac70f0Sopenharmony_ci/* 9d5ac70f0Sopenharmony_ci * Control - Empty plugin 10d5ac70f0Sopenharmony_ci * Copyright (c) 2021 by Jaroslav Kysela <perex@perex.cz> 11d5ac70f0Sopenharmony_ci * 12d5ac70f0Sopenharmony_ci * 13d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 14d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 15d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 16d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 17d5ac70f0Sopenharmony_ci * 18d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 19d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 22d5ac70f0Sopenharmony_ci * 23d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 25d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26d5ac70f0Sopenharmony_ci * 27d5ac70f0Sopenharmony_ci */ 28d5ac70f0Sopenharmony_ci 29d5ac70f0Sopenharmony_ci#include "control_local.h" 30d5ac70f0Sopenharmony_ci 31d5ac70f0Sopenharmony_ci#ifndef PIC 32d5ac70f0Sopenharmony_ci/* entry for static linking */ 33d5ac70f0Sopenharmony_ciconst char *_snd_module_control_empty = ""; 34d5ac70f0Sopenharmony_ci#endif 35d5ac70f0Sopenharmony_ci 36d5ac70f0Sopenharmony_ci/*! \page control_plugins 37d5ac70f0Sopenharmony_ci 38d5ac70f0Sopenharmony_ci\section control_plugins_empty Plugin: Empty 39d5ac70f0Sopenharmony_ci 40d5ac70f0Sopenharmony_ciThis plugin just redirects the control device to another plugin. 41d5ac70f0Sopenharmony_ci 42d5ac70f0Sopenharmony_ci\code 43d5ac70f0Sopenharmony_cictl.name { 44d5ac70f0Sopenharmony_ci type empty # Empty Control 45d5ac70f0Sopenharmony_ci child STR # Slave name 46d5ac70f0Sopenharmony_ci # or 47d5ac70f0Sopenharmony_ci child { # Child definition 48d5ac70f0Sopenharmony_ci ... 49d5ac70f0Sopenharmony_ci } 50d5ac70f0Sopenharmony_ci} 51d5ac70f0Sopenharmony_ci\endcode 52d5ac70f0Sopenharmony_ci 53d5ac70f0Sopenharmony_ci\subsection control_plugins_empty_funcref Function reference 54d5ac70f0Sopenharmony_ci 55d5ac70f0Sopenharmony_ci<UL> 56d5ac70f0Sopenharmony_ci <LI>_snd_ctl_empty_open() 57d5ac70f0Sopenharmony_ci</UL> 58d5ac70f0Sopenharmony_ci 59d5ac70f0Sopenharmony_ci*/ 60d5ac70f0Sopenharmony_ci 61d5ac70f0Sopenharmony_ci/** 62d5ac70f0Sopenharmony_ci * \brief Creates a new Empty Control 63d5ac70f0Sopenharmony_ci * \param handlep Returns created Control handle 64d5ac70f0Sopenharmony_ci * \param name Name of Control 65d5ac70f0Sopenharmony_ci * \param root Root configuration node 66d5ac70f0Sopenharmony_ci * \param conf Configuration node with empty Control description 67d5ac70f0Sopenharmony_ci * \param mode Control mode 68d5ac70f0Sopenharmony_ci * \retval zero on success otherwise a negative error code 69d5ac70f0Sopenharmony_ci * \warning Using of this function might be dangerous in the sense 70d5ac70f0Sopenharmony_ci * of compatibility reasons. The prototype might be freely 71d5ac70f0Sopenharmony_ci * changed in future. 72d5ac70f0Sopenharmony_ci */ 73d5ac70f0Sopenharmony_ciint _snd_ctl_empty_open(snd_ctl_t **handlep, const char *name ATTRIBUTE_UNUSED, 74d5ac70f0Sopenharmony_ci snd_config_t *root, snd_config_t *conf, int mode) 75d5ac70f0Sopenharmony_ci{ 76d5ac70f0Sopenharmony_ci snd_config_t *child = NULL; 77d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 78d5ac70f0Sopenharmony_ci 79d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, conf) { 80d5ac70f0Sopenharmony_ci snd_config_t *n = snd_config_iterator_entry(i); 81d5ac70f0Sopenharmony_ci const char *id; 82d5ac70f0Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 83d5ac70f0Sopenharmony_ci continue; 84d5ac70f0Sopenharmony_ci if (_snd_conf_generic_id(id)) 85d5ac70f0Sopenharmony_ci continue; 86d5ac70f0Sopenharmony_ci if (strcmp(id, "child") == 0) { 87d5ac70f0Sopenharmony_ci child = n; 88d5ac70f0Sopenharmony_ci continue; 89d5ac70f0Sopenharmony_ci } 90d5ac70f0Sopenharmony_ci SNDERR("Unknown field %s", id); 91d5ac70f0Sopenharmony_ci return -EINVAL; 92d5ac70f0Sopenharmony_ci } 93d5ac70f0Sopenharmony_ci if (!child) { 94d5ac70f0Sopenharmony_ci SNDERR("child is not defined"); 95d5ac70f0Sopenharmony_ci return -EINVAL; 96d5ac70f0Sopenharmony_ci } 97d5ac70f0Sopenharmony_ci return _snd_ctl_open_named_child(handlep, name, root, child, mode, conf); 98d5ac70f0Sopenharmony_ci} 99d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 100d5ac70f0Sopenharmony_ciSND_DLSYM_BUILD_VERSION(_snd_ctl_empty_open, SND_CONTROL_DLSYM_VERSION); 101d5ac70f0Sopenharmony_ci#endif 102