]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user-client: use QueueTimerCommon interface instead of QueueTimer
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 1 Jun 2022 02:35:44 +0000 (11:35 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Thu, 2 Jun 2022 09:33:12 +0000 (18:33 +0900)
Current implementation to handle queue timer is by ALSASeq.QueueTimer
gobject class, and uses boxed object (=structure) to express actual data
of the timer. The implementation is not necessarily convenient to add
more type of queue timer since it requires to add getter/setter of data
to the class.

This commit uses ALSASeq.QueueTimerCommon interface to handle any type
of queue timer in ALSASeq.UserInstance for system call.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/privates.h
src/seq/queue-timer-alsa.c
src/seq/user-client.c
src/seq/user-client.h

index c0c6a6650c7613dc3c5eeba965ffc901b55134a3..e0e38d61f8bda84faf8c53c3ed1e4da9ac91dd13 100644 (file)
@@ -30,8 +30,8 @@ void seq_queue_status_refer_private(ALSASeqQueueStatus *self,
 void seq_queue_tempo_refer_private(ALSASeqQueueTempo *self,
                                    struct snd_seq_queue_tempo **tempo);
 
-void seq_queue_timer_refer_private(ALSASeqQueueTimer *self,
-                                   struct snd_seq_queue_timer **timer);
+void seq_queue_timer_alsa_refer_private(ALSASeqQueueTimerAlsa *self,
+                                        struct snd_seq_queue_timer **timer);
 
 void seq_event_cntr_set_buf(ALSASeqEventCntr *self, guint8 *buf,
                               gsize length);
index 077958a0bb9daa4bea7bc2546df2d124d151135a..6cd7ee54995235198fcaa65a0e7da721b01e9632 100644 (file)
@@ -125,3 +125,10 @@ ALSASeqQueueTimerAlsa *alsaseq_queue_timer_alsa_new()
 {
     return g_object_new(ALSASEQ_TYPE_QUEUE_TIMER_ALSA, NULL);
 }
+
+void seq_queue_timer_alsa_refer_private(ALSASeqQueueTimerAlsa *self,
+                                        struct snd_seq_queue_timer **timer)
+{
+    ALSASeqQueueTimerAlsaPrivate *priv = alsaseq_queue_timer_alsa_get_instance_private(self);
+    *timer = &priv->data;
+}
index f59dab11df75328f782e976ce774052bd2e614f8..d8fae02dad4569e73defa1e2189c5958e568ea96 100644 (file)
@@ -1008,7 +1008,7 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que
  * alsaseq_user_client_set_queue_timer:
  * @self: A [class@UserClient].
  * @queue_id: The numeric ID of queue, except for entries in [enum@SpecificQueueId].
- * @queue_timer: The data of timer for queue.
+ * @queue_timer: The data of timer for queue, which implements [iface@QueueTimerCommon].
  * @error: A [struct@GLib.Error]. Error is generated with domain of `ALSASeq.UserClientError`.
  *
  * Set the data of timer for the queue.
@@ -1019,30 +1019,33 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que
  * Returns: %TRUE when the overall operation finishes successfully, else %FALSE.
  */
 gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 queue_id,
-                                             ALSASeqQueueTimer *queue_timer, GError **error)
+                                             ALSASeqQueueTimerCommon *queue_timer, GError **error)
 {
     ALSASeqUserClientPrivate *priv;
-    struct snd_seq_queue_timer *timer;
+    ALSASeqQueueTimerType timer_type;
+    struct snd_seq_queue_timer *data;
 
     g_return_val_if_fail(ALSASEQ_IS_USER_CLIENT(self), FALSE);
     priv = alsaseq_user_client_get_instance_private(self);
 
-    g_return_val_if_fail(ALSASEQ_IS_QUEUE_TIMER(queue_timer), FALSE);
+    g_return_val_if_fail(ALSASEQ_IS_QUEUE_TIMER_COMMON(queue_timer), FALSE);
     g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
 
-    seq_queue_timer_refer_private(queue_timer, &timer);
+    g_object_get(queue_timer, TIMER_TYPE_PROP_NAME, &timer_type, NULL);
 
-    switch (timer->type) {
+    switch ((int)timer_type) {
     case SNDRV_SEQ_TIMER_ALSA:
+        seq_queue_timer_alsa_refer_private(ALSASEQ_QUEUE_TIMER_ALSA(queue_timer), &data);
         break;
     case SNDRV_SEQ_TIMER_MIDI_CLOCK:
     case SNDRV_SEQ_TIMER_MIDI_TICK:
     default:
+        // Not supported.
         g_return_val_if_reached(FALSE);
     }
 
-    timer->queue = queue_id;
-    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0) {
+    data->queue = queue_id;
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, data) < 0) {
         if (errno == EPERM)
             generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION);
         else
