]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: queue_status: add properties and access methods
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 20 Nov 2019 09:42:30 +0000 (18:42 +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/queue-status.c
src/seq/queue-status.h
tests/alsaseq-queue-status

index a5be66447412d43bf2c5ff2f5c0c3ec0b549c1d5..4f427e74a10fbf357201fe575b93290f88a8e4a4 100644 (file)
@@ -140,6 +140,8 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_queue_info_new";
 
     "alsaseq_queue_status_get_type";
+    "alsaseq_queue_status_get_tick_time";
+    "alsaseq_queue_status_get_real_time";
   local:
     *;
 };
index 8a70e1249b6628e8952b4d94036e74e0caae3215..791042ca41f58069fd881eaa9fb37bd75d34c0e5 100644 (file)
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "queue-status.h"
 
-G_DEFINE_TYPE(ALSASeqQueueStatus, alsaseq_queue_status, G_TYPE_OBJECT)
+#include <sound/asequencer.h>
+
+struct _ALSASeqQueueStatusPrivate {
+    struct snd_seq_queue_status status;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSASeqQueueStatus, alsaseq_queue_status, G_TYPE_OBJECT)
+
+enum seq_queue_status_prop_type {
+    SEQ_QUEUE_STATUS_PROP_QUEUE_ID = 1,
+    SEQ_QUEUE_STATUS_PROP_EVENT_COUNT,
+    SEQ_QUEUE_STATUS_PROP_RUNNING,
+    SEQ_QUEUE_STATUS_PROP_COUNT,
+};
+static GParamSpec *seq_queue_status_props[SEQ_QUEUE_STATUS_PROP_COUNT] = { NULL, };
+
+static void seq_queue_status_get_property(GObject *obj, guint id, GValue *val,
+                                          GParamSpec *spec)
+{
+    ALSASeqQueueStatus *self = ALSASEQ_QUEUE_STATUS(obj);
+    ALSASeqQueueStatusPrivate *priv =
+                                alsaseq_queue_status_get_instance_private(self);
+
+    switch (id) {
+    case SEQ_QUEUE_STATUS_PROP_QUEUE_ID:
+        g_value_set_int(val, priv->status.queue);
+        break;
+    case SEQ_QUEUE_STATUS_PROP_EVENT_COUNT:
+        g_value_set_int(val, priv->status.events);
+        break;
+    case SEQ_QUEUE_STATUS_PROP_RUNNING:
+        g_value_set_boolean(val, priv->status.running);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
 
 static void alsaseq_queue_status_class_init(ALSASeqQueueStatusClass *klass)
 {
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->get_property = seq_queue_status_get_property;
+
+    seq_queue_status_props[SEQ_QUEUE_STATUS_PROP_QUEUE_ID] =
+        g_param_spec_int("queue-id", "queue-id",
+                         "The numerical ID of queue, except for entries in "
+                         "ALSASeqSpecificQueueId.",
+                         G_MININT, G_MAXINT,
+                         -1,
+                         G_PARAM_READABLE);
+
+    seq_queue_status_props[SEQ_QUEUE_STATUS_PROP_EVENT_COUNT] =
+        g_param_spec_int("event-count", "event-count",
+                         "The number of available events in the queue.",
+                         0, G_MAXINT,
+                         0,
+                         G_PARAM_READABLE);
+
+    seq_queue_status_props[SEQ_QUEUE_STATUS_PROP_RUNNING] =
+        g_param_spec_boolean("running", "running",
+                             "Whether the queue is running or not.",
+                             FALSE,
+                             G_PARAM_READABLE);
+
+    g_object_class_install_properties(gobject_class,
+                                      SEQ_QUEUE_STATUS_PROP_COUNT,
+                                      seq_queue_status_props);
 }
 
 static void alsaseq_queue_status_init(ALSASeqQueueStatus *self)
 {
     return;
 }
+
+/**
+ * alsaseq_queue_status_get_tick_time:
+ * @self: A #ALSASeqQueueStatus.
+ * @tick_time: (out): The number of MIDI ticks.
+ *
+ * Get time as MIDI ticks.
+ */
+void alsaseq_queue_status_get_tick_time(ALSASeqQueueStatus *self,
+                                        guint *tick_time)
+{
+    ALSASeqQueueStatusPrivate *priv;
+
+    g_return_if_fail(ALSASEQ_IS_QUEUE_STATUS(self));
+    priv = alsaseq_queue_status_get_instance_private(self);
+
+    *tick_time = priv->status.tick;
+}
+
+/**
+ * alsaseq_queue_status_get_real_time:
+ * @self: A #ALSASeqQueueStatus.
+ * @real_time: (array fixed-size=2)(out)(transfer none): The array with two
+ *             elements for sec part and nsec part of real time.
+ *
+ * Get time as wall-clock time.
+ */
+void alsaseq_queue_status_get_real_time(ALSASeqQueueStatus *self,
+                                        const guint32 **real_time)
+{
+    ALSASeqQueueStatusPrivate *priv;
+
+    g_return_if_fail(ALSASEQ_IS_QUEUE_STATUS(self));
+    priv = alsaseq_queue_status_get_instance_private(self);
+
+    // MEMO: I wish 32-bit storage size is aligned to 32 bit offset in all of
+    // supported ABIs.
+    *real_time = (const guint32 *)&priv->status.time;
+}
index 96a8293bdd746cac26f2d93b96becc3cc51e55f0..da3a2c438450346da9a1a2a43a3acd73000b4421 100644 (file)
@@ -31,9 +31,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSASeqQueueStatus          ALSASeqQueueStatus;
 typedef struct _ALSASeqQueueStatusClass     ALSASeqQueueStatusClass;
+typedef struct _ALSASeqQueueStatusPrivate   ALSASeqQueueStatusPrivate;
 
 struct _ALSASeqQueueStatus {
     GObject parent_instance;
+
+    ALSASeqQueueStatusPrivate *priv;
 };
 
 struct _ALSASeqQueueStatusClass {
@@ -42,6 +45,12 @@ struct _ALSASeqQueueStatusClass {
 
 GType alsaseq_queue_status_get_type() G_GNUC_CONST;
 
+void alsaseq_queue_status_get_tick_time(ALSASeqQueueStatus *self,
+                                        guint *tick_time);
+
+void alsaseq_queue_status_get_real_time(ALSASeqQueueStatus *self,
+                                        const guint32 **real_time);
+
 G_END_DECLS
 
 #endif
index d72a574be6a2657776dae867a5f53c88f8a47296..082fe7a12cc3fb64fad6e47d617b4715ae688749 100644 (file)
@@ -10,8 +10,15 @@ gi.require_version('ALSASeq', '0.0')
 from gi.repository import ALSASeq
 
 target = ALSASeq.QueueStatus()
-props = ()
-methods = ()
+props = (
+    'queue-id',
+    'event-count',
+    'running',
+)
+methods = (
+    'get_tick_time',
+    'get_real_time',
+)
 signals = ()
 
 if not test(target, props, methods, signals):