From bc3c2b1c27f59bb488035c0e8445d3ce66bb7e9b 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 destination/source of event pointed by index Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 4 ++ src/seq/event-cntr.c | 120 +++++++++++++++++++++++++++++++++++++++ src/seq/event-cntr.h | 11 ++++ tests/alsaseq-event-cntr | 4 ++ 4 files changed, 139 insertions(+) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 4f166f7..ef608c0 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -190,6 +190,10 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_event_cntr_set_queue_id"; "alsaseq_event_cntr_get_tstamp"; "alsaseq_event_cntr_set_tstamp"; + "alsaseq_event_cntr_get_dst"; + "alsaseq_event_cntr_set_dst"; + "alsaseq_event_cntr_get_src"; + "alsaseq_event_cntr_set_src"; local: *; }; diff --git a/src/seq/event-cntr.c b/src/seq/event-cntr.c index e96369e..86924db 100644 --- a/src/seq/event-cntr.c +++ b/src/seq/event-cntr.c @@ -667,3 +667,123 @@ void alsaseq_event_cntr_set_tstamp(ALSASeqEventCntr *self, gsize index, ev->time = *tstamp; } + +/** + * alsaseq_event_cntr_get_dst: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @dst: (out)(transfer none): The destination of event. + * @error: A #GError. + * + * Get the destination of event pointed by index. + */ +void alsaseq_event_cntr_get_dst(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr **dst, 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; + } + + *dst = (const ALSASeqAddr *)&ev->dest; +} + +/** + * alsaseq_event_cntr_set_dst: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @dst: The destination of event. + * @error: A #GError. + * + * Set the destination of event pointed by index. + */ +void alsaseq_event_cntr_set_dst(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr *dst, 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->dest = *dst; +} + +/** + * alsaseq_event_cntr_get_src: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @src: (out)(transfer none): The source of event. + * @error: A #GError. + * + * Get the destination of event pointed by index. + */ +void alsaseq_event_cntr_get_src(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr **src, 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; + } + + *src = (const ALSASeqAddr *)&ev->source; +} + +/** + * alsaseq_event_cntr_set_src: + * @self: A #ALSASeqEventCntr. + * @index: The index of event to set. + * @src: The source of event. + * @error: A #GError. + * + * Set the destination of event pointed by index. + */ +void alsaseq_event_cntr_set_src(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr *src, 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->source = *src; +} diff --git a/src/seq/event-cntr.h b/src/seq/event-cntr.h index 34916d4..46de3df 100644 --- a/src/seq/event-cntr.h +++ b/src/seq/event-cntr.h @@ -7,6 +7,7 @@ #include #include +#include G_BEGIN_DECLS @@ -101,6 +102,16 @@ void alsaseq_event_cntr_get_tstamp(ALSASeqEventCntr *self, gsize index, void alsaseq_event_cntr_set_tstamp(ALSASeqEventCntr *self, gsize index, const ALSASeqTstamp *tstamp, GError **error); +void alsaseq_event_cntr_get_dst(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr **dst, GError **error); +void alsaseq_event_cntr_set_dst(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr *dst, GError **error); + +void alsaseq_event_cntr_get_src(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr **src, GError **error); +void alsaseq_event_cntr_set_src(ALSASeqEventCntr *self, gsize index, + const ALSASeqAddr *src, GError **error); + G_END_DECLS #endif diff --git a/tests/alsaseq-event-cntr b/tests/alsaseq-event-cntr index 55ef029..b6d878e 100644 --- a/tests/alsaseq-event-cntr +++ b/tests/alsaseq-event-cntr @@ -30,6 +30,10 @@ methods = ( 'set_queue_id', 'get_tstamp', 'set_tstamp', + 'get_dst', + 'set_dst', + 'get_src', + 'set_src', ) signals = () -- 2.47.3