From 16aae0779f072702ab0c1f36700a9fbec2b92e15 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 20 Nov 2019 22:41:48 +0900 Subject: [PATCH] seq: queue_timer_alsa: add properties and constructor Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 1 + src/seq/privates.h | 4 ++ src/seq/queue-timer-alsa.c | 89 +++++++++++++++++++++++++++++++++- src/seq/queue-timer-alsa.h | 2 + src/seq/queue-timer.c | 9 ++++ src/seq/queue-timer.h | 1 + tests/alsaseq-queue-timer-alsa | 9 +++- 7 files changed, 112 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 7b6accc..bf39c9b 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -156,6 +156,7 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_queue_timer_get_type"; "alsaseq_queue_timer_alsa_get_type"; + "alsaseq_queue_timer_alsa_new"; local: *; }; diff --git a/src/seq/privates.h b/src/seq/privates.h index c6b9cd0..6556e21 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -16,6 +16,7 @@ #include "queue-info.h" #include "queue-status.h" #include "queue-tempo.h" +#include "queue-timer.h" #include @@ -53,6 +54,9 @@ 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); + G_END_DECLS #endif diff --git a/src/seq/queue-timer-alsa.c b/src/seq/queue-timer-alsa.c index 66eaf2d..16aeb4f 100644 --- a/src/seq/queue-timer-alsa.c +++ b/src/seq/queue-timer-alsa.c @@ -1,14 +1,101 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "queue-timer-alsa.h" +#include "privates.h" G_DEFINE_TYPE(ALSASeqQueueTimerAlsa, alsaseq_queue_timer_alsa, ALSASEQ_TYPE_QUEUE_TIMER) +enum seq_queue_timer_alsa_prop_type { + SEQ_QUEUE_TIMER_ALSA_PROP_TIMER_DEVICE_ID = 1, + SEQ_QUEUE_TIMER_ALSA_PROP_RESOLUTION, + SEQ_QUEUE_TIMER_ALSA_PROP_COUNT, +}; +static GParamSpec *seq_queue_timer_alsa_props[SEQ_QUEUE_TIMER_ALSA_PROP_COUNT] = { NULL, }; + +static void seq_queue_timer_alsa_set_property(GObject *obj, guint id, + const GValue *val, GParamSpec *spec) +{ + ALSASeqQueueTimer *parent = ALSASEQ_QUEUE_TIMER(obj); + struct snd_seq_queue_timer *timer; + + seq_queue_timer_refer_private(parent, &timer); + + switch (id) { + case SEQ_QUEUE_TIMER_ALSA_PROP_TIMER_DEVICE_ID: + { + ALSATimerDeviceId *device_id = g_value_get_boxed(val); + timer->u.alsa.id = *device_id; + break; + } + case SEQ_QUEUE_TIMER_ALSA_PROP_RESOLUTION: + timer->u.alsa.resolution = g_value_get_uint(val); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + +static void seq_queue_timer_alsa_get_property(GObject *obj, guint id, + GValue *val, GParamSpec *spec) +{ + ALSASeqQueueTimer *parent = ALSASEQ_QUEUE_TIMER(obj); + struct snd_seq_queue_timer *timer; + + seq_queue_timer_refer_private(parent, &timer); + + switch (id) { + case SEQ_QUEUE_TIMER_ALSA_PROP_TIMER_DEVICE_ID: + { + g_value_set_static_boxed(val, &timer->u.alsa.id); + break; + } + case SEQ_QUEUE_TIMER_ALSA_PROP_RESOLUTION: + g_value_set_uint(val, timer->u.alsa.resolution); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + static void alsaseq_queue_timer_alsa_class_init(ALSASeqQueueTimerAlsaClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->set_property = seq_queue_timer_alsa_set_property; + gobject_class->get_property = seq_queue_timer_alsa_get_property; + + seq_queue_timer_alsa_props[SEQ_QUEUE_TIMER_ALSA_PROP_TIMER_DEVICE_ID] = + g_param_spec_boxed("timer-device-id", "timer-device-id", + "The device id for used timer.", + ALSATIMER_TYPE_DEVICE_ID, + G_PARAM_READWRITE); + + seq_queue_timer_alsa_props[SEQ_QUEUE_TIMER_ALSA_PROP_RESOLUTION] = + g_param_spec_uint("resolution", "resolution", + "The resolution of timer in Hz.", + 10, 6250, + 1000, + G_PARAM_READWRITE); + + g_object_class_install_properties(gobject_class, + SEQ_QUEUE_TIMER_ALSA_PROP_COUNT, + seq_queue_timer_alsa_props); } static void alsaseq_queue_timer_alsa_init(ALSASeqQueueTimerAlsa *self) { return; } + +/** + * alsaseq_queue_timer_alsa_new: + * + * Allocate and return an instance of ALSASeqQueueTimerAlsa. + * + * Returns: A #ALSASeqQueueTimerAlsa. + */ +ALSASeqQueueTimerAlsa *alsaseq_queue_timer_alsa_new() +{ + return g_object_new(ALSASEQ_TYPE_QUEUE_TIMER_ALSA, NULL); +} diff --git a/src/seq/queue-timer-alsa.h b/src/seq/queue-timer-alsa.h index 8344f56..6c879d4 100644 --- a/src/seq/queue-timer-alsa.h +++ b/src/seq/queue-timer-alsa.h @@ -45,6 +45,8 @@ struct _ALSASeqQueueTimerAlsaClass { GType alsaseq_queue_timer_alsa_get_type() G_GNUC_CONST; +ALSASeqQueueTimerAlsa *alsaseq_queue_timer_alsa_new(); + G_END_DECLS #endif diff --git a/src/seq/queue-timer.c b/src/seq/queue-timer.c index 4e7eb4e..09e7b09 100644 --- a/src/seq/queue-timer.c +++ b/src/seq/queue-timer.c @@ -87,3 +87,12 @@ static void alsaseq_queue_timer_init(ALSASeqQueueTimer *self) { return; } + +void seq_queue_timer_refer_private(ALSASeqQueueTimer *self, + struct snd_seq_queue_timer **timer) +{ + ALSASeqQueueTimerPrivate *priv = + alsaseq_queue_timer_get_instance_private(self); + + *timer = &priv->timer; +} diff --git a/src/seq/queue-timer.h b/src/seq/queue-timer.h index c6abc6f..0315e46 100644 --- a/src/seq/queue-timer.h +++ b/src/seq/queue-timer.h @@ -6,6 +6,7 @@ #include #include +#include G_BEGIN_DECLS diff --git a/tests/alsaseq-queue-timer-alsa b/tests/alsaseq-queue-timer-alsa index 8cd467b..245b7e7 100644 --- a/tests/alsaseq-queue-timer-alsa +++ b/tests/alsaseq-queue-timer-alsa @@ -10,8 +10,13 @@ gi.require_version('ALSASeq', '0.0') from gi.repository import ALSASeq target = ALSASeq.QueueTimerAlsa() -props = () -methods = () +props = ( + 'timer-device-id', + 'resolution', +) +methods = ( + 'new', +) signals = () if not test(target, props, methods, signals): -- 2.47.3