Blame src/timer/timer.c

Packit Service db8eaa
/**
Packit Service db8eaa
 * \file timer/timer.c
Packit Service db8eaa
 * \brief Timer Interface
Packit Service db8eaa
 * \author Jaroslav Kysela <perex@perex.cz>
Packit Service db8eaa
 * \date 1998-2001
Packit Service db8eaa
 *
Packit Service db8eaa
 * Timer Interface is designed to access timers.
Packit Service db8eaa
 * See \ref timer page for more details.
Packit Service db8eaa
 */
Packit Service db8eaa
/*
Packit Service db8eaa
 *  Timer Interface - main file
Packit Service db8eaa
 *  Copyright (c) 1998-2001 by Jaroslav Kysela <perex@perex.cz>
Packit Service db8eaa
 *
Packit Service db8eaa
 *
Packit Service db8eaa
 *   This library is free software; you can redistribute it and/or modify
Packit Service db8eaa
 *   it under the terms of the GNU Lesser General Public License as
Packit Service db8eaa
 *   published by the Free Software Foundation; either version 2.1 of
Packit Service db8eaa
 *   the License, or (at your option) any later version.
Packit Service db8eaa
 *
Packit Service db8eaa
 *   This program is distributed in the hope that it will be useful,
Packit Service db8eaa
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service db8eaa
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service db8eaa
 *   GNU Lesser General Public License for more details.
Packit Service db8eaa
 *
Packit Service db8eaa
 *   You should have received a copy of the GNU Lesser General Public
Packit Service db8eaa
 *   License along with this library; if not, write to the Free Software
Packit Service db8eaa
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service db8eaa
 *
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
/*! \page timer Timer interface
Packit Service db8eaa
Packit Service db8eaa

Timer interface is designed to use internal timers in sound hardware, but

Packit Service db8eaa
it can be driven with any timer.
Packit Service db8eaa
Packit Service db8eaa
\section timer_general_overview General overview
Packit Service db8eaa
Packit Service db8eaa
The timer implementation uses ring buffer to store information about timing
Packit Service db8eaa
events. In this buffer is recorded count of ticks and current tick resolution
Packit Service db8eaa
in nanoseconds.
Packit Service db8eaa
Packit Service db8eaa
\section timer_open Opening
Packit Service db8eaa
Packit Service db8eaa
Timer devices can be opened in two ways. When #SND_TIMER_OPEN_NONBLOCK flag
Packit Service db8eaa
is used, then the open functions return immediately with -EBUSY error code when
Packit Service db8eaa
resources are occupied with another application. When #SND_TIMER_OPEN_NONBLOCK
Packit Service db8eaa
is not used (by default) the open functions block the application requesting
Packit Service db8eaa
device until resources are not free.
Packit Service db8eaa
Packit Service db8eaa
\section timer_events Events
Packit Service db8eaa
Packit Service db8eaa
Events are read via snd_timer_read() function.
Packit Service db8eaa
Packit Service db8eaa
\section timer_examples Examples
Packit Service db8eaa
Packit Service db8eaa
The full featured examples with cross-links:
Packit Service db8eaa
Packit Service db8eaa
\par Simple timer test program
Packit Service db8eaa
\ref example_test_timer "example code"
Packit Service db8eaa
\par
Packit Service db8eaa
This example shows opening a timer device and reading of timer events.
Packit Service db8eaa
Packit Service db8eaa
*/
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \example ../test/timer.c
Packit Service db8eaa
 * \anchor example_test_timer
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
#include "timer_local.h"
Packit Service db8eaa
Packit Service db8eaa
#include <signal.h>
Packit Service db8eaa
Packit Service db8eaa
static int snd_timer_open_conf(snd_timer_t **timer,
Packit Service db8eaa
			       const char *name, snd_config_t *timer_root,
Packit Service db8eaa
			       snd_config_t *timer_conf, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	const char *str;
Packit Service db8eaa
	char buf[256], errbuf[256];
Packit Service db8eaa
	int err;
Packit Service db8eaa
	snd_config_t *conf, *type_conf = NULL;
Packit Service db8eaa
	snd_config_iterator_t i, next;
Packit Service db8eaa
	const char *id;
Packit Service db8eaa
	const char *lib = NULL, *open_name = NULL;
Packit Service db8eaa
	int (*open_func)(snd_timer_t **, const char *, snd_config_t *, snd_config_t *, int) = NULL;
Packit Service db8eaa
#ifndef PIC
Packit Service db8eaa
	extern void *snd_timer_open_symbols(void);
Packit Service db8eaa
#endif
Packit Service db8eaa
	void *h = NULL;
Packit Service db8eaa
	if (snd_config_get_type(timer_conf) != SND_CONFIG_TYPE_COMPOUND) {
Packit Service db8eaa
		if (name)
Packit Service db8eaa
			SNDERR("Invalid type for TIMER %s definition", name);
Packit Service db8eaa
		else
Packit Service db8eaa
			SNDERR("Invalid type for TIMER definition");
Packit Service db8eaa
		return -EINVAL;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_search(timer_conf, "type", &conf;;
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("type is not defined");
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_get_id(conf, &id;;
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("unable to get id");
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_get_string(conf, &str);
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("Invalid type for %s", id);
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_config_search_definition(timer_root, "timer_type", str, &type_conf);
Packit Service db8eaa
	if (err >= 0) {
Packit Service db8eaa
		if (snd_config_get_type(type_conf) != SND_CONFIG_TYPE_COMPOUND) {
Packit Service db8eaa
			SNDERR("Invalid type for TIMER type %s definition", str);
Packit Service db8eaa
			goto _err;
Packit Service db8eaa
		}
Packit Service db8eaa
		snd_config_for_each(i, next, type_conf) {
Packit Service db8eaa
			snd_config_t *n = snd_config_iterator_entry(i);
Packit Service db8eaa
			const char *id;
Packit Service db8eaa
			if (snd_config_get_id(n, &id) < 0)
Packit Service db8eaa
				continue;
Packit Service db8eaa
			if (strcmp(id, "comment") == 0)
Packit Service db8eaa
				continue;
Packit Service db8eaa
			if (strcmp(id, "lib") == 0) {
Packit Service db8eaa
				err = snd_config_get_string(n, &lib);
Packit Service db8eaa
				if (err < 0) {
Packit Service db8eaa
					SNDERR("Invalid type for %s", id);
Packit Service db8eaa
					goto _err;
Packit Service db8eaa
				}
Packit Service db8eaa
				continue;
Packit Service db8eaa
			}
Packit Service db8eaa
			if (strcmp(id, "open") == 0) {
Packit Service db8eaa
				err = snd_config_get_string(n, &open_name);
Packit Service db8eaa
				if (err < 0) {
Packit Service db8eaa
					SNDERR("Invalid type for %s", id);
Packit Service db8eaa
					goto _err;
Packit Service db8eaa
				}
Packit Service db8eaa
				continue;
Packit Service db8eaa
			}
Packit Service db8eaa
			SNDERR("Unknown field %s", id);
Packit Service db8eaa
			err = -EINVAL;
Packit Service db8eaa
			goto _err;
Packit Service db8eaa
		}
Packit Service db8eaa
	}
Packit Service db8eaa
	if (!open_name) {
Packit Service db8eaa
		open_name = buf;
Packit Service db8eaa
		snprintf(buf, sizeof(buf), "_snd_timer_%s_open", str);
Packit Service db8eaa
	}
Packit Service db8eaa
#ifndef PIC
Packit Service db8eaa
	snd_timer_open_symbols();
Packit Service db8eaa
#endif
Packit Service db8eaa
	h = INTERNAL(snd_dlopen)(lib, RTLD_NOW, errbuf, sizeof(errbuf));
Packit Service db8eaa
	if (h)
Packit Service db8eaa
		open_func = snd_dlsym(h, open_name, SND_DLSYM_VERSION(SND_TIMER_DLSYM_VERSION));
Packit Service db8eaa
	err = 0;
Packit Service db8eaa
	if (!h) {
Packit Service db8eaa
		SNDERR("Cannot open shared library %s (%s)", lib, errbuf);
Packit Service db8eaa
		err = -ENOENT;
Packit Service db8eaa
	} else if (!open_func) {
Packit Service db8eaa
		SNDERR("symbol %s is not defined inside %s", open_name, lib);
Packit Service db8eaa
		snd_dlclose(h);
Packit Service db8eaa
		err = -ENXIO;
Packit Service db8eaa
	}
Packit Service db8eaa
       _err:
Packit Service db8eaa
	if (type_conf)
Packit Service db8eaa
		snd_config_delete(type_conf);
Packit Service db8eaa
	if (! err) {
Packit Service db8eaa
		err = open_func(timer, name, timer_root, timer_conf, mode);
Packit Service db8eaa
		if (err < 0)
Packit Service db8eaa
			snd_dlclose(h);
Packit Service db8eaa
		else
Packit Service db8eaa
			(*timer)->dl_handle = h;
Packit Service db8eaa
	}
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
static int snd_timer_open_noupdate(snd_timer_t **timer, snd_config_t *root, const char *name, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	snd_config_t *timer_conf;
Packit Service db8eaa
	err = snd_config_search_definition(root, "timer", name, &timer_conf);
Packit Service db8eaa
	if (err < 0) {
Packit Service db8eaa
		SNDERR("Unknown timer %s", name);
Packit Service db8eaa
		return err;
Packit Service db8eaa
	}
Packit Service db8eaa
	err = snd_timer_open_conf(timer, name, root, timer_conf, mode);
Packit Service db8eaa
	snd_config_delete(timer_conf);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Opens a new connection to the timer interface.
Packit Service db8eaa
 * \param timer Returned handle (NULL if not wanted)
Packit Service db8eaa
 * \param name ASCII identifier of the timer handle
Packit Service db8eaa
 * \param mode Open mode
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Opens a new connection to the timer interface specified with
Packit Service db8eaa
 * an ASCII identifier and mode.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_open(snd_timer_t **timer, const char *name, int mode)
Packit Service db8eaa
{
Packit Service db8eaa
	snd_config_t *top;
Packit Service db8eaa
	int err;
Packit Service db8eaa
Packit Service db8eaa
	assert(timer && name);
Packit Service db8eaa
	err = snd_config_update_ref(&top);
Packit Service db8eaa
	if (err < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	err = snd_timer_open_noupdate(timer, top, name, mode);
Packit Service db8eaa
	snd_config_unref(top);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Opens a new connection to the timer interface using local configuration
Packit Service db8eaa
 * \param timer Returned handle (NULL if not wanted)
Packit Service db8eaa
 * \param name ASCII identifier of the timer handle
Packit Service db8eaa
 * \param mode Open mode
Packit Service db8eaa
 * \param lconf Local configuration
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Opens a new connection to the timer interface specified with
Packit Service db8eaa
 * an ASCII identifier and mode.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_open_lconf(snd_timer_t **timer, const char *name,
Packit Service db8eaa
			 int mode, snd_config_t *lconf)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer && name && lconf);
Packit Service db8eaa
	return snd_timer_open_noupdate(timer, lconf, name, mode);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief close timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Closes the specified timer handle and frees all associated
Packit Service db8eaa
 * resources.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_close(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
  	assert(timer);
Packit Service db8eaa
	while (!list_empty(&timer->async_handlers)) {
Packit Service db8eaa
		snd_async_handler_t *h = list_entry(timer->async_handlers.next, snd_async_handler_t, hlist);
Packit Service db8eaa
		snd_async_del_handler(h);
Packit Service db8eaa
	}
Packit Service db8eaa
	err = timer->ops->close(timer);
Packit Service db8eaa
	if (timer->dl_handle)
Packit Service db8eaa
		snd_dlclose(timer->dl_handle);
Packit Service db8eaa
	free(timer->name);
Packit Service db8eaa
	free(timer);
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get identifier of timer handle
Packit Service db8eaa
 * \param timer a timer handle
Packit Service db8eaa
 * \return ascii identifier of timer handle
Packit Service db8eaa
 *
Packit Service db8eaa
 * Returns the ASCII identifier of given timer handle. It's the same
Packit Service db8eaa
 * identifier specified in snd_timer_open().
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_timer_name(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return timer->name;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get type of timer handle
Packit Service db8eaa
 * \param timer a timer handle
Packit Service db8eaa
 * \return type of timer handle
Packit Service db8eaa
 *
Packit Service db8eaa
 * Returns the type #snd_timer_type_t of given timer handle.
Packit Service db8eaa
 */
Packit Service db8eaa
snd_timer_type_t snd_timer_type(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return timer->type;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Add an async handler for a timer
Packit Service db8eaa
 * \param handler Returned handler handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param callback Callback function
Packit Service db8eaa
 * \param private_data Callback private data
Packit Service db8eaa
 * \return 0 otherwise a negative error code on failure
Packit Service db8eaa
 *
Packit Service db8eaa
 * The asynchronous callback is called when new timer event occurs.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_async_add_timer_handler(snd_async_handler_t **handler, snd_timer_t *timer,
Packit Service db8eaa
				snd_async_callback_t callback, void *private_data)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	int was_empty;
Packit Service db8eaa
	snd_async_handler_t *h;
Packit Service db8eaa
	err = snd_async_add_handler(&h, timer->poll_fd,
Packit Service db8eaa
				    callback, private_data);
Packit Service db8eaa
	if (err < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	h->type = SND_ASYNC_HANDLER_TIMER;
Packit Service db8eaa
	h->u.timer = timer;
Packit Service db8eaa
	was_empty = list_empty(&timer->async_handlers);
Packit Service db8eaa
	list_add_tail(&h->hlist, &timer->async_handlers);
Packit Service db8eaa
	if (was_empty) {
Packit Service db8eaa
		err = snd_timer_async(timer, snd_async_handler_get_signo(h), getpid());
Packit Service db8eaa
		if (err < 0) {
Packit Service db8eaa
			snd_async_del_handler(h);
Packit Service db8eaa
			return err;
Packit Service db8eaa
		}
Packit Service db8eaa
	}
Packit Service db8eaa
	*handler = h;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Return timer handle related to an async handler
Packit Service db8eaa
 * \param handler Async handler handle
Packit Service db8eaa
 * \return timer handle
Packit Service db8eaa
 */
Packit Service db8eaa
snd_timer_t *snd_async_handler_get_timer(snd_async_handler_t *handler)
Packit Service db8eaa
{
Packit Service db8eaa
	if (handler->type != SND_ASYNC_HANDLER_TIMER) {
Packit Service db8eaa
		SNDMSG("invalid handler type %d", handler->type);
Packit Service db8eaa
		return NULL;
Packit Service db8eaa
	}
Packit Service db8eaa
	return handler->u.timer;
Packit Service db8eaa
}                                                            
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get count of poll descriptors for timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \return count of poll descriptors
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_poll_descriptors_count(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return 1;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get poll descriptors
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param pfds array of poll descriptors
Packit Service db8eaa
 * \param space space in the poll descriptor array
Packit Service db8eaa
 * \return count of filled descriptors
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_poll_descriptors(snd_timer_t *timer, struct pollfd *pfds, unsigned int space)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	if (space >= 1) {
Packit Service db8eaa
		pfds->fd = timer->poll_fd;
Packit Service db8eaa
		switch (timer->mode & O_ACCMODE) {
Packit Service db8eaa
		case O_WRONLY:
Packit Service db8eaa
			pfds->events = POLLOUT|POLLERR|POLLNVAL;
Packit Service db8eaa
			break;
Packit Service db8eaa
		case O_RDONLY:
Packit Service db8eaa
			pfds->events = POLLIN|POLLERR|POLLNVAL;
Packit Service db8eaa
			break;
Packit Service db8eaa
		case O_RDWR:
Packit Service db8eaa
			pfds->events = POLLOUT|POLLIN|POLLERR|POLLNVAL;
Packit Service db8eaa
			break;
Packit Service db8eaa
		default:
Packit Service db8eaa
			return -EIO;
Packit Service db8eaa
		}
Packit Service db8eaa
		return 1;
Packit Service db8eaa
	}
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get returned events from poll descriptors
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param pfds array of poll descriptors
Packit Service db8eaa
 * \param nfds count of poll descriptors
Packit Service db8eaa
 * \param revents returned events
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_poll_descriptors_revents(snd_timer_t *timer, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
Packit Service db8eaa
{
Packit Service db8eaa
        assert(timer && pfds && revents);
Packit Service db8eaa
        if (nfds == 1) {
Packit Service db8eaa
                *revents = pfds->revents;
Packit Service db8eaa
                return 0;
Packit Service db8eaa
        }
Packit Service db8eaa
        return -EINVAL;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set nonblock mode
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param nonblock 0 = block, 1 = nonblock mode
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_nonblock(snd_timer_t *timer, int nonblock)
Packit Service db8eaa
{
Packit Service db8eaa
	int err;
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	if ((err = timer->ops->nonblock(timer, nonblock)) < 0)
Packit Service db8eaa
		return err;
Packit Service db8eaa
	if (nonblock)
Packit Service db8eaa
		timer->mode |= SND_TIMER_OPEN_NONBLOCK;
Packit Service db8eaa
	else
Packit Service db8eaa
		timer->mode &= ~SND_TIMER_OPEN_NONBLOCK;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
#ifndef DOC_HIDDEN
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set async mode
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param sig Signal to raise: < 0 disable, 0 default (SIGIO)
Packit Service db8eaa
 * \param pid Process ID to signal: 0 current
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * A signal is raised every period.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
        if (sig == 0)
Packit Service db8eaa
                sig = SIGIO;
Packit Service db8eaa
	if (pid == 0)
Packit Service db8eaa
		pid = getpid();
Packit Service db8eaa
	return timer->ops->async(timer, sig, pid);
Packit Service db8eaa
}
Packit Service db8eaa
#endif
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_timer_info_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_timer_info_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_timer_info_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_timer_info_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate a new snd_timer_info_t structure
Packit Service db8eaa
 * \param info returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_timer_info_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_info_malloc(snd_timer_info_t **info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	*info = calloc(1, sizeof(snd_timer_info_t));
Packit Service db8eaa
	if (!*info)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_timer_info_t structure
Packit Service db8eaa
 * \param info pointer to the snd_timer_info_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_timer_info_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_info_free(snd_timer_info_t *info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	free(info);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_timer_info_t structure to another
Packit Service db8eaa
 * \param dst destination snd_timer_info_t structure
Packit Service db8eaa
 * \param src source snd_timer_info_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_info_copy(snd_timer_info_t *dst, const snd_timer_info_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief determine, if timer is slave
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return nonzero if timer is slave
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_info_is_slave(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->flags & SNDRV_TIMER_FLG_SLAVE ? 1 : 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer card
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return timer card number
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_info_get_card(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->card;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer id
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return timer id
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_timer_info_get_id(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return (const char *)info->id;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer name
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return timer name
Packit Service db8eaa
 */
Packit Service db8eaa
const char *snd_timer_info_get_name(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return (const char *)info->name;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer resolution in us
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return timer resolution
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_info_get_resolution(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return info->resolution;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get information about timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param info pointer to a snd_timer_info_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_info(snd_timer_t *timer, snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return timer->ops->info(timer, info);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_timer_params_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_timer_params_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_timer_params_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_timer_params_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate a new snd_timer_params_t structure
Packit Service db8eaa
 * \param params returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_timer_params_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params_malloc(snd_timer_params_t **params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	*params = calloc(1, sizeof(snd_timer_params_t));
Packit Service db8eaa
	if (!*params)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_timer_params_t structure
Packit Service db8eaa
 * \param params pointer to the snd_timer_params_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_timer_params_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_params_free(snd_timer_params_t *params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	free(params);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_timer_params_t structure to another
Packit Service db8eaa
 * \param dst destination snd_timer_params_t structure
Packit Service db8eaa
 * \param src source snd_timer_params_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_params_copy(snd_timer_params_t *dst, const snd_timer_params_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer auto start
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param auto_start The boolean value to set
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params_set_auto_start(snd_timer_params_t * params, int auto_start)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	if (auto_start)
Packit Service db8eaa
		params->flags |= SNDRV_TIMER_PSFLG_AUTO;
Packit Service db8eaa
	else
Packit Service db8eaa
		params->flags &= ~SNDRV_TIMER_PSFLG_AUTO;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief determine if timer has auto start flag
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return nonzero if timer has auto start flag
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params_get_auto_start(snd_timer_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->flags & SNDRV_TIMER_PSFLG_AUTO ? 1 : 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer exclusive use
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param exclusive The boolean value to set
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
EXPORT_SYMBOL int INTERNAL(snd_timer_params_set_exclusive)(snd_timer_params_t * params, int exclusive)
Packit Service db8eaa
#else
Packit Service db8eaa
int snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	if (exclusive)
Packit Service db8eaa
		params->flags |= SNDRV_TIMER_PSFLG_EXCLUSIVE;
Packit Service db8eaa
	else
Packit Service db8eaa
		params->flags &= ~SNDRV_TIMER_PSFLG_EXCLUSIVE;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
use_default_symbol_version(__snd_timer_params_set_exclusive, snd_timer_params_set_exclusive, ALSA_0.9.0);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief determine if timer has exclusive flag
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return nonzero if timer has exclusive flag
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
EXPORT_SYMBOL int INTERNAL(snd_timer_params_get_exclusive)(snd_timer_params_t * params)
Packit Service db8eaa
#else
Packit Service db8eaa
int snd_timer_params_get_exclusive(snd_timer_params_t * params)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->flags & SNDRV_TIMER_PSFLG_EXCLUSIVE ? 1 : 0;
Packit Service db8eaa
}
Packit Service db8eaa
use_default_symbol_version(__snd_timer_params_get_exclusive, snd_timer_params_get_exclusive, ALSA_0.9.0);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer early event
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param early_event The boolean value to set
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params_set_early_event(snd_timer_params_t * params, int early_event)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	if (early_event)
Packit Service db8eaa
		params->flags |= SNDRV_TIMER_PSFLG_EARLY_EVENT;
Packit Service db8eaa
	else
Packit Service db8eaa
		params->flags &= ~SNDRV_TIMER_PSFLG_EARLY_EVENT;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief determine if timer has early event flag
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return nonzero if timer has early event flag set
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params_get_early_event(snd_timer_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->flags & SNDRV_TIMER_PSFLG_EARLY_EVENT ? 1 : 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer ticks
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param ticks Ticks to set
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_params_set_ticks(snd_timer_params_t * params, long ticks)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	params->ticks = ticks;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer ticks
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return timer ticks
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_params_get_ticks(snd_timer_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->ticks;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer queue size (32-1024)
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param queue_size The queue size to set
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_params_set_queue_size(snd_timer_params_t * params, long queue_size)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	params->queue_size = queue_size;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get queue size
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return queue size
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_params_get_queue_size(snd_timer_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->queue_size;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set timer event filter
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \param filter The event filter bits to set
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
EXPORT_SYMBOL void INTERNAL(snd_timer_params_set_filter)(snd_timer_params_t * params, unsigned int filter)
Packit Service db8eaa
#else
Packit Service db8eaa
void snd_timer_params_set_filter(snd_timer_params_t * params, unsigned int filter)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	params->filter = filter;
Packit Service db8eaa
}
Packit Service db8eaa
use_default_symbol_version(__snd_timer_params_set_filter, snd_timer_params_set_filter, ALSA_0.9.0);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timer event filter
Packit Service db8eaa
 * \param params pointer to #snd_timer_params_t structure
Packit Service db8eaa
 * \return timer event filter
Packit Service db8eaa
 */
Packit Service db8eaa
#ifndef DOXYGEN
Packit Service db8eaa
EXPORT_SYMBOL unsigned int INTERNAL(snd_timer_params_get_filter)(snd_timer_params_t * params)
Packit Service db8eaa
#else
Packit Service db8eaa
unsigned int snd_timer_params_get_filter(snd_timer_params_t * params)
Packit Service db8eaa
#endif
Packit Service db8eaa
{
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return params->filter;
Packit Service db8eaa
}
Packit Service db8eaa
use_default_symbol_version(__snd_timer_params_get_filter, snd_timer_params_get_filter, ALSA_0.9.0);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief set parameters for timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param params pointer to a #snd_timer_params_t structure
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_params(snd_timer_t *timer, snd_timer_params_t * params)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	assert(params);
Packit Service db8eaa
	return timer->ops->params(timer, params);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get size of the snd_timer_status_t structure in bytes
Packit Service db8eaa
 * \return size of the snd_timer_status_t structure in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
size_t snd_timer_status_sizeof()
Packit Service db8eaa
{
Packit Service db8eaa
	return sizeof(snd_timer_status_t);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief allocate a new snd_timer_status_t structure
Packit Service db8eaa
 * \param status returned pointer
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code if fails
Packit Service db8eaa
 *
Packit Service db8eaa
 * Allocates a new snd_timer_status_t structure using the standard
Packit Service db8eaa
 * malloc C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_status_malloc(snd_timer_status_t **status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	*status = calloc(1, sizeof(snd_timer_status_t));
Packit Service db8eaa
	if (!*status)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief frees the snd_timer_status_t structure
Packit Service db8eaa
 * \param status pointer to the snd_timer_status_t structure to free
Packit Service db8eaa
 *
Packit Service db8eaa
 * Frees the given snd_timer_status_t structure using the standard
Packit Service db8eaa
 * free C library function.
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_status_free(snd_timer_status_t *status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	free(status);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief copy one snd_timer_status_t structure to another
Packit Service db8eaa
 * \param dst destination snd_timer_status_t structure
Packit Service db8eaa
 * \param src source snd_timer_status_t structure
Packit Service db8eaa
 */
Packit Service db8eaa
void snd_timer_status_copy(snd_timer_status_t *dst, const snd_timer_status_t *src)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(dst && src);
Packit Service db8eaa
	*dst = *src;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get timestamp
Packit Service db8eaa
 * \param status pointer to #snd_timer_status_t structure
Packit Service db8eaa
 * \return timestamp
Packit Service db8eaa
 */
Packit Service db8eaa
snd_htimestamp_t snd_timer_status_get_timestamp(snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->tstamp;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get resolution in us
Packit Service db8eaa
 * \param status pointer to #snd_timer_status_t structure
Packit Service db8eaa
 * \return resolution
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_status_get_resolution(snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->resolution;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get master tick lost count
Packit Service db8eaa
 * \param status pointer to #snd_timer_status_t structure
Packit Service db8eaa
 * \return master tick lost count
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_status_get_lost(snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->lost;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get overrun count
Packit Service db8eaa
 * \param status pointer to #snd_timer_status_t structure
Packit Service db8eaa
 * \return overrun count
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_status_get_overrun(snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->overrun;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get count of used queue elements
Packit Service db8eaa
 * \param status pointer to #snd_timer_status_t structure
Packit Service db8eaa
 * \return count of used queue elements
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_status_get_queue(snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return status->queue;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief get status from timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param status pointer to a #snd_timer_status_t structure to be filled
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_status(snd_timer_t *timer, snd_timer_status_t * status)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	assert(status);
Packit Service db8eaa
	return timer->ops->status(timer, status);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief start the timer
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_start(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return timer->ops->rt_start(timer);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief stop the timer
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_stop(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return timer->ops->rt_stop(timer);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief continue the timer
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \return 0 on success otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_timer_continue(snd_timer_t *timer)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	return timer->ops->rt_continue(timer);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief read bytes using timer handle
Packit Service db8eaa
 * \param timer timer handle
Packit Service db8eaa
 * \param buffer buffer to store the input bytes
Packit Service db8eaa
 * \param size input buffer size in bytes
Packit Service db8eaa
 */
Packit Service db8eaa
ssize_t snd_timer_read(snd_timer_t *timer, void *buffer, size_t size)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(timer);
Packit Service db8eaa
	assert(((timer->mode & O_ACCMODE) == O_RDONLY) || ((timer->mode & O_ACCMODE) == O_RDWR));
Packit Service db8eaa
	assert(buffer || size == 0);
Packit Service db8eaa
	return (timer->ops->read)(timer, buffer, size);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief (DEPRECATED) get maximum timer ticks
Packit Service db8eaa
 * \param info pointer to #snd_timer_info_t structure
Packit Service db8eaa
 * \return maximum timer ticks
Packit Service db8eaa
 */
Packit Service db8eaa
long snd_timer_info_get_ticks(snd_timer_info_t * info)
Packit Service db8eaa
{
Packit Service db8eaa
	assert(info);
Packit Service db8eaa
	return 1;
Packit Service db8eaa
}
Packit Service db8eaa
#ifndef DOC_HIDDEN
Packit Service db8eaa
link_warning(snd_timer_info_get_ticks, "Warning: snd_timer_info_get_ticks is deprecated");
Packit Service db8eaa
#endif