summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2004-04-06 17:29:25 +0000
committerJaroslav Kysela <perex@perex.cz>2004-04-06 17:29:25 +0000
commit64a39728a22299155a91c9061d004919f2715c9e (patch)
tree6882c126dfd1c0f473f049c3249cc14062f421ff
parentdff4d5c466c59a9490b6d6edddbb616c6001916c (diff)
Added early event extension to the timer API - and a fix for the direct plugins
-rw-r--r--include/sound/asound.h4
-rw-r--r--include/timer.h7
-rw-r--r--src/Versions7
-rw-r--r--src/pcm/pcm_direct.c1
-rw-r--r--src/timer/timer.c33
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
*/