1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file timer/timer_query.c 3d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz> 4d5ac70f0Sopenharmony_ci * \date 2001 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * Timer Query Interface is designed to obtain identification of timers. 7d5ac70f0Sopenharmony_ci */ 8d5ac70f0Sopenharmony_ci/* 9d5ac70f0Sopenharmony_ci * Timer Query Interface - main file 10d5ac70f0Sopenharmony_ci * Copyright (c) 2001 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 "timer_local.h" 30d5ac70f0Sopenharmony_ci 31d5ac70f0Sopenharmony_cistatic int snd_timer_query_open_conf(snd_timer_query_t **timer, 32d5ac70f0Sopenharmony_ci const char *name, snd_config_t *timer_root, 33d5ac70f0Sopenharmony_ci snd_config_t *timer_conf, int mode) 34d5ac70f0Sopenharmony_ci{ 35d5ac70f0Sopenharmony_ci const char *str; 36d5ac70f0Sopenharmony_ci char buf[256], errbuf[256]; 37d5ac70f0Sopenharmony_ci int err; 38d5ac70f0Sopenharmony_ci snd_config_t *conf, *type_conf = NULL; 39d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 40d5ac70f0Sopenharmony_ci const char *id; 41d5ac70f0Sopenharmony_ci const char *lib = NULL, *open_name = NULL; 42d5ac70f0Sopenharmony_ci int (*open_func)(snd_timer_query_t **, const char *, snd_config_t *, snd_config_t *, int) = NULL; 43d5ac70f0Sopenharmony_ci#ifndef PIC 44d5ac70f0Sopenharmony_ci extern void *snd_timer_query_open_symbols(void); 45d5ac70f0Sopenharmony_ci#endif 46d5ac70f0Sopenharmony_ci void *h = NULL; 47d5ac70f0Sopenharmony_ci if (snd_config_get_type(timer_conf) != SND_CONFIG_TYPE_COMPOUND) { 48d5ac70f0Sopenharmony_ci if (name) 49d5ac70f0Sopenharmony_ci SNDERR("Invalid type for TIMER %s definition", name); 50d5ac70f0Sopenharmony_ci else 51d5ac70f0Sopenharmony_ci SNDERR("Invalid type for TIMER definition"); 52d5ac70f0Sopenharmony_ci return -EINVAL; 53d5ac70f0Sopenharmony_ci } 54d5ac70f0Sopenharmony_ci err = snd_config_search(timer_conf, "type", &conf); 55d5ac70f0Sopenharmony_ci if (err < 0) { 56d5ac70f0Sopenharmony_ci SNDERR("type is not defined"); 57d5ac70f0Sopenharmony_ci return err; 58d5ac70f0Sopenharmony_ci } 59d5ac70f0Sopenharmony_ci err = snd_config_get_id(conf, &id); 60d5ac70f0Sopenharmony_ci if (err < 0) { 61d5ac70f0Sopenharmony_ci SNDERR("unable to get id"); 62d5ac70f0Sopenharmony_ci return err; 63d5ac70f0Sopenharmony_ci } 64d5ac70f0Sopenharmony_ci err = snd_config_get_string(conf, &str); 65d5ac70f0Sopenharmony_ci if (err < 0) { 66d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 67d5ac70f0Sopenharmony_ci return err; 68d5ac70f0Sopenharmony_ci } 69d5ac70f0Sopenharmony_ci err = snd_config_search_definition(timer_root, "timer_query_type", str, &type_conf); 70d5ac70f0Sopenharmony_ci if (err >= 0) { 71d5ac70f0Sopenharmony_ci if (snd_config_get_type(type_conf) != SND_CONFIG_TYPE_COMPOUND) { 72d5ac70f0Sopenharmony_ci SNDERR("Invalid type for TIMER type %s definition", str); 73d5ac70f0Sopenharmony_ci err = -EINVAL; 74d5ac70f0Sopenharmony_ci goto _err; 75d5ac70f0Sopenharmony_ci } 76d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, type_conf) { 77d5ac70f0Sopenharmony_ci snd_config_t *n = snd_config_iterator_entry(i); 78d5ac70f0Sopenharmony_ci const char *id; 79d5ac70f0Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 80d5ac70f0Sopenharmony_ci continue; 81d5ac70f0Sopenharmony_ci if (strcmp(id, "comment") == 0) 82d5ac70f0Sopenharmony_ci continue; 83d5ac70f0Sopenharmony_ci if (strcmp(id, "lib") == 0) { 84d5ac70f0Sopenharmony_ci err = snd_config_get_string(n, &lib); 85d5ac70f0Sopenharmony_ci if (err < 0) { 86d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 87d5ac70f0Sopenharmony_ci goto _err; 88d5ac70f0Sopenharmony_ci } 89d5ac70f0Sopenharmony_ci continue; 90d5ac70f0Sopenharmony_ci } 91d5ac70f0Sopenharmony_ci if (strcmp(id, "open") == 0) { 92d5ac70f0Sopenharmony_ci err = snd_config_get_string(n, &open_name); 93d5ac70f0Sopenharmony_ci if (err < 0) { 94d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 95d5ac70f0Sopenharmony_ci goto _err; 96d5ac70f0Sopenharmony_ci } 97d5ac70f0Sopenharmony_ci continue; 98d5ac70f0Sopenharmony_ci } 99d5ac70f0Sopenharmony_ci SNDERR("Unknown field %s", id); 100d5ac70f0Sopenharmony_ci err = -EINVAL; 101d5ac70f0Sopenharmony_ci goto _err; 102d5ac70f0Sopenharmony_ci } 103d5ac70f0Sopenharmony_ci } 104d5ac70f0Sopenharmony_ci if (!open_name) { 105d5ac70f0Sopenharmony_ci open_name = buf; 106d5ac70f0Sopenharmony_ci snprintf(buf, sizeof(buf), "_snd_timer_query_%s_open", str); 107d5ac70f0Sopenharmony_ci } 108d5ac70f0Sopenharmony_ci#ifndef PIC 109d5ac70f0Sopenharmony_ci snd_timer_query_open_symbols(); 110d5ac70f0Sopenharmony_ci#endif 111d5ac70f0Sopenharmony_ci h = INTERNAL(snd_dlopen)(lib, RTLD_NOW, errbuf, sizeof(errbuf)); 112d5ac70f0Sopenharmony_ci if (h) 113d5ac70f0Sopenharmony_ci open_func = snd_dlsym(h, open_name, SND_DLSYM_VERSION(SND_TIMER_QUERY_DLSYM_VERSION)); 114d5ac70f0Sopenharmony_ci err = 0; 115d5ac70f0Sopenharmony_ci if (!h) { 116d5ac70f0Sopenharmony_ci SNDERR("Cannot open shared library %s (%s)", lib, errbuf); 117d5ac70f0Sopenharmony_ci err = -ENOENT; 118d5ac70f0Sopenharmony_ci } else if (!open_func) { 119d5ac70f0Sopenharmony_ci SNDERR("symbol %s is not defined inside %s", open_name, lib); 120d5ac70f0Sopenharmony_ci snd_dlclose(h); 121d5ac70f0Sopenharmony_ci err = -ENXIO; 122d5ac70f0Sopenharmony_ci } 123d5ac70f0Sopenharmony_ci _err: 124d5ac70f0Sopenharmony_ci if (type_conf) 125d5ac70f0Sopenharmony_ci snd_config_delete(type_conf); 126d5ac70f0Sopenharmony_ci if (! err) { 127d5ac70f0Sopenharmony_ci err = open_func(timer, name, timer_root, timer_conf, mode); 128d5ac70f0Sopenharmony_ci if (err < 0) 129d5ac70f0Sopenharmony_ci snd_dlclose(h); 130d5ac70f0Sopenharmony_ci else 131d5ac70f0Sopenharmony_ci (*timer)->dl_handle = h; 132d5ac70f0Sopenharmony_ci } 133d5ac70f0Sopenharmony_ci return err; 134d5ac70f0Sopenharmony_ci} 135d5ac70f0Sopenharmony_ci 136d5ac70f0Sopenharmony_cistatic int snd_timer_query_open_noupdate(snd_timer_query_t **timer, snd_config_t *root, const char *name, int mode) 137d5ac70f0Sopenharmony_ci{ 138d5ac70f0Sopenharmony_ci int err; 139d5ac70f0Sopenharmony_ci snd_config_t *timer_conf; 140d5ac70f0Sopenharmony_ci err = snd_config_search_definition(root, "timer_query", name, &timer_conf); 141d5ac70f0Sopenharmony_ci if (err < 0) { 142d5ac70f0Sopenharmony_ci SNDERR("Unknown timer %s", name); 143d5ac70f0Sopenharmony_ci return err; 144d5ac70f0Sopenharmony_ci } 145d5ac70f0Sopenharmony_ci err = snd_timer_query_open_conf(timer, name, root, timer_conf, mode); 146d5ac70f0Sopenharmony_ci snd_config_delete(timer_conf); 147d5ac70f0Sopenharmony_ci return err; 148d5ac70f0Sopenharmony_ci} 149d5ac70f0Sopenharmony_ci 150d5ac70f0Sopenharmony_ci/** 151d5ac70f0Sopenharmony_ci * \brief Opens a new connection to the timer query interface. 152d5ac70f0Sopenharmony_ci * \param timer Returned handle (NULL if not wanted) 153d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the RawMidi handle 154d5ac70f0Sopenharmony_ci * \param mode Open mode 155d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 156d5ac70f0Sopenharmony_ci * 157d5ac70f0Sopenharmony_ci * Opens a new connection to the RawMidi interface specified with 158d5ac70f0Sopenharmony_ci * an ASCII identifier and mode. 159d5ac70f0Sopenharmony_ci */ 160d5ac70f0Sopenharmony_ciint snd_timer_query_open(snd_timer_query_t **timer, const char *name, int mode) 161d5ac70f0Sopenharmony_ci{ 162d5ac70f0Sopenharmony_ci snd_config_t *top; 163d5ac70f0Sopenharmony_ci int err; 164d5ac70f0Sopenharmony_ci 165d5ac70f0Sopenharmony_ci assert(timer && name); 166d5ac70f0Sopenharmony_ci err = snd_config_update_ref(&top); 167d5ac70f0Sopenharmony_ci if (err < 0) 168d5ac70f0Sopenharmony_ci return err; 169d5ac70f0Sopenharmony_ci err = snd_timer_query_open_noupdate(timer, top, name, mode); 170d5ac70f0Sopenharmony_ci snd_config_unref(top); 171d5ac70f0Sopenharmony_ci return err; 172d5ac70f0Sopenharmony_ci} 173d5ac70f0Sopenharmony_ci 174d5ac70f0Sopenharmony_ci/** 175d5ac70f0Sopenharmony_ci * \brief Opens a new connection to the timer query interface using local configuration 176d5ac70f0Sopenharmony_ci * \param timer Returned handle (NULL if not wanted) 177d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the RawMidi handle 178d5ac70f0Sopenharmony_ci * \param mode Open mode 179d5ac70f0Sopenharmony_ci * \param lconf Local configuration 180d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 181d5ac70f0Sopenharmony_ci * 182d5ac70f0Sopenharmony_ci * Opens a new connection to the RawMidi interface specified with 183d5ac70f0Sopenharmony_ci * an ASCII identifier and mode. 184d5ac70f0Sopenharmony_ci */ 185d5ac70f0Sopenharmony_ciint snd_timer_query_open_lconf(snd_timer_query_t **timer, const char *name, 186d5ac70f0Sopenharmony_ci int mode, snd_config_t *lconf) 187d5ac70f0Sopenharmony_ci{ 188d5ac70f0Sopenharmony_ci assert(timer && name && lconf); 189d5ac70f0Sopenharmony_ci return snd_timer_query_open_noupdate(timer, lconf, name, mode); 190d5ac70f0Sopenharmony_ci} 191d5ac70f0Sopenharmony_ci 192d5ac70f0Sopenharmony_ci/** 193d5ac70f0Sopenharmony_ci * \brief close timer query handle 194d5ac70f0Sopenharmony_ci * \param timer timer handle 195d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 196d5ac70f0Sopenharmony_ci * 197d5ac70f0Sopenharmony_ci * Closes the specified timer handle and frees all associated 198d5ac70f0Sopenharmony_ci * resources. 199d5ac70f0Sopenharmony_ci */ 200d5ac70f0Sopenharmony_ciint snd_timer_query_close(snd_timer_query_t *timer) 201d5ac70f0Sopenharmony_ci{ 202d5ac70f0Sopenharmony_ci int err; 203d5ac70f0Sopenharmony_ci assert(timer); 204d5ac70f0Sopenharmony_ci err = timer->ops->close(timer); 205d5ac70f0Sopenharmony_ci if (timer->dl_handle) 206d5ac70f0Sopenharmony_ci snd_dlclose(timer->dl_handle); 207d5ac70f0Sopenharmony_ci free(timer->name); 208d5ac70f0Sopenharmony_ci free(timer); 209d5ac70f0Sopenharmony_ci return err; 210d5ac70f0Sopenharmony_ci} 211d5ac70f0Sopenharmony_ci 212d5ac70f0Sopenharmony_ci/** 213d5ac70f0Sopenharmony_ci * \brief obtain the next timer identification 214d5ac70f0Sopenharmony_ci * \param timer timer handle 215d5ac70f0Sopenharmony_ci * \param tid timer identification 216d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 217d5ac70f0Sopenharmony_ci * 218d5ac70f0Sopenharmony_ci * if tid->dev_class is -1, then the first device is returned 219d5ac70f0Sopenharmony_ci * if result tid->dev_class is -1, no more devices are left 220d5ac70f0Sopenharmony_ci */ 221d5ac70f0Sopenharmony_ciint snd_timer_query_next_device(snd_timer_query_t *timer, snd_timer_id_t *tid) 222d5ac70f0Sopenharmony_ci{ 223d5ac70f0Sopenharmony_ci assert(timer); 224d5ac70f0Sopenharmony_ci assert(tid); 225d5ac70f0Sopenharmony_ci return timer->ops->next_device(timer, tid); 226d5ac70f0Sopenharmony_ci} 227d5ac70f0Sopenharmony_ci 228d5ac70f0Sopenharmony_ci/** 229d5ac70f0Sopenharmony_ci * \brief get size of the snd_timer_ginfo_t structure in bytes 230d5ac70f0Sopenharmony_ci * \return size of the snd_timer_ginfo_t structure in bytes 231d5ac70f0Sopenharmony_ci */ 232d5ac70f0Sopenharmony_cisize_t snd_timer_ginfo_sizeof(void) 233d5ac70f0Sopenharmony_ci{ 234d5ac70f0Sopenharmony_ci return sizeof(snd_timer_ginfo_t); 235d5ac70f0Sopenharmony_ci} 236d5ac70f0Sopenharmony_ci 237d5ac70f0Sopenharmony_ci/** 238d5ac70f0Sopenharmony_ci * \brief allocate a new snd_timer_ginfo_t structure 239d5ac70f0Sopenharmony_ci * \param info returned pointer 240d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code if fails 241d5ac70f0Sopenharmony_ci * 242d5ac70f0Sopenharmony_ci * Allocates a new snd_timer_info_t structure using the standard 243d5ac70f0Sopenharmony_ci * malloc C library function. 244d5ac70f0Sopenharmony_ci */ 245d5ac70f0Sopenharmony_ciint snd_timer_ginfo_malloc(snd_timer_ginfo_t **info) 246d5ac70f0Sopenharmony_ci{ 247d5ac70f0Sopenharmony_ci assert(info); 248d5ac70f0Sopenharmony_ci *info = calloc(1, sizeof(snd_timer_ginfo_t)); 249d5ac70f0Sopenharmony_ci if (!*info) 250d5ac70f0Sopenharmony_ci return -ENOMEM; 251d5ac70f0Sopenharmony_ci return 0; 252d5ac70f0Sopenharmony_ci} 253d5ac70f0Sopenharmony_ci 254d5ac70f0Sopenharmony_ci/** 255d5ac70f0Sopenharmony_ci * \brief frees the snd_timer_ginfo_t structure 256d5ac70f0Sopenharmony_ci * \param info pointer to the snd_timer_ginfo_t structure to free 257d5ac70f0Sopenharmony_ci * 258d5ac70f0Sopenharmony_ci * Frees the given snd_timer_info_t structure using the standard 259d5ac70f0Sopenharmony_ci * free C library function. 260d5ac70f0Sopenharmony_ci */ 261d5ac70f0Sopenharmony_civoid snd_timer_ginfo_free(snd_timer_ginfo_t *info) 262d5ac70f0Sopenharmony_ci{ 263d5ac70f0Sopenharmony_ci assert(info); 264d5ac70f0Sopenharmony_ci free(info); 265d5ac70f0Sopenharmony_ci} 266d5ac70f0Sopenharmony_ci 267d5ac70f0Sopenharmony_ci/** 268d5ac70f0Sopenharmony_ci * \brief copy one snd_timer_info_t structure to another 269d5ac70f0Sopenharmony_ci * \param dst destination snd_timer_info_t structure 270d5ac70f0Sopenharmony_ci * \param src source snd_timer_info_t structure 271d5ac70f0Sopenharmony_ci */ 272d5ac70f0Sopenharmony_civoid snd_timer_ginfo_copy(snd_timer_ginfo_t *dst, const snd_timer_ginfo_t *src) 273d5ac70f0Sopenharmony_ci{ 274d5ac70f0Sopenharmony_ci assert(dst && src); 275d5ac70f0Sopenharmony_ci *dst = *src; 276d5ac70f0Sopenharmony_ci} 277d5ac70f0Sopenharmony_ci 278d5ac70f0Sopenharmony_ci/** 279d5ac70f0Sopenharmony_ci * \brief set timer identification 280d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 281d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 282d5ac70f0Sopenharmony_ci * \return zero on success otherwise a negative error number 283d5ac70f0Sopenharmony_ci */ 284d5ac70f0Sopenharmony_ciint snd_timer_ginfo_set_tid(snd_timer_ginfo_t *obj, snd_timer_id_t *tid) 285d5ac70f0Sopenharmony_ci{ 286d5ac70f0Sopenharmony_ci obj->tid = *((snd_timer_id_t *)tid); 287d5ac70f0Sopenharmony_ci return 0; 288d5ac70f0Sopenharmony_ci} 289d5ac70f0Sopenharmony_ci 290d5ac70f0Sopenharmony_ci/** 291d5ac70f0Sopenharmony_ci * \brief get timer identification 292d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 293d5ac70f0Sopenharmony_ci * \return pointer to snd_timer_id_t 294d5ac70f0Sopenharmony_ci */ 295d5ac70f0Sopenharmony_cisnd_timer_id_t *snd_timer_ginfo_get_tid(snd_timer_ginfo_t *obj) 296d5ac70f0Sopenharmony_ci{ 297d5ac70f0Sopenharmony_ci return (snd_timer_id_t *)&obj->tid; 298d5ac70f0Sopenharmony_ci} 299d5ac70f0Sopenharmony_ci 300d5ac70f0Sopenharmony_ci/** 301d5ac70f0Sopenharmony_ci * \brief get timer flags 302d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 303d5ac70f0Sopenharmony_ci * \return timer flags 304d5ac70f0Sopenharmony_ci */ 305d5ac70f0Sopenharmony_ciunsigned int snd_timer_ginfo_get_flags(snd_timer_ginfo_t *obj) 306d5ac70f0Sopenharmony_ci{ 307d5ac70f0Sopenharmony_ci return obj->flags; 308d5ac70f0Sopenharmony_ci} 309d5ac70f0Sopenharmony_ci 310d5ac70f0Sopenharmony_ci/** 311d5ac70f0Sopenharmony_ci * \brief get associated card with timer 312d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 313d5ac70f0Sopenharmony_ci * \return associated card 314d5ac70f0Sopenharmony_ci */ 315d5ac70f0Sopenharmony_ciint snd_timer_ginfo_get_card(snd_timer_ginfo_t *obj) 316d5ac70f0Sopenharmony_ci{ 317d5ac70f0Sopenharmony_ci return obj->card; 318d5ac70f0Sopenharmony_ci} 319d5ac70f0Sopenharmony_ci 320d5ac70f0Sopenharmony_ci/** 321d5ac70f0Sopenharmony_ci * \brief get timer identification 322d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 323d5ac70f0Sopenharmony_ci * \return timer identification 324d5ac70f0Sopenharmony_ci */ 325d5ac70f0Sopenharmony_cichar *snd_timer_ginfo_get_id(snd_timer_ginfo_t *obj) 326d5ac70f0Sopenharmony_ci{ 327d5ac70f0Sopenharmony_ci return (char *)obj->id; 328d5ac70f0Sopenharmony_ci} 329d5ac70f0Sopenharmony_ci 330d5ac70f0Sopenharmony_ci/** 331d5ac70f0Sopenharmony_ci * \brief get timer name 332d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 333d5ac70f0Sopenharmony_ci * \return timer name 334d5ac70f0Sopenharmony_ci */ 335d5ac70f0Sopenharmony_cichar *snd_timer_ginfo_get_name(snd_timer_ginfo_t *obj) 336d5ac70f0Sopenharmony_ci{ 337d5ac70f0Sopenharmony_ci return (char *)obj->name; 338d5ac70f0Sopenharmony_ci} 339d5ac70f0Sopenharmony_ci 340d5ac70f0Sopenharmony_ci/** 341d5ac70f0Sopenharmony_ci * \brief get timer resolution in ns 342d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 343d5ac70f0Sopenharmony_ci * \return timer resolution in ns 344d5ac70f0Sopenharmony_ci */ 345d5ac70f0Sopenharmony_ciunsigned long snd_timer_ginfo_get_resolution(snd_timer_ginfo_t *obj) 346d5ac70f0Sopenharmony_ci{ 347d5ac70f0Sopenharmony_ci return obj->resolution; 348d5ac70f0Sopenharmony_ci} 349d5ac70f0Sopenharmony_ci 350d5ac70f0Sopenharmony_ci/** 351d5ac70f0Sopenharmony_ci * \brief get timer minimal resolution in ns 352d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 353d5ac70f0Sopenharmony_ci * \return timer minimal resolution in ns 354d5ac70f0Sopenharmony_ci */ 355d5ac70f0Sopenharmony_ciunsigned long snd_timer_ginfo_get_resolution_min(snd_timer_ginfo_t *obj) 356d5ac70f0Sopenharmony_ci{ 357d5ac70f0Sopenharmony_ci return obj->resolution_min; 358d5ac70f0Sopenharmony_ci} 359d5ac70f0Sopenharmony_ci 360d5ac70f0Sopenharmony_ci/** 361d5ac70f0Sopenharmony_ci * \brief get timer maximal resolution in ns 362d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 363d5ac70f0Sopenharmony_ci * \return timer maximal resolution in ns 364d5ac70f0Sopenharmony_ci */ 365d5ac70f0Sopenharmony_ciunsigned long snd_timer_ginfo_get_resolution_max(snd_timer_ginfo_t *obj) 366d5ac70f0Sopenharmony_ci{ 367d5ac70f0Sopenharmony_ci return obj->resolution_max; 368d5ac70f0Sopenharmony_ci} 369d5ac70f0Sopenharmony_ci 370d5ac70f0Sopenharmony_ci/** 371d5ac70f0Sopenharmony_ci * \brief get current timer clients 372d5ac70f0Sopenharmony_ci * \param obj pointer to #snd_timer_ginfo_t structure 373d5ac70f0Sopenharmony_ci * \return current timer clients 374d5ac70f0Sopenharmony_ci */ 375d5ac70f0Sopenharmony_ciunsigned int snd_timer_ginfo_get_clients(snd_timer_ginfo_t *obj) 376d5ac70f0Sopenharmony_ci{ 377d5ac70f0Sopenharmony_ci return obj->clients; 378d5ac70f0Sopenharmony_ci} 379d5ac70f0Sopenharmony_ci 380d5ac70f0Sopenharmony_ci/** 381d5ac70f0Sopenharmony_ci * \brief obtain the timer global information 382d5ac70f0Sopenharmony_ci * \param timer timer handle 383d5ac70f0Sopenharmony_ci * \param info timer information 384d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 385d5ac70f0Sopenharmony_ci */ 386d5ac70f0Sopenharmony_ci#ifndef DOXYGEN 387d5ac70f0Sopenharmony_ciEXPORT_SYMBOL int INTERNAL(snd_timer_query_info)(snd_timer_query_t *timer, snd_timer_ginfo_t *info) 388d5ac70f0Sopenharmony_ci#else 389d5ac70f0Sopenharmony_ciint snd_timer_query_info(snd_timer_query_t *timer, snd_timer_ginfo_t *info) 390d5ac70f0Sopenharmony_ci#endif 391d5ac70f0Sopenharmony_ci{ 392d5ac70f0Sopenharmony_ci assert(timer); 393d5ac70f0Sopenharmony_ci assert(info); 394d5ac70f0Sopenharmony_ci return timer->ops->info(timer, info); 395d5ac70f0Sopenharmony_ci} 396d5ac70f0Sopenharmony_ciuse_default_symbol_version(__snd_timer_query_info, snd_timer_query_info, ALSA_0.9.0); 397d5ac70f0Sopenharmony_ci 398d5ac70f0Sopenharmony_ci/** 399d5ac70f0Sopenharmony_ci * \brief set the timer global parameters 400d5ac70f0Sopenharmony_ci * \param timer timer handle 401d5ac70f0Sopenharmony_ci * \param params timer parameters 402d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 403d5ac70f0Sopenharmony_ci */ 404d5ac70f0Sopenharmony_ci#ifndef DOXYGEN 405d5ac70f0Sopenharmony_ciEXPORT_SYMBOL int INTERNAL(snd_timer_query_params)(snd_timer_query_t *timer, snd_timer_gparams_t *params) 406d5ac70f0Sopenharmony_ci#else 407d5ac70f0Sopenharmony_ciint snd_timer_query_params(snd_timer_query_t *timer, snd_timer_gparams_t *params) 408d5ac70f0Sopenharmony_ci#endif 409d5ac70f0Sopenharmony_ci{ 410d5ac70f0Sopenharmony_ci assert(timer); 411d5ac70f0Sopenharmony_ci assert(params); 412d5ac70f0Sopenharmony_ci return timer->ops->params(timer, params); 413d5ac70f0Sopenharmony_ci} 414d5ac70f0Sopenharmony_ciuse_default_symbol_version(__snd_timer_query_params, snd_timer_query_params, ALSA_0.9.0); 415d5ac70f0Sopenharmony_ci 416d5ac70f0Sopenharmony_ci/** 417d5ac70f0Sopenharmony_ci * \brief get the timer global status 418d5ac70f0Sopenharmony_ci * \param timer timer handle 419d5ac70f0Sopenharmony_ci * \param status timer status 420d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 421d5ac70f0Sopenharmony_ci */ 422d5ac70f0Sopenharmony_ci#ifndef DOXYGEN 423d5ac70f0Sopenharmony_ciEXPORT_SYMBOL int INTERNAL(snd_timer_query_status)(snd_timer_query_t *timer, snd_timer_gstatus_t *status) 424d5ac70f0Sopenharmony_ci#else 425d5ac70f0Sopenharmony_ciint snd_timer_query_status(snd_timer_query_t *timer, snd_timer_gstatus_t *status) 426d5ac70f0Sopenharmony_ci#endif 427d5ac70f0Sopenharmony_ci{ 428d5ac70f0Sopenharmony_ci assert(timer); 429d5ac70f0Sopenharmony_ci assert(status); 430d5ac70f0Sopenharmony_ci return timer->ops->status(timer, status); 431d5ac70f0Sopenharmony_ci} 432d5ac70f0Sopenharmony_ciuse_default_symbol_version(__snd_timer_query_status, snd_timer_query_status, ALSA_0.9.0); 433d5ac70f0Sopenharmony_ci 434d5ac70f0Sopenharmony_ci/** 435d5ac70f0Sopenharmony_ci * \brief get size of the snd_timer_id_t structure in bytes 436d5ac70f0Sopenharmony_ci * \return size of the snd_timer_id_t structure in bytes 437d5ac70f0Sopenharmony_ci */ 438d5ac70f0Sopenharmony_cisize_t snd_timer_id_sizeof() 439d5ac70f0Sopenharmony_ci{ 440d5ac70f0Sopenharmony_ci return sizeof(snd_timer_id_t); 441d5ac70f0Sopenharmony_ci} 442d5ac70f0Sopenharmony_ci 443d5ac70f0Sopenharmony_ci/** 444d5ac70f0Sopenharmony_ci * \brief allocate a new snd_timer_id_t structure 445d5ac70f0Sopenharmony_ci * \param info returned pointer 446d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code if fails 447d5ac70f0Sopenharmony_ci * 448d5ac70f0Sopenharmony_ci * Allocates a new snd_timer_id_t structure using the standard 449d5ac70f0Sopenharmony_ci * malloc C library function. 450d5ac70f0Sopenharmony_ci */ 451d5ac70f0Sopenharmony_ciint snd_timer_id_malloc(snd_timer_id_t **info) 452d5ac70f0Sopenharmony_ci{ 453d5ac70f0Sopenharmony_ci assert(info); 454d5ac70f0Sopenharmony_ci *info = calloc(1, sizeof(snd_timer_id_t)); 455d5ac70f0Sopenharmony_ci if (!*info) 456d5ac70f0Sopenharmony_ci return -ENOMEM; 457d5ac70f0Sopenharmony_ci return 0; 458d5ac70f0Sopenharmony_ci} 459d5ac70f0Sopenharmony_ci 460d5ac70f0Sopenharmony_ci/** 461d5ac70f0Sopenharmony_ci * \brief frees the snd_timer_id_t structure 462d5ac70f0Sopenharmony_ci * \param info pointer to the snd_timer_id_t structure to free 463d5ac70f0Sopenharmony_ci * 464d5ac70f0Sopenharmony_ci * Frees the given snd_timer_id_t structure using the standard 465d5ac70f0Sopenharmony_ci * free C library function. 466d5ac70f0Sopenharmony_ci */ 467d5ac70f0Sopenharmony_civoid snd_timer_id_free(snd_timer_id_t *info) 468d5ac70f0Sopenharmony_ci{ 469d5ac70f0Sopenharmony_ci assert(info); 470d5ac70f0Sopenharmony_ci free(info); 471d5ac70f0Sopenharmony_ci} 472d5ac70f0Sopenharmony_ci 473d5ac70f0Sopenharmony_ci/** 474d5ac70f0Sopenharmony_ci * \brief copy one snd_timer_id_t structure to another 475d5ac70f0Sopenharmony_ci * \param dst destination snd_timer_id_t structure 476d5ac70f0Sopenharmony_ci * \param src source snd_timer_id_t structure 477d5ac70f0Sopenharmony_ci */ 478d5ac70f0Sopenharmony_civoid snd_timer_id_copy(snd_timer_id_t *dst, const snd_timer_id_t *src) 479d5ac70f0Sopenharmony_ci{ 480d5ac70f0Sopenharmony_ci assert(dst && src); 481d5ac70f0Sopenharmony_ci *dst = *src; 482d5ac70f0Sopenharmony_ci} 483d5ac70f0Sopenharmony_ci 484d5ac70f0Sopenharmony_ci/** 485d5ac70f0Sopenharmony_ci * \brief set timer class 486d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 487d5ac70f0Sopenharmony_ci * \param dev_class class of timer device 488d5ac70f0Sopenharmony_ci */ 489d5ac70f0Sopenharmony_civoid snd_timer_id_set_class(snd_timer_id_t * tid, int dev_class) 490d5ac70f0Sopenharmony_ci{ 491d5ac70f0Sopenharmony_ci assert(tid); 492d5ac70f0Sopenharmony_ci tid->dev_class = dev_class; 493d5ac70f0Sopenharmony_ci} 494d5ac70f0Sopenharmony_ci 495d5ac70f0Sopenharmony_ci/** 496d5ac70f0Sopenharmony_ci * \brief get timer class 497d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 498d5ac70f0Sopenharmony_ci * \return timer class 499d5ac70f0Sopenharmony_ci */ 500d5ac70f0Sopenharmony_ciint snd_timer_id_get_class(snd_timer_id_t * tid) 501d5ac70f0Sopenharmony_ci{ 502d5ac70f0Sopenharmony_ci assert(tid); 503d5ac70f0Sopenharmony_ci return tid->dev_class; 504d5ac70f0Sopenharmony_ci} 505d5ac70f0Sopenharmony_ci 506d5ac70f0Sopenharmony_ci/** 507d5ac70f0Sopenharmony_ci * \brief set timer sub-class 508d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 509d5ac70f0Sopenharmony_ci * \param dev_sclass sub-class of timer device 510d5ac70f0Sopenharmony_ci */ 511d5ac70f0Sopenharmony_civoid snd_timer_id_set_sclass(snd_timer_id_t * tid, int dev_sclass) 512d5ac70f0Sopenharmony_ci{ 513d5ac70f0Sopenharmony_ci assert(tid); 514d5ac70f0Sopenharmony_ci tid->dev_sclass = dev_sclass; 515d5ac70f0Sopenharmony_ci} 516d5ac70f0Sopenharmony_ci 517d5ac70f0Sopenharmony_ci/** 518d5ac70f0Sopenharmony_ci * \brief get timer sub-class 519d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 520d5ac70f0Sopenharmony_ci * \return timer sub-class 521d5ac70f0Sopenharmony_ci */ 522d5ac70f0Sopenharmony_ciint snd_timer_id_get_sclass(snd_timer_id_t * tid) 523d5ac70f0Sopenharmony_ci{ 524d5ac70f0Sopenharmony_ci assert(tid); 525d5ac70f0Sopenharmony_ci return tid->dev_sclass; 526d5ac70f0Sopenharmony_ci} 527d5ac70f0Sopenharmony_ci 528d5ac70f0Sopenharmony_ci/** 529d5ac70f0Sopenharmony_ci * \brief set timer card 530d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 531d5ac70f0Sopenharmony_ci * \param card card number 532d5ac70f0Sopenharmony_ci */ 533d5ac70f0Sopenharmony_civoid snd_timer_id_set_card(snd_timer_id_t * tid, int card) 534d5ac70f0Sopenharmony_ci{ 535d5ac70f0Sopenharmony_ci assert(tid); 536d5ac70f0Sopenharmony_ci tid->card = card; 537d5ac70f0Sopenharmony_ci} 538d5ac70f0Sopenharmony_ci 539d5ac70f0Sopenharmony_ci/** 540d5ac70f0Sopenharmony_ci * \brief get timer card 541d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 542d5ac70f0Sopenharmony_ci * \return timer card number 543d5ac70f0Sopenharmony_ci */ 544d5ac70f0Sopenharmony_ciint snd_timer_id_get_card(snd_timer_id_t * tid) 545d5ac70f0Sopenharmony_ci{ 546d5ac70f0Sopenharmony_ci assert(tid); 547d5ac70f0Sopenharmony_ci return tid->card; 548d5ac70f0Sopenharmony_ci} 549d5ac70f0Sopenharmony_ci 550d5ac70f0Sopenharmony_ci/** 551d5ac70f0Sopenharmony_ci * \brief set timer device 552d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 553d5ac70f0Sopenharmony_ci * \param device device number 554d5ac70f0Sopenharmony_ci */ 555d5ac70f0Sopenharmony_civoid snd_timer_id_set_device(snd_timer_id_t * tid, int device) 556d5ac70f0Sopenharmony_ci{ 557d5ac70f0Sopenharmony_ci assert(tid); 558d5ac70f0Sopenharmony_ci tid->device = device; 559d5ac70f0Sopenharmony_ci} 560d5ac70f0Sopenharmony_ci 561d5ac70f0Sopenharmony_ci/** 562d5ac70f0Sopenharmony_ci * \brief get timer device 563d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 564d5ac70f0Sopenharmony_ci * \return timer device number 565d5ac70f0Sopenharmony_ci */ 566d5ac70f0Sopenharmony_ciint snd_timer_id_get_device(snd_timer_id_t * tid) 567d5ac70f0Sopenharmony_ci{ 568d5ac70f0Sopenharmony_ci assert(tid); 569d5ac70f0Sopenharmony_ci return tid->device; 570d5ac70f0Sopenharmony_ci} 571d5ac70f0Sopenharmony_ci 572d5ac70f0Sopenharmony_ci/** 573d5ac70f0Sopenharmony_ci * \brief set timer subdevice 574d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 575d5ac70f0Sopenharmony_ci * \param subdevice subdevice number 576d5ac70f0Sopenharmony_ci */ 577d5ac70f0Sopenharmony_civoid snd_timer_id_set_subdevice(snd_timer_id_t * tid, int subdevice) 578d5ac70f0Sopenharmony_ci{ 579d5ac70f0Sopenharmony_ci assert(tid); 580d5ac70f0Sopenharmony_ci tid->subdevice = subdevice; 581d5ac70f0Sopenharmony_ci} 582d5ac70f0Sopenharmony_ci 583d5ac70f0Sopenharmony_ci/** 584d5ac70f0Sopenharmony_ci * \brief get timer subdevice 585d5ac70f0Sopenharmony_ci * \param tid pointer to #snd_timer_id_t structure 586d5ac70f0Sopenharmony_ci * \return timer subdevice number 587d5ac70f0Sopenharmony_ci */ 588d5ac70f0Sopenharmony_ciint snd_timer_id_get_subdevice(snd_timer_id_t * tid) 589d5ac70f0Sopenharmony_ci{ 590d5ac70f0Sopenharmony_ci assert(tid); 591d5ac70f0Sopenharmony_ci return tid->subdevice; 592d5ac70f0Sopenharmony_ci} 593