]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user_client: add APIs to set/get attached timer for queue
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 20 Nov 2019 14:03:47 +0000 (23:03 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Tue, 7 Apr 2020 08:08:24 +0000 (17:08 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq.map
src/seq/user-client.c
src/seq/user-client.h
tests/alsaseq-user-client

index bf39c9b6484a75573187841baef8063b8c5aff36..08b45982e7d61b389fe1b547ee9458dfb23d66bf 100644 (file)
@@ -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";
index d06cba6c384ecc8617bac594af51497f03428ba9..30a9658a6c017b2342b0aea0419354ea3dd0aa6d 100644 (file)
@@ -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;
+}
index 8307d066e11bafab5a95b2c23d16e3b4285c8d11..408ca1590e4d53349cf8a5192a75e2237d681961 100644 (file)
@@ -14,6 +14,8 @@
 #include <seq/subscribe-data.h>
 #include <seq/queue-info.h>
 #include <seq/queue-tempo.h>
+#include <seq/queue-timer.h>
+#include <seq/queue-timer-alsa.h>
 
 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
index 64f30043a579e534f5af26ae3346b7566b6f2b06..51b62d358b99e612465983d333eb16b6d3caa1ee 100644 (file)
@@ -33,6 +33,8 @@ methods = (
     'set_queue_usage',
     'set_queue_tempo',
     'get_queue_tempo',
+    'set_queue_timer',
+    'get_queue_timer',
 )
 signals = ()