@@ -1057,7 +1060,7 @@ gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 que
  * alsaseq_user_client_get_queue_timer:
  * @self: A [class@UserClient].
  * @queue_id: The numeric ID of queue, except for entries in [enum@SpecificQueueId].
- * @queue_timer: (out): The data of timer for queue.
+ * @queue_timer: (out): The data of timer for queue, which implements [iface@QueueTimerCommon].
  * @error: A [struct@GLib.Error]. Error is generated with domain of `ALSASeq.UserClientError`.
  *
  * Get the data of timer for the queue.
@@ -1068,10 +1071,10 @@ gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 que
  * Returns: %TRUE when the overall operation finishes successfully, else %FALSE.
  */
 gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 queue_id,
-                                             ALSASeqQueueTimer **queue_timer, GError **error)
+                                             ALSASeqQueueTimerCommon **queue_timer, GError **error)
 {
     ALSASeqUserClientPrivate *priv;
-    struct snd_seq_queue_timer *timer;
+    struct snd_seq_queue_timer *dst, data = {0};
 
     g_return_val_if_fail(ALSASEQ_IS_USER_CLIENT(self), FALSE);
     priv = alsaseq_user_client_get_instance_private(self);
@@ -1079,27 +1082,26 @@ gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 que
     g_return_val_if_fail(queue_timer != NULL, FALSE);
     g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
 
-    *queue_timer = g_object_new(ALSASEQ_TYPE_QUEUE_TIMER, NULL);
-    seq_queue_timer_refer_private(*queue_timer, &timer);
-
-    timer->queue = queue_id;
-    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, timer) < 0) {
+    data.queue = queue_id;
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, &data) < 0) {
         generate_syscall_error(error, errno, "ioctl(%s)", "GET_QUEUE_TIMER");
         return FALSE;
     }
 
-    switch (timer->type) {
+    switch (data.type) {
     case SNDRV_SEQ_TIMER_ALSA:
+        *queue_timer = g_object_new(ALSASEQ_TYPE_QUEUE_TIMER_ALSA, NULL);
+        seq_queue_timer_alsa_refer_private(ALSASEQ_QUEUE_TIMER_ALSA(*queue_timer), &dst);
         break;
     case SNDRV_SEQ_TIMER_MIDI_CLOCK:
     case SNDRV_SEQ_TIMER_MIDI_TICK:
     default:
-        // Not available.
-        g_object_unref(*queue_timer);
-        *queue_timer = NULL;
+        // Not supported.
         g_return_val_if_reached(FALSE);
     }
 
+    *dst = data;
+
     return TRUE;
 }
 
index 386141f8c101e5c9f381ff90a0a0d477f5d8cb81..92df834f37e559a2430141dc628e2a255ad38870 100644 (file)
@@ -88,9 +88,9 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que
                                              ALSASeqQueueTempo **queue_tempo, GError **error);
 
 gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 queue_id,
-                                             ALSASeqQueueTimer *queue_timer, GError **error);
+                                             ALSASeqQueueTimerCommon *queue_timer, GError **error);
 gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 queue_id,
-                                             ALSASeqQueueTimer **queue_timer, GError **error);
+                                             ALSASeqQueueTimerCommon **queue_timer, GError **error);
 
 gboolean alsaseq_user_client_remove_events(ALSASeqUserClient *self, ALSASeqRemoveFilter *filter,
                                            GError **error);