]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: queue_timer: define as concrete class instead of abstract class
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 9 Jun 2020 21:13:02 +0000 (06:13 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Thu, 11 Jun 2020 09:25:19 +0000 (18:25 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq.map
src/seq/queue-timer.c
src/seq/queue-timer.h
src/seq/user-client.c
src/seq/user-client.h
tests/alsaseq-queue-timer

index 9117d89ff8fe5ebf261ec24918bdcf62598a30e5..ea610718a232908031cc6027c6164e088dcd631a 100644 (file)
@@ -145,6 +145,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_queue_tempo_set_skew";
 
     "alsaseq_queue_timer_get_type";
+    "alsaseq_queue_timer_new";
     "alsaseq_queue_timer_get_alsa_data";
     "alsaseq_queue_timer_set_alsa_data";
 
index 5921dac1c6d5e141dd7ca90e7d4752258e54e25a..a11da3bb7dc7ade9bae8bc793ea11769ee640b77 100644 (file)
@@ -6,19 +6,17 @@
 /**
  * SECTION: queue-timer
  * @Title: ALSASeqQueueTimer
- * @Short_description: A GObject-derived abstract object to represent timer for
- *                     queue
+ * @Short_description: A GObject-derived object to represent timer for queue
  *
- * A #ALSASeqQueueTimer is a GObject-derived abstract object to represent common
- * properties and methods of timer for queue. Applications can use derived
- * object; ALSASeqQueueTimerAlsa.
+ * A #ALSASeqQueueTimer is a GObject-derived object to represent the information
+ * of timer which drives the queue.
  *
  * The object wraps 'struct snd_seq_queue_timer' in UAPI of Linux sound subsystem.
  */
 struct _ALSASeqQueueTimerPrivate {
     struct snd_seq_queue_timer timer;
 };
-G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ALSASeqQueueTimer, alsaseq_queue_timer, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE(ALSASeqQueueTimer, alsaseq_queue_timer, G_TYPE_OBJECT)
 
 enum seq_queue_timer_prop_type {
     SEQ_QUEUE_TIMER_PROP_QUEUE_ID = 1,
@@ -79,6 +77,18 @@ static void alsaseq_queue_timer_init(ALSASeqQueueTimer *self)
     return;
 }
 
+/**
+ * alsaseq_queue_timer_new:
+ *
+ * Allocate and return the instance of #ALSASeqQueueTimer.
+ *
+ * Returns: the instance of #ALSASeqQueueTimer.
+ */
+ALSASeqQueueTimer *alsaseq_queue_timer_new()
+{
+    return g_object_new(ALSASEQ_TYPE_QUEUE_TIMER, NULL);
+}
+
 /**
  * alsaseq_queue_timer_get_alsa_data:
  * @self: A #ALSASeqQueueTimer.
index 958c2ad23f050a274900ec219dd22fb35d5540a4..8caf03506523b92c442c55b46a6191d182547452 100644 (file)
@@ -48,6 +48,8 @@ struct _ALSASeqQueueTimerClass {
 
 GType alsaseq_queue_timer_get_type() G_GNUC_CONST;
 
+ALSASeqQueueTimer *alsaseq_queue_timer_new();
+
 void alsaseq_queue_timer_get_alsa_data(ALSASeqQueueTimer *self,
                                        const ALSASeqQueueTimerDataAlsa **data);
 void alsaseq_queue_timer_set_alsa_data(ALSASeqQueueTimer *self,
index 67af1e75600be25221a3ed68f25de468ec191019..21ece7b78aab10189e12d33569302661969a09e8 100644 (file)
@@ -749,12 +749,18 @@ void alsaseq_user_client_set_queue_timer(ALSASeqUserClient *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)) {
+    seq_queue_timer_refer_private(queue_timer, &timer);
+
+    switch (timer->type) {
+    case SNDRV_SEQ_TIMER_ALSA:
+        break;
+    case SNDRV_SEQ_TIMER_MIDI_CLOCK:
+    case SNDRV_SEQ_TIMER_MIDI_TICK:
+    default:
         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);
@@ -776,32 +782,33 @@ void alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self,
                                          GError **error)
 {
     ALSASeqUserClientPrivate *priv;
-    struct snd_seq_queue_timer timer, *timer_ptr;
+    struct snd_seq_queue_timer *timer;
 
     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) {
+    *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) {
         generate_error(error, errno);
         return;
     }
 
-    switch (timer.type) {
+    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.
+        g_object_unref(*queue_timer);
+        *queue_timer = NULL;
         generate_error(error, ENXIO);
         return;
     }
-
-    seq_queue_timer_refer_private(*queue_timer, &timer_ptr);
-    *timer_ptr = timer;
 }
 
 /**
index e2ea8a85b6063fd082123b9565cf5b8ab913f382..b11a094d302a999bb97269aa44e4bdb9cc5cb240 100644 (file)
@@ -12,7 +12,6 @@
 #include <seq/queue-info.h>
 #include <seq/queue-tempo.h>
 #include <seq/queue-timer.h>
-#include <seq/queue-timer-alsa.h>
 #include <seq/remove-filter.h>
 #include <seq/event-cntr.h>
 
index 46d492cf0c7be2de5ab1d4ac88457079c2f85070..858ba3a49d287cf0a9a3bec4a63c8ab1577b1c33 100644 (file)
@@ -9,13 +9,14 @@ import gi
 gi.require_version('ALSASeq', '0.0')
 from gi.repository import ALSASeq
 
-target = ALSASeq.QueueTimer
+target = ALSASeq.QueueTimer()
 props = (
     'queue-id',
     'type',
 )
 
 methods = (
+    'new',
     'get_alsa_data',
     'set_alsa_data',
 )