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