1d5ac70f0Sopenharmony_ci/**
2d5ac70f0Sopenharmony_ci * \file include/conf.h
3d5ac70f0Sopenharmony_ci * \brief Application interface library for the ALSA driver
4d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz>
5d5ac70f0Sopenharmony_ci * \author Abramo Bagnara <abramo@alsa-project.org>
6d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de>
7d5ac70f0Sopenharmony_ci * \date 1998-2001
8d5ac70f0Sopenharmony_ci *
9d5ac70f0Sopenharmony_ci * Application interface library for the ALSA driver
10d5ac70f0Sopenharmony_ci */
11d5ac70f0Sopenharmony_ci/*
12d5ac70f0Sopenharmony_ci *   This library is free software; you can redistribute it and/or modify
13d5ac70f0Sopenharmony_ci *   it under the terms of the GNU Lesser General Public License as
14d5ac70f0Sopenharmony_ci *   published by the Free Software Foundation; either version 2.1 of
15d5ac70f0Sopenharmony_ci *   the License, or (at your option) any later version.
16d5ac70f0Sopenharmony_ci *
17d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
18d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
19d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20d5ac70f0Sopenharmony_ci *   GNU Lesser General Public License for more details.
21d5ac70f0Sopenharmony_ci *
22d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU Lesser General Public
23d5ac70f0Sopenharmony_ci *   License along with this library; if not, write to the Free Software
24d5ac70f0Sopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25d5ac70f0Sopenharmony_ci *
26d5ac70f0Sopenharmony_ci */
27d5ac70f0Sopenharmony_ci
28d5ac70f0Sopenharmony_ci#ifndef __ALSA_CONF_H
29d5ac70f0Sopenharmony_ci#define __ALSA_CONF_H
30d5ac70f0Sopenharmony_ci
31d5ac70f0Sopenharmony_ci#ifdef __cplusplus
32d5ac70f0Sopenharmony_ciextern "C" {
33d5ac70f0Sopenharmony_ci#endif
34d5ac70f0Sopenharmony_ci
35d5ac70f0Sopenharmony_ci/**
36d5ac70f0Sopenharmony_ci *  \defgroup Configuration Configuration Interface
37d5ac70f0Sopenharmony_ci *  The configuration functions and types allow you to read, enumerate,
38d5ac70f0Sopenharmony_ci *  modify and write the contents of ALSA configuration files.
39d5ac70f0Sopenharmony_ci *  \{
40d5ac70f0Sopenharmony_ci */
41d5ac70f0Sopenharmony_ci
42d5ac70f0Sopenharmony_ci/** \brief \c dlsym version for the config evaluate callback. */
43d5ac70f0Sopenharmony_ci#define SND_CONFIG_DLSYM_VERSION_EVALUATE	_dlsym_config_evaluate_001
44d5ac70f0Sopenharmony_ci/** \brief \c dlsym version for the config hook callback. */
45d5ac70f0Sopenharmony_ci#define SND_CONFIG_DLSYM_VERSION_HOOK		_dlsym_config_hook_001
46d5ac70f0Sopenharmony_ci
47d5ac70f0Sopenharmony_ci/** \brief Configuration node type. */
48d5ac70f0Sopenharmony_citypedef enum _snd_config_type {
49d5ac70f0Sopenharmony_ci	/** Integer number. */
50d5ac70f0Sopenharmony_ci        SND_CONFIG_TYPE_INTEGER,
51d5ac70f0Sopenharmony_ci	/** 64-bit integer number. */
52d5ac70f0Sopenharmony_ci        SND_CONFIG_TYPE_INTEGER64,
53d5ac70f0Sopenharmony_ci	/** Real number. */
54d5ac70f0Sopenharmony_ci        SND_CONFIG_TYPE_REAL,
55d5ac70f0Sopenharmony_ci	/** Character string. */
56d5ac70f0Sopenharmony_ci        SND_CONFIG_TYPE_STRING,
57d5ac70f0Sopenharmony_ci        /** Pointer (runtime only, cannot be saved). */
58d5ac70f0Sopenharmony_ci        SND_CONFIG_TYPE_POINTER,
59d5ac70f0Sopenharmony_ci	/** Compound node. */
60d5ac70f0Sopenharmony_ci	SND_CONFIG_TYPE_COMPOUND = 1024
61d5ac70f0Sopenharmony_ci} snd_config_type_t;
62d5ac70f0Sopenharmony_ci
63d5ac70f0Sopenharmony_ci/**
64d5ac70f0Sopenharmony_ci * \brief Internal structure for a configuration node object.
65d5ac70f0Sopenharmony_ci *
66d5ac70f0Sopenharmony_ci * The ALSA library uses a pointer to this structure as a handle to a
67d5ac70f0Sopenharmony_ci * configuration node. Applications don't access its contents directly.
68d5ac70f0Sopenharmony_ci */
69d5ac70f0Sopenharmony_citypedef struct _snd_config snd_config_t;
70d5ac70f0Sopenharmony_ci/**
71d5ac70f0Sopenharmony_ci * \brief Type for a configuration compound iterator.
72d5ac70f0Sopenharmony_ci *
73d5ac70f0Sopenharmony_ci * The ALSA library uses this pointer type as a handle to a configuration
74d5ac70f0Sopenharmony_ci * compound iterator. Applications don't directly access the contents of
75d5ac70f0Sopenharmony_ci * the structure pointed to by this type.
76d5ac70f0Sopenharmony_ci */
77d5ac70f0Sopenharmony_citypedef struct _snd_config_iterator *snd_config_iterator_t;
78d5ac70f0Sopenharmony_ci/**
79d5ac70f0Sopenharmony_ci * \brief Internal structure for a configuration private update object.
80d5ac70f0Sopenharmony_ci *
81d5ac70f0Sopenharmony_ci * The ALSA library uses this structure to save private update information.
82d5ac70f0Sopenharmony_ci */
83d5ac70f0Sopenharmony_citypedef struct _snd_config_update snd_config_update_t;
84d5ac70f0Sopenharmony_ci
85d5ac70f0Sopenharmony_ciextern snd_config_t *snd_config;
86d5ac70f0Sopenharmony_ci
87d5ac70f0Sopenharmony_ciconst char *snd_config_topdir(void);
88d5ac70f0Sopenharmony_ci
89d5ac70f0Sopenharmony_ciint snd_config_top(snd_config_t **config);
90d5ac70f0Sopenharmony_ci
91d5ac70f0Sopenharmony_ciint snd_config_load(snd_config_t *config, snd_input_t *in);
92d5ac70f0Sopenharmony_ciint snd_config_load_string(snd_config_t **config, const char *s, size_t size);
93d5ac70f0Sopenharmony_ciint snd_config_load_override(snd_config_t *config, snd_input_t *in);
94d5ac70f0Sopenharmony_ciint snd_config_save(snd_config_t *config, snd_output_t *out);
95d5ac70f0Sopenharmony_ciint snd_config_update(void);
96d5ac70f0Sopenharmony_ciint snd_config_update_r(snd_config_t **top, snd_config_update_t **update, const char *path);
97d5ac70f0Sopenharmony_ciint snd_config_update_free(snd_config_update_t *update);
98d5ac70f0Sopenharmony_ciint snd_config_update_free_global(void);
99d5ac70f0Sopenharmony_ci
100d5ac70f0Sopenharmony_ciint snd_config_update_ref(snd_config_t **top);
101d5ac70f0Sopenharmony_civoid snd_config_ref(snd_config_t *top);
102d5ac70f0Sopenharmony_civoid snd_config_unref(snd_config_t *top);
103d5ac70f0Sopenharmony_ci
104d5ac70f0Sopenharmony_ciint snd_config_search(snd_config_t *config, const char *key,
105d5ac70f0Sopenharmony_ci		      snd_config_t **result);
106d5ac70f0Sopenharmony_ciint snd_config_searchv(snd_config_t *config,
107d5ac70f0Sopenharmony_ci		       snd_config_t **result, ...);
108d5ac70f0Sopenharmony_ciint snd_config_search_definition(snd_config_t *config,
109d5ac70f0Sopenharmony_ci				 const char *base, const char *key,
110d5ac70f0Sopenharmony_ci				 snd_config_t **result);
111d5ac70f0Sopenharmony_ci
112d5ac70f0Sopenharmony_ci/**
113d5ac70f0Sopenharmony_ci * \brief custom expansion callback
114d5ac70f0Sopenharmony_ci * \param[out] dst The function puts the handle to the new configuration
115d5ac70f0Sopenharmony_ci *                 node at the address specified by \a dst.
116d5ac70f0Sopenharmony_ci * \param[in] s string the string to be expanded
117d5ac70f0Sopenharmony_ci * \param[in] private_data Handle to the \c private_data node.
118d5ac70f0Sopenharmony_ci * \return A non-negative value if successful, otherwise a negative error code.
119d5ac70f0Sopenharmony_ci *
120d5ac70f0Sopenharmony_ci * Use a function of this type to define a custom expansion
121d5ac70f0Sopenharmony_ci */
122d5ac70f0Sopenharmony_citypedef int (*snd_config_expand_fcn_t)(snd_config_t **dst, const char *s, void *private_data);
123d5ac70f0Sopenharmony_ci
124d5ac70f0Sopenharmony_ciint snd_config_expand_custom(snd_config_t *config, snd_config_t *root,
125d5ac70f0Sopenharmony_ci			     snd_config_expand_fcn_t fcn, void *private_data,
126d5ac70f0Sopenharmony_ci			     snd_config_t **result);
127d5ac70f0Sopenharmony_ciint snd_config_expand(snd_config_t *config, snd_config_t *root,
128d5ac70f0Sopenharmony_ci		      const char *args, snd_config_t *private_data,
129d5ac70f0Sopenharmony_ci		      snd_config_t **result);
130d5ac70f0Sopenharmony_ciint snd_config_evaluate(snd_config_t *config, snd_config_t *root,
131d5ac70f0Sopenharmony_ci			snd_config_t *private_data, snd_config_t **result);
132d5ac70f0Sopenharmony_ciint snd_config_evaluate_string(snd_config_t **dst, const char *s,
133d5ac70f0Sopenharmony_ci			       snd_config_expand_fcn_t fcn, void *private_data);
134d5ac70f0Sopenharmony_ci
135d5ac70f0Sopenharmony_ciint snd_config_add(snd_config_t *config, snd_config_t *child);
136d5ac70f0Sopenharmony_ciint snd_config_add_before(snd_config_t *before, snd_config_t *child);
137d5ac70f0Sopenharmony_ciint snd_config_add_after(snd_config_t *after, snd_config_t *child);
138d5ac70f0Sopenharmony_ciint snd_config_remove(snd_config_t *config);
139d5ac70f0Sopenharmony_ciint snd_config_delete(snd_config_t *config);
140d5ac70f0Sopenharmony_ciint snd_config_delete_compound_members(const snd_config_t *config);
141d5ac70f0Sopenharmony_ciint snd_config_copy(snd_config_t **dst, snd_config_t *src);
142d5ac70f0Sopenharmony_ciint snd_config_substitute(snd_config_t *dst, snd_config_t *src);
143d5ac70f0Sopenharmony_ciint snd_config_merge(snd_config_t *dst, snd_config_t *src, int override);
144d5ac70f0Sopenharmony_ci
145d5ac70f0Sopenharmony_ciint snd_config_make(snd_config_t **config, const char *key,
146d5ac70f0Sopenharmony_ci		    snd_config_type_t type);
147d5ac70f0Sopenharmony_ciint snd_config_make_integer(snd_config_t **config, const char *key);
148d5ac70f0Sopenharmony_ciint snd_config_make_integer64(snd_config_t **config, const char *key);
149d5ac70f0Sopenharmony_ciint snd_config_make_real(snd_config_t **config, const char *key);
150d5ac70f0Sopenharmony_ciint snd_config_make_string(snd_config_t **config, const char *key);
151d5ac70f0Sopenharmony_ciint snd_config_make_pointer(snd_config_t **config, const char *key);
152d5ac70f0Sopenharmony_ciint snd_config_make_compound(snd_config_t **config, const char *key, int join);
153d5ac70f0Sopenharmony_ciint snd_config_make_path(snd_config_t **config, snd_config_t *root, const char *key,
154d5ac70f0Sopenharmony_ci			 int join, int override);
155d5ac70f0Sopenharmony_ci
156d5ac70f0Sopenharmony_ciint snd_config_imake_integer(snd_config_t **config, const char *key, const long value);
157d5ac70f0Sopenharmony_ciint snd_config_imake_integer64(snd_config_t **config, const char *key, const long long value);
158d5ac70f0Sopenharmony_ciint snd_config_imake_real(snd_config_t **config, const char *key, const double value);
159d5ac70f0Sopenharmony_ciint snd_config_imake_string(snd_config_t **config, const char *key, const char *ascii);
160d5ac70f0Sopenharmony_ciint snd_config_imake_safe_string(snd_config_t **config, const char *key, const char *ascii);
161d5ac70f0Sopenharmony_ciint snd_config_imake_pointer(snd_config_t **config, const char *key, const void *ptr);
162d5ac70f0Sopenharmony_ci
163d5ac70f0Sopenharmony_cisnd_config_type_t snd_config_get_type(const snd_config_t *config);
164d5ac70f0Sopenharmony_ciint snd_config_is_array(const snd_config_t *config);
165d5ac70f0Sopenharmony_ciint snd_config_is_empty(const snd_config_t *config);
166d5ac70f0Sopenharmony_ci
167d5ac70f0Sopenharmony_ciint snd_config_set_id(snd_config_t *config, const char *id);
168d5ac70f0Sopenharmony_ciint snd_config_set_integer(snd_config_t *config, long value);
169d5ac70f0Sopenharmony_ciint snd_config_set_integer64(snd_config_t *config, long long value);
170d5ac70f0Sopenharmony_ciint snd_config_set_real(snd_config_t *config, double value);
171d5ac70f0Sopenharmony_ciint snd_config_set_string(snd_config_t *config, const char *value);
172d5ac70f0Sopenharmony_ciint snd_config_set_ascii(snd_config_t *config, const char *ascii);
173d5ac70f0Sopenharmony_ciint snd_config_set_pointer(snd_config_t *config, const void *ptr);
174d5ac70f0Sopenharmony_ciint snd_config_get_id(const snd_config_t *config, const char **value);
175d5ac70f0Sopenharmony_ciint snd_config_get_integer(const snd_config_t *config, long *value);
176d5ac70f0Sopenharmony_ciint snd_config_get_integer64(const snd_config_t *config, long long *value);
177d5ac70f0Sopenharmony_ciint snd_config_get_real(const snd_config_t *config, double *value);
178d5ac70f0Sopenharmony_ciint snd_config_get_ireal(const snd_config_t *config, double *value);
179d5ac70f0Sopenharmony_ciint snd_config_get_string(const snd_config_t *config, const char **value);
180d5ac70f0Sopenharmony_ciint snd_config_get_ascii(const snd_config_t *config, char **value);
181d5ac70f0Sopenharmony_ciint snd_config_get_pointer(const snd_config_t *config, const void **value);
182d5ac70f0Sopenharmony_ciint snd_config_test_id(const snd_config_t *config, const char *id);
183d5ac70f0Sopenharmony_ci
184d5ac70f0Sopenharmony_cisnd_config_iterator_t snd_config_iterator_first(const snd_config_t *node);
185d5ac70f0Sopenharmony_cisnd_config_iterator_t snd_config_iterator_next(const snd_config_iterator_t iterator);
186d5ac70f0Sopenharmony_cisnd_config_iterator_t snd_config_iterator_end(const snd_config_t *node);
187d5ac70f0Sopenharmony_cisnd_config_t *snd_config_iterator_entry(const snd_config_iterator_t iterator);
188d5ac70f0Sopenharmony_ci
189d5ac70f0Sopenharmony_ci/**
190d5ac70f0Sopenharmony_ci * \brief Helper macro to iterate over the children of a compound node.
191d5ac70f0Sopenharmony_ci * \param[in,out] pos Iterator variable for the current node.
192d5ac70f0Sopenharmony_ci * \param[in,out] next Temporary iterator variable for the next node.
193d5ac70f0Sopenharmony_ci * \param[in] node Handle to the compound configuration node to iterate over.
194d5ac70f0Sopenharmony_ci *
195d5ac70f0Sopenharmony_ci * Use this macro like a \c for statement, e.g.:
196d5ac70f0Sopenharmony_ci * \code
197d5ac70f0Sopenharmony_ci * snd_config_iterator_t pos, next;
198d5ac70f0Sopenharmony_ci * snd_config_for_each(pos, next, node) {
199d5ac70f0Sopenharmony_ci *     snd_config_t *entry = snd_config_iterator_entry(pos);
200d5ac70f0Sopenharmony_ci *     ...
201d5ac70f0Sopenharmony_ci * }
202d5ac70f0Sopenharmony_ci * \endcode
203d5ac70f0Sopenharmony_ci *
204d5ac70f0Sopenharmony_ci * This macro allows deleting or removing the current node.
205d5ac70f0Sopenharmony_ci */
206d5ac70f0Sopenharmony_ci#define snd_config_for_each(pos, next, node) \
207d5ac70f0Sopenharmony_ci	for (pos = snd_config_iterator_first(node), next = snd_config_iterator_next(pos); pos != snd_config_iterator_end(node); pos = next, next = snd_config_iterator_next(pos))
208d5ac70f0Sopenharmony_ci
209d5ac70f0Sopenharmony_ci/* Misc functions */
210d5ac70f0Sopenharmony_ci
211d5ac70f0Sopenharmony_ciint snd_config_get_bool_ascii(const char *ascii);
212d5ac70f0Sopenharmony_ciint snd_config_get_bool(const snd_config_t *conf);
213d5ac70f0Sopenharmony_ciint snd_config_get_card(const snd_config_t *conf);
214d5ac70f0Sopenharmony_ciint snd_config_get_ctl_iface_ascii(const char *ascii);
215d5ac70f0Sopenharmony_ciint snd_config_get_ctl_iface(const snd_config_t *conf);
216d5ac70f0Sopenharmony_ci
217d5ac70f0Sopenharmony_ci/* Names functions */
218d5ac70f0Sopenharmony_ci
219d5ac70f0Sopenharmony_ci/**
220d5ac70f0Sopenharmony_ci * Device-name list element
221d5ac70f0Sopenharmony_ci */
222d5ac70f0Sopenharmony_citypedef struct snd_devname snd_devname_t;
223d5ac70f0Sopenharmony_ci
224d5ac70f0Sopenharmony_ci/**
225d5ac70f0Sopenharmony_ci * Device-name list element (definition)
226d5ac70f0Sopenharmony_ci */
227d5ac70f0Sopenharmony_cistruct snd_devname {
228d5ac70f0Sopenharmony_ci	char *name;	/**< Device name string */
229d5ac70f0Sopenharmony_ci	char *comment;	/**< Comments */
230d5ac70f0Sopenharmony_ci	snd_devname_t *next;	/**< Next pointer */
231d5ac70f0Sopenharmony_ci};
232d5ac70f0Sopenharmony_ci
233d5ac70f0Sopenharmony_ciint snd_names_list(const char *iface, snd_devname_t **list);
234d5ac70f0Sopenharmony_civoid snd_names_list_free(snd_devname_t *list);
235d5ac70f0Sopenharmony_ci
236d5ac70f0Sopenharmony_ci/** \} */
237d5ac70f0Sopenharmony_ci
238d5ac70f0Sopenharmony_ci#ifdef __cplusplus
239d5ac70f0Sopenharmony_ci}
240d5ac70f0Sopenharmony_ci#endif
241d5ac70f0Sopenharmony_ci
242d5ac70f0Sopenharmony_ci#endif /* __ALSA_CONF_H */
243