From: Takashi Sakamoto Date: Wed, 1 Jun 2022 02:35:44 +0000 (+0900) Subject: seq: user-client: use QueueTimerCommon interface instead of QueueTimer X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=86a6b61c64ae791f1eb8371faa92917c8d8d5a28;p=alsa-gobject.git seq: user-client: use QueueTimerCommon interface instead of QueueTimer Current implementation to handle queue timer is by ALSASeq.QueueTimer gobject class, and uses boxed object (=structure) to express actual data of the timer. The implementation is not necessarily convenient to add more type of queue timer since it requires to add getter/setter of data to the class. This commit uses ALSASeq.QueueTimerCommon interface to handle any type of queue timer in ALSASeq.UserInstance for system call. Signed-off-by: Takashi Sakamoto --- diff --git a/src/seq/privates.h b/src/seq/privates.h index c0c6a66..e0e38d6 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -30,8 +30,8 @@ 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); +void seq_queue_timer_alsa_refer_private(ALSASeqQueueTimerAlsa *self, + struct snd_seq_queue_timer **timer); void seq_event_cntr_set_buf(ALSASeqEventCntr *self, guint8 *buf, gsize length); diff --git a/src/seq/queue-timer-alsa.c b/src/seq/queue-timer-alsa.c index 077958a..6cd7ee5 100644 --- a/src/seq/queue-timer-alsa.c +++ b/src/seq/queue-timer-alsa.c @@ -125,3 +125,10 @@ ALSASeqQueueTimerAlsa *alsaseq_queue_timer_alsa_new() { return g_object_new(ALSASEQ_TYPE_QUEUE_TIMER_ALSA, NULL); } + +void seq_queue_timer_alsa_refer_private(ALSASeqQueueTimerAlsa *self, + struct snd_seq_queue_timer **timer) +{ + ALSASeqQueueTimerAlsaPrivate *priv = alsaseq_queue_timer_alsa_get_instance_private(self); + *timer = &priv->data; +} diff --git a/src/seq/user-client.c b/src/seq/user-client.c index f59dab1..d8fae02 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -1008,7 +1008,7 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que * alsaseq_user_client_set_queue_timer: * @self: A [class@UserClient]. * @queue_id: The numeric ID of queue, except for entries in [enum@SpecificQueueId]. - * @queue_timer: The data of timer for queue. + * @queue_timer: The data of timer for queue, which implements [iface@QueueTimerCommon]. * @error: A [struct@GLib.Error]. Error is generated with domain of `ALSASeq.UserClientError`. * * Set the data of timer for the queue. @@ -1019,30 +1019,33 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que * Returns: %TRUE when the overall operation finishes successfully, else %FALSE. */ gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 queue_id, - ALSASeqQueueTimer *queue_timer, GError **error) + ALSASeqQueueTimerCommon *queue_timer, GError **error) { ALSASeqUserClientPrivate *priv; - struct snd_seq_queue_timer *timer; + ALSASeqQueueTimerType timer_type; + struct snd_seq_queue_timer *data; g_return_val_if_fail(ALSASEQ_IS_USER_CLIENT(self), FALSE); priv = alsaseq_user_client_get_instance_private(self); - g_return_val_if_fail(ALSASEQ_IS_QUEUE_TIMER(queue_timer), FALSE); + g_return_val_if_fail(ALSASEQ_IS_QUEUE_TIMER_COMMON(queue_timer), FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); - seq_queue_timer_refer_private(queue_timer, &timer); + g_object_get(queue_timer, TIMER_TYPE_PROP_NAME, &timer_type, NULL); - switch (timer->type) { + switch ((int)timer_type) { case SNDRV_SEQ_TIMER_ALSA: + seq_queue_timer_alsa_refer_private(ALSASEQ_QUEUE_TIMER_ALSA(queue_timer), &data); break; case SNDRV_SEQ_TIMER_MIDI_CLOCK: case SNDRV_SEQ_TIMER_MIDI_TICK: default: + // Not supported. g_return_val_if_reached(FALSE); } - timer->queue = queue_id; - if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0) { + data->queue = queue_id; + if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, data) < 0) { if (errno == EPERM) generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION); else @@ -1057,7 +1060,7 @@ gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 que * alsaseq_user_client_get_queue_timer: * @self: A [class@UserClient]. * @queue_id: The numeric ID of queue, except for entries in [enum@SpecificQueueId]. - * @queue_timer: (out): The data of timer for queue. + * @queue_timer: (out): The data of timer for queue, which implements [iface@QueueTimerCommon]. * @error: A [struct@GLib.Error]. Error is generated with domain of `ALSASeq.UserClientError`. * * Get the data of timer for the queue. @@ -1068,10 +1071,10 @@ gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 que * Returns: %TRUE when the overall operation finishes successfully, else %FALSE. */ gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 queue_id, - ALSASeqQueueTimer **queue_timer, GError **error) + ALSASeqQueueTimerCommon **queue_timer, GError **error) { ALSASeqUserClientPrivate *priv; - struct snd_seq_queue_timer *timer; + struct snd_seq_queue_timer *dst, data = {0}; g_return_val_if_fail(ALSASEQ_IS_USER_CLIENT(self), FALSE); priv = alsaseq_user_client_get_instance_private(self); @@ -1079,27 +1082,26 @@ gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 que g_return_val_if_fail(queue_timer != NULL, FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); - *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) { + data.queue = queue_id; + if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, &data) < 0) { generate_syscall_error(error, errno, "ioctl(%s)", "GET_QUEUE_TIMER"); return FALSE; } - switch (timer->type) { + switch (data.type) { case SNDRV_SEQ_TIMER_ALSA: + *queue_timer = g_object_new(ALSASEQ_TYPE_QUEUE_TIMER_ALSA, NULL); + seq_queue_timer_alsa_refer_private(ALSASEQ_QUEUE_TIMER_ALSA(*queue_timer), &dst); break; case SNDRV_SEQ_TIMER_MIDI_CLOCK: case SNDRV_SEQ_TIMER_MIDI_TICK: default: - // Not available. - g_object_unref(*queue_timer); - *queue_timer = NULL; + // Not supported. g_return_val_if_reached(FALSE); } + *dst = data; + return TRUE; } diff --git a/src/seq/user-client.h b/src/seq/user-client.h index 386141f..92df834 100644 --- a/src/seq/user-client.h +++ b/src/seq/user-client.h @@ -88,9 +88,9 @@ gboolean alsaseq_user_client_get_queue_tempo(ALSASeqUserClient *self, guint8 que ALSASeqQueueTempo **queue_tempo, GError **error); gboolean alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self, guint8 queue_id, - ALSASeqQueueTimer *queue_timer, GError **error); + ALSASeqQueueTimerCommon *queue_timer, GError **error); gboolean alsaseq_user_client_get_queue_timer(ALSASeqUserClient *self, guint8 queue_id, - ALSASeqQueueTimer **queue_timer, GError **error); + ALSASeqQueueTimerCommon **queue_timer, GError **error); gboolean alsaseq_user_client_remove_events(ALSASeqUserClient *self, ALSASeqRemoveFilter *filter, GError **error);