diff options
author | Jaroslav Kysela <perex@perex.cz> | 2004-04-06 17:29:25 +0000 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2004-04-06 17:29:25 +0000 |
commit | 64a39728a22299155a91c9061d004919f2715c9e (patch) | |
tree | 6882c126dfd1c0f473f049c3249cc14062f421ff | |
parent | dff4d5c466c59a9490b6d6edddbb616c6001916c (diff) |
Added early event extension to the timer API - and a fix for the direct plugins
-rw-r--r-- | include/sound/asound.h | 4 | ||||
-rw-r--r-- | include/timer.h | 7 | ||||
-rw-r--r-- | src/Versions | 7 | ||||
-rw-r--r-- | src/pcm/pcm_direct.c | 1 | ||||
-rw-r--r-- | src/timer/timer.c | 33 |
5 files changed, 46 insertions, 6 deletions
diff --git a/include/sound/asound.h b/include/sound/asound.h index 949b8be3..f7f54809 100644 --- a/include/sound/asound.h +++ b/include/sound/asound.h @@ -538,7 +538,7 @@ enum { * Timer section - /dev/snd/timer */ -#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 1) +#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 2) enum sndrv_timer_class { SNDRV_TIMER_CLASS_NONE = -1, @@ -619,6 +619,7 @@ struct sndrv_timer_info { #define SNDRV_TIMER_PSFLG_AUTO (1<<0) /* auto start, otherwise one-shot */ #define SNDRV_TIMER_PSFLG_EXCLUSIVE (1<<1) /* exclusive use, precise start/stop/pause/continue */ +#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1<<2) /* write early event to the poll queue */ struct sndrv_timer_params { unsigned int flags; /* flags - SNDRV_MIXER_PSFLG_* */ @@ -667,6 +668,7 @@ enum sndrv_timer_event { SNDRV_TIMER_EVENT_STOP, /* val = 0 */ SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */ SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */ + SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */ /* master timer events for slave timer instances */ SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10, SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10, diff --git a/include/timer.h b/include/timer.h index c63e6d2d..d500fc21 100644 --- a/include/timer.h +++ b/include/timer.h @@ -84,6 +84,7 @@ typedef enum _snd_timer_event { SND_TIMER_EVENT_STOP, /* val = 0 */ SND_TIMER_EVENT_CONTINUE, /* val = resolution in ns */ SND_TIMER_EVENT_PAUSE, /* val = 0 */ + SND_TIMER_EVENT_EARLY, /* val = 0 */ /* master timer events for slave timer instances */ SND_TIMER_EVENT_MSTART = SND_TIMER_EVENT_START + 10, SND_TIMER_EVENT_MSTOP = SND_TIMER_EVENT_STOP + 10, @@ -190,10 +191,12 @@ int snd_timer_params_malloc(snd_timer_params_t **ptr); void snd_timer_params_free(snd_timer_params_t *obj); void snd_timer_params_copy(snd_timer_params_t *dst, const snd_timer_params_t *src); -void snd_timer_params_set_auto_start(snd_timer_params_t * params, int auto_start); +int snd_timer_params_set_auto_start(snd_timer_params_t * params, int auto_start); int snd_timer_params_get_auto_start(snd_timer_params_t * params); -void snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive); +int snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive); int snd_timer_params_get_exclusive(snd_timer_params_t * params); +int snd_timer_params_set_early_event(snd_timer_params_t * params, int early_event); +int snd_timer_params_get_early_event(snd_timer_params_t * params); void snd_timer_params_set_ticks(snd_timer_params_t * params, long ticks); long snd_timer_params_get_ticks(snd_timer_params_t * params); void snd_timer_params_set_queue_size(snd_timer_params_t * params, long queue_size); diff --git a/src/Versions b/src/Versions index c4a9d9e5..a9c81809 100644 --- a/src/Versions +++ b/src/Versions @@ -152,3 +152,10 @@ ALSA_1.0.4 { snd_spcm_init_duplex; snd_spcm_init_get_params; } ALSA_0.9.8; + +ALSA_1.0.5 { + global: + + snd_timer_params_set_early_event; + snd_timer_params_get_early_event; +} ALSA_1.0.4; diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index 0c7f4f0b..e76603a8 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -846,6 +846,7 @@ int snd_pcm_direct_initialize_poll_fd(snd_pcm_direct_t *dmix) return ret; } snd_timer_params_set_auto_start(params, 1); + snd_timer_params_set_early_event(params, 1); snd_timer_params_set_ticks(params, 1); ret = snd_timer_params(dmix->timer, params); if (ret < 0) { diff --git a/src/timer/timer.c b/src/timer/timer.c index 608662dd..efb1ba47 100644 --- a/src/timer/timer.c +++ b/src/timer/timer.c @@ -545,13 +545,14 @@ void snd_timer_params_copy(snd_timer_params_t *dst, const snd_timer_params_t *sr * \brief set timer auto start * \param params pointer to #snd_timer_params_t structure */ -void snd_timer_params_set_auto_start(snd_timer_params_t * params, int auto_start) +int snd_timer_params_set_auto_start(snd_timer_params_t * params, int auto_start) { assert(params); if (auto_start) params->flags |= SNDRV_TIMER_PSFLG_AUTO; else params->flags &= ~SNDRV_TIMER_PSFLG_AUTO; + return 0; } /** @@ -570,9 +571,9 @@ int snd_timer_params_get_auto_start(snd_timer_params_t * params) * \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) +int 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) +int snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive) #endif { assert(params); @@ -580,6 +581,7 @@ void snd_timer_params_set_exclusive(snd_timer_params_t * params, int exclusive) params->flags |= SNDRV_TIMER_PSFLG_EXCLUSIVE; else params->flags &= ~SNDRV_TIMER_PSFLG_EXCLUSIVE; + return 0; } use_default_symbol_version(__snd_timer_params_set_exclusive, snd_timer_params_set_exclusive, ALSA_0.9.0); @@ -600,6 +602,31 @@ int snd_timer_params_get_exclusive(snd_timer_params_t * params) use_default_symbol_version(__snd_timer_params_get_exclusive, snd_timer_params_get_exclusive, ALSA_0.9.0); /** + * \brief set timer early event + * \param params pointer to #snd_timer_params_t structure + */ +int snd_timer_params_set_early_event(snd_timer_params_t * params, int early_event) +{ + assert(params); + if (early_event) + params->flags |= SNDRV_TIMER_PSFLG_EARLY_EVENT; + else + params->flags &= ~SNDRV_TIMER_PSFLG_EARLY_EVENT; + return 0; +} + +/** + * \brief determine if timer has early event flag + * \param params pointer to #snd_timer_params_t structure + * \return nonzero if timer has early event flag set + */ +int snd_timer_params_get_early_event(snd_timer_params_t * params) +{ + assert(params); + return params->flags & SNDRV_TIMER_PSFLG_EARLY_EVENT ? 1 : 0; +} + +/** * \brief set timer ticks * \param params pointer to #snd_timer_params_t structure */ |