Updated to new timer API

This commit is contained in:
Jaroslav Kysela 2003-03-04 20:01:06 +00:00
parent 6a949ee804
commit 9c084c4ba6
8 changed files with 234 additions and 18 deletions

View file

@ -466,16 +466,6 @@ const char *snd_timer_info_get_name(snd_timer_info_t * info)
return info->name;
}
/**
* \brief get maximum timer ticks
* \param info pointer to #snd_timer_info_t structure
* \return maximum timer ticks
*/
long snd_timer_info_get_ticks(snd_timer_info_t * info)
{
assert(info);
return info->ticks;
}
/**
* \brief get timer resolution in us
@ -575,6 +565,40 @@ int snd_timer_params_get_auto_start(snd_timer_params_t * params)
return params->flags & SNDRV_TIMER_PSFLG_AUTO ? 1 : 0;
}
/**
* \brief set timer exclusive use
* \param params pointer to #snd_timer_params_t structure
*/
#ifndef DOXYGEN
void INTERNAL(snd_timer_params_set_exclusive)(snd_timer_params_t * params, int exclusive)
#else
void snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive)
#endif
{
assert(params);
if (exclusive)
params->flags |= SNDRV_TIMER_PSFLG_EXCLUSIVE;
else
params->flags &= ~SNDRV_TIMER_PSFLG_EXCLUSIVE;
}
default_symbol_version(__snd_timer_params_set_exclusive, snd_timer_params_set_exclusive, ALSA_0.9.0);
/**
* \brief determine if timer has exclusive flag
* \param params pointer to #snd_timer_params_t structure
* \return nonzero if timer has exclusive flag
*/
#ifndef DOXYGEN
int INTERNAL(snd_timer_params_get_exclusive)(snd_timer_params_t * params)
#else
int snd_timer_params_get_exclusive(snd_timer_params_t * params)
#endif
{
assert(params);
return params->flags & SNDRV_TIMER_PSFLG_EXCLUSIVE ? 1 : 0;
}
default_symbol_version(__snd_timer_params_get_exclusive, snd_timer_params_get_exclusive, ALSA_0.9.0);
/**
* \brief set timer ticks
* \param params pointer to #snd_timer_params_t structure
@ -617,6 +641,37 @@ long snd_timer_params_get_queue_size(snd_timer_params_t * params)
return params->queue_size;
}
/**
* \brief set timer event filter
* \param params pointer to #snd_timer_params_t structure
*/
#ifndef DOXYGEN
void INTERNAL(snd_timer_params_set_filter)(snd_timer_params_t * params, unsigned int filter)
#else
void snd_timer_params_set_filter(snd_timer_params_t * params, unsigned int filter)
#endif
{
assert(params);
params->filter = filter;
}
default_symbol_version(__snd_timer_params_set_filter, snd_timer_params_set_filter, ALSA_0.9.0);
/**
* \brief get timer event filter
* \param params pointer to #snd_timer_params_t structure
* \return timer event filter
*/
#ifndef DOXYGEN
unsigned int INTERNAL(snd_timer_params_get_filter)(snd_timer_params_t * params)
#else
unsigned int snd_timer_params_get_filter(snd_timer_params_t * params)
#endif
{
assert(params);
return params->filter;
}
default_symbol_version(__snd_timer_params_get_filter, snd_timer_params_get_filter, ALSA_0.9.0);
/**
* \brief set parameters for timer handle
* \param timer timer handle
@ -796,3 +851,17 @@ ssize_t snd_timer_read(snd_timer_t *timer, void *buffer, size_t size)
assert(buffer || size == 0);
return timer->ops->read(timer, buffer, size);
}
/**
* \brief (DEPRECATED) get maximum timer ticks
* \param info pointer to #snd_timer_info_t structure
* \return maximum timer ticks
*/
long snd_timer_info_get_ticks(snd_timer_info_t * info)
{
assert(info);
return 1;
}
#ifndef DOC_HIDDEN
link_warning(snd_timer_info_get_ticks, "Warning: snd_timer_info_get_ticks is deprecated");
#endif

View file

