From 06e113ea5c622ebe8add721bedc1596175e8ba14 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 8 Jun 2020 23:10:10 +0900 Subject: [PATCH] seq: event_cntr: add accesor APIs for the priority mode of event pointed by index Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 2 ++ src/seq/event-cntr.c | 63 ++++++++++++++++++++++++++++++++++++++++ src/seq/event-cntr.h | 7 +++++ tests/alsaseq-event-cntr | 2 ++ 4 files changed, 74 insertions(+) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 66dd8f8..93729dd 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -182,6 +182,8 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_event_cntr_set_time_mode"; "alsaseq_event_cntr_get_length_mode"; "alsaseq_event_cntr_set_length_mode"; + "alsaseq_event_cntr_get_priority_mode"; + "alsaseq_event_cntr_set_priority_mode"; local: *; }; diff --git a/src/seq/event-cntr.c b/src/seq/event-cntr.c index 64e5cc2..ca8ef3c 100644 --- a/src/seq/event-cntr.c +++ b/src/seq/event-cntr.c @@ -420,3 +420,66 @@ void alsaseq_event_cntr_get_length_mode(ALSASeqEventCntr *self, gsize index, *mode = (ALSASeqEventLengthMode)(ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK); } + +/** + * alsaseq_event_cntr_get_priority_mode: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @mode: (out): The mode of priority, one of #ALSASeqEventPriorityMode. + * @error: A #GError. + * + * Get the mode of priority for the event pointed by the index. + */ +void alsaseq_event_cntr_get_priority_mode( + ALSASeqEventCntr *self, gsize index, + ALSASeqEventPriorityMode *mode, GError **error) +{ + ALSASeqEventCntrPrivate *priv; + struct event_iterator iter; + struct snd_seq_event *ev; + + g_return_if_fail(ALSASEQ_IS_EVENT_CNTR(self)); + priv = alsaseq_event_cntr_get_instance_private(self); + + event_iterator_init(&iter, priv->buf, priv->length, priv->allocated); + + ev = event_iterator_find(&iter, index); + if (ev == NULL) { + generate_error(error, ENOENT); + return; + } + + *mode = (ALSASeqEventPriorityMode)(ev->flags & SNDRV_SEQ_PRIORITY_MASK); +} + +/** + * alsaseq_event_cntr_set_priority_mode: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @mode: The mode of priority, one of #ALSASeqEventPriorityMode. + * @error: A #GError. + * + * Set the mode of priority for the event pointed by the index. + */ +void alsaseq_event_cntr_set_priority_mode( + ALSASeqEventCntr *self, gsize index, + ALSASeqEventPriorityMode mode, GError **error) +{ + ALSASeqEventCntrPrivate *priv; + struct event_iterator iter; + struct snd_seq_event *ev; + + g_return_if_fail(ALSASEQ_IS_EVENT_CNTR(self)); + priv = alsaseq_event_cntr_get_instance_private(self); + + event_iterator_init(&iter, priv->buf, priv->length, priv->allocated); + + ev = event_iterator_find(&iter, index); + if (ev == NULL) { + generate_error(error, ENOENT); + return; + } + + ev->flags &= ~SNDRV_SEQ_PRIORITY_MASK; + ev->flags |= (unsigned char)mode; +} diff --git a/src/seq/event-cntr.h b/src/seq/event-cntr.h index 7dc3621..2837543 100644 --- a/src/seq/event-cntr.h +++ b/src/seq/event-cntr.h @@ -78,6 +78,13 @@ void alsaseq_event_cntr_get_length_mode(ALSASeqEventCntr *self, gsize index, ALSASeqEventLengthMode *mode, GError **error); +void alsaseq_event_cntr_get_priority_mode( + ALSASeqEventCntr *self, gsize index, + ALSASeqEventPriorityMode *mode, GError **error); +void alsaseq_event_cntr_set_priority_mode( + ALSASeqEventCntr *self, gsize index, + ALSASeqEventPriorityMode mode, GError **error); + G_END_DECLS #endif diff --git a/tests/alsaseq-event-cntr b/tests/alsaseq-event-cntr index b32a67d..0f4f018 100644 --- a/tests/alsaseq-event-cntr +++ b/tests/alsaseq-event-cntr @@ -22,6 +22,8 @@ methods = ( 'get_time_mode', 'set_time_mode', 'get_length_mode', + 'get_priority_mode', + 'set_priority_mode', ) signals = () -- 2.47.3