From c80ff6cdefcba4c9a4992b24067f1b26fbadafe3 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 20 Nov 2019 23:03:47 +0900 Subject: [PATCH] seq: user_client: add APIs to set/get attached timer for queue Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 2 + src/seq/user-client.c | 77 +++++++++++++++++++++++++++++++++++++++ src/seq/user-client.h | 11 ++++++ tests/alsaseq-user-client | 2 + 4 files changed, 92 insertions(+) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index bf39c9b..08b4598 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -59,6 +59,8 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_user_client_set_queue_usage"; "alsaseq_user_client_set_queue_tempo"; "alsaseq_user_client_get_queue_tempo"; + "alsaseq_user_client_set_queue_timer"; + "alsaseq_user_client_get_queue_timer"; "alsaseq_addr_get_type"; "alsaseq_addr_new"; diff --git a/src/seq/user-client.c b/src/seq/user-client.c index d06cba6..30a9658 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -777,3 +777,80 @@ void alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, g_object_unref(*queue_tempo); } } + +/** + * alsaseq_user_client_set_queue_timer: + * @self: A #ALSASeqUserClient. + * @queue_id: The numerical ID of queue, except for entries in + * ALSASeqSpecificQueueId. + * @queue_timer: The data of timer for queue. + * @error: A #GError. + * + * Set the data of timer for the queue. + */ +void alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, + guint queue_id, + ALSASeqQueueTimer *queue_timer, + GError **error) +{ + ALSASeqUserClientPrivate *priv; + struct snd_seq_queue_timer *timer; + + g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self)); + g_return_if_fail(ALSASEQ_IS_QUEUE_TIMER(queue_timer)); + priv = alsaseq_user_client_get_instance_private(self); + + if (ALSASEQ_IS_QUEUE_TIMER_ALSA(queue_timer)) { + generate_error(error, EINVAL); + return; + } + + seq_queue_timer_refer_private(queue_timer, &timer); + timer->queue = queue_id; + if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0) + generate_error(error, errno); +} + +/** + * alsaseq_user_client_get_queue_timer: + * @self: A #ALSASeqUserClient. + * @queue_id: The numerical ID of queue, except for entries in + * ALSASeqSpecificQueueId. + * @queue_timer: (out): The data of timer for queue. + * @error: A #GError. + * + * Get the data of timer for the queue. + */ +void alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, + guint queue_id, + ALSASeqQueueTimer **queue_timer, + GError **error) +{ + ALSASeqUserClientPrivate *priv; + struct snd_seq_queue_timer timer, *timer_ptr; + + g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self)); + g_return_if_fail(queue_timer != NULL); + priv = alsaseq_user_client_get_instance_private(self); + + timer.queue = queue_id; + if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, &timer) < 0) { + generate_error(error, errno); + return; + } + + switch (timer.type) { + case SNDRV_SEQ_TIMER_ALSA: + *queue_timer = ALSASEQ_QUEUE_TIMER(alsaseq_queue_timer_alsa_new()); + break; + case SNDRV_SEQ_TIMER_MIDI_CLOCK: + case SNDRV_SEQ_TIMER_MIDI_TICK: + default: + // Not available. + generate_error(error, ENXIO); + return; + } + + seq_queue_timer_refer_private(*queue_timer, &timer_ptr); + *timer_ptr = timer; +} diff --git a/src/seq/user-client.h b/src/seq/user-client.h index 8307d06..408ca15 100644 --- a/src/seq/user-client.h +++ b/src/seq/user-client.h @@ -14,6 +14,8 @@ #include #include #include +#include +#include G_BEGIN_DECLS @@ -128,6 +130,15 @@ void alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint queue_id, ALSASeqQueueTempo **queue_tempo, GError **error); +void alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, + guint queue_id, + ALSASeqQueueTimer *queue_timer, + GError **error); +void alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, + guint queue_id, + ALSASeqQueueTimer **queue_timer, + GError **error); + G_END_DECLS #endif diff --git a/tests/alsaseq-user-client b/tests/alsaseq-user-client index 64f3004..51b62d3 100644 --- a/tests/alsaseq-user-client +++ b/tests/alsaseq-user-client @@ -33,6 +33,8 @@ methods = ( 'set_queue_usage', 'set_queue_tempo', 'get_queue_tempo', + 'set_queue_timer', + 'get_queue_timer', ) signals = () -- 2.47.3