From: Takashi Sakamoto Date: Tue, 9 Jun 2020 21:13:02 +0000 (+0900) Subject: seq: queue_timer: define as concrete class instead of abstract class X-Git-Tag: v0.1.0~94 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=e4ff46552e62bdea6a925a17c5a5f06b124a5f98;p=alsa-gobject.git seq: queue_timer: define as concrete class instead of abstract class Signed-off-by: Takashi Sakamoto --- diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 9117d89..ea61071 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -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"; diff --git a/src/seq/queue-timer.c b/src/seq/queue-timer.c index 5921dac..a11da3b 100644 --- a/src/seq/queue-timer.c +++ b/src/seq/queue-timer.c @@ -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. diff --git a/src/seq/queue-timer.h b/src/seq/queue-timer.h index 958c2ad..8caf035 100644 --- a/src/seq/queue-timer.h +++ b/src/seq/queue-timer.h @@ -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, diff --git a/src/seq/user-client.c b/src/seq/user-client.c index 67af1e7..21ece7b 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -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; } /** diff --git a/src/seq/user-client.h b/src/seq/user-client.h index e2ea8a8..b11a094 100644 --- a/src/seq/user-client.h +++ b/src/seq/user-client.h @@ -12,7 +12,6 @@ #include #include #include -#include #include #include diff --git a/tests/alsaseq-queue-timer b/tests/alsaseq-queue-timer index 46d492c..858ba3a 100644 --- a/tests/alsaseq-queue-timer +++ b/tests/alsaseq-queue-timer @@ -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', )