From 660641485d67cbdf793b177af5e14e2e48353165 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 20 Nov 2019 18:42:30 +0900 Subject: [PATCH] seq: queue_status: add properties and access methods Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 2 + src/seq/queue-status.c | 105 ++++++++++++++++++++++++++++++++++++- src/seq/queue-status.h | 9 ++++ tests/alsaseq-queue-status | 11 +++- 4 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index a5be664..4f427e7 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -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: *; }; diff --git a/src/seq/queue-status.c b/src/seq/queue-status.c index 8a70e12..791042c 100644 --- a/src/seq/queue-status.c +++ b/src/seq/queue-status.c @@ -1,13 +1,116 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "queue-status.h" -G_DEFINE_TYPE(ALSASeqQueueStatus, alsaseq_queue_status, G_TYPE_OBJECT) +#include + +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; +} diff --git a/src/seq/queue-status.h b/src/seq/queue-status.h index 96a8293..da3a2c4 100644 --- a/src/seq/queue-status.h +++ b/src/seq/queue-status.h @@ -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 diff --git a/tests/alsaseq-queue-status b/tests/alsaseq-queue-status index d72a574..082fe7a 100644 --- a/tests/alsaseq-queue-status +++ b/tests/alsaseq-queue-status @@ -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): -- 2.47.3