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