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