@ -233,6 +233,15 @@ int snd_timer_hw_open(snd_timer_t **handle, const char *name, int dev_class, int
close(fd);
return -SND_ERROR_INCOMPATIBLE_VERSION;
}
if (mode & SND_TIMER_OPEN_TREAD) {
int arg = 1;
if (ioctl(fd, SNDRV_TIMER_IOCTL_TREAD, &arg) < 0) {
ret = -errno;
close(fd);
SNDERR("extended read is not supported (SNDRV_TIMER_IOCTL_TREAD)");
return ret;
}
}
memset(&sel, 0, sizeof(sel));
sel.id.dev_class = dev_class;
sel.id.dev_sclass = dev_sclass;

View file

@ -52,6 +52,9 @@ int snd_timer_hw_open(snd_timer_t **handle, const char *name, int dev_class, int
typedef struct {
int (*close)(snd_timer_query_t *timer);
int (*next_device)(snd_timer_query_t *timer, snd_timer_id_t *tid);
int (*info)(snd_timer_query_t *timer, snd_timer_ginfo_t *info);
int (*params)(snd_timer_query_t *timer, snd_timer_gparams_t *info);
int (*status)(snd_timer_query_t *timer, snd_timer_gstatus_t *info);
} snd_timer_query_ops_t;
struct _snd_timer_query {

View file

@ -220,6 +220,56 @@ int snd_timer_query_next_device(snd_timer_query_t *timer, snd_timer_id_t *tid)
return timer->ops->next_device(timer, tid);
}
/**
* \brief obtain the timer global information
* \param timer timer handle
* \param info timer information
* \return 0 on success otherwise a negative error code
*/
#ifndef DOXYGEN
int INTERNAL(snd_timer_query_info)(snd_timer_query_t *timer, snd_timer_ginfo_t *info)
#else
int snd_timer_query_info(snd_timer_query_t *timer, snd_timer_ginfo_t *info)
#endif
{
assert(timer);
assert(info);
return timer->ops->info(timer, info);
}
default_symbol_version(__snd_timer_query_info, snd_timer_query_info, ALSA_0.9.0);
/**
* \brief set the timer global parameters
* \param timer timer handle
* \param params timer parameters
* \return 0 on success otherwise a negative error code
*/
#ifndef DOXYGEN
int INTERNAL(snd_timer_query_params)(snd_timer_query_t *timer, snd_timer_gparams_t *params)
#else
int snd_timer_query_params(snd_timer_query_t *timer, snd_timer_gparams_t *params)
#endif
{
assert(timer);
assert(params);
return timer->ops->params(timer, params);
}
default_symbol_version(__snd_timer_query_params, snd_timer_query_params, ALSA_0.9.0);
/**
* \brief get the timer global status
* \param timer timer handle
* \param status timer status
* \return 0 on success otherwise a negative error code
*/
int snd_timer_query_status(snd_timer_query_t *timer, snd_timer_gstatus_t *status)
{
assert(timer);
assert(status);
return timer->ops->status(timer, status);
}
default_symbol_version(__snd_timer_query_status, snd_timer_query_status, ALSA_0.9.0);
/**
* \brief get size of the snd_timer_id_t structure in bytes
* \return size of the snd_timer_id_t structure in bytes

View file

@ -54,9 +54,39 @@ static int snd_timer_query_hw_next_device(snd_timer_query_t *handle, snd_timer_i
return 0;
}
static int snd_timer_query_hw_info(snd_timer_query_t *handle, snd_timer_ginfo_t *info)
{
if (!handle || !info)
return -EINVAL;
if (ioctl(handle->poll_fd, SNDRV_TIMER_IOCTL_GINFO, info) < 0)
return -errno;
return 0;
}
static int snd_timer_query_hw_params(snd_timer_query_t *handle, snd_timer_gparams_t *params)
{
if (!handle || !params)
return -EINVAL;
if (ioctl(handle->poll_fd, SNDRV_TIMER_IOCTL_GPARAMS, params) < 0)
return -errno;
return 0;
}
static int snd_timer_query_hw_status(snd_timer_query_t *handle, snd_timer_gstatus_t *status)
{
if (!handle || !status)
return -EINVAL;
if (ioctl(handle->poll_fd, SNDRV_TIMER_IOCTL_GSTATUS, status) < 0)
return -errno;
return 0;
}
static snd_timer_query_ops_t snd_timer_query_hw_ops = {
close: snd_timer_query_hw_close,
next_device: snd_timer_query_hw_next_device,
info: snd_timer_query_hw_info,
params: snd_timer_query_hw_params,
status: snd_timer_query_hw_status
};
int snd_timer_query_hw_open(snd_timer_query_t **handle, const char *name, int mode)