From 7e43bc934ab54a81ccd798d326def991d51305a1 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 an API to calculate the amount of cells in pool consumed by a batch of event Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 1 + src/seq/event-cntr.c | 34 ++++++++++++++++++++++++++++++++++ src/seq/event-cntr.h | 3 +++ tests/alsaseq-event-cntr | 1 + 4 files changed, 39 insertions(+) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 745ecd0..d0d9531 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -173,6 +173,7 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_event_cntr_get_type"; "alsaseq_event_cntr_new"; "alsaseq_event_cntr_count_events"; + "alsaseq_event_cntr_calculate_pool_consumption"; local: *; }; diff --git a/src/seq/event-cntr.c b/src/seq/event-cntr.c index 598dbf7..26f47d8 100644 --- a/src/seq/event-cntr.c +++ b/src/seq/event-cntr.c @@ -153,3 +153,37 @@ void alsaseq_event_cntr_count_events(ALSASeqEventCntr *self, gsize *count) while ((ev = event_iterator_next(&iter))) ++(*count); } + +/** + * alsaseq_event_cntr_calculate_pool_consumption: + * @self: A #ALSASeqEventCntr. + * @count: The amount of events for calculation. + * @cells: (out): The amount of cells to be consumed in pool. + * @error: A #GError. + * + * Calculate the amount of cells in client pool to be consumed by a part + * of events in the container. + */ +void alsaseq_event_cntr_calculate_pool_consumption(ALSASeqEventCntr *self, + gsize count, gsize *cells, GError **error) +{ + ALSASeqEventCntrPrivate *priv; + struct event_iterator iter; + struct snd_seq_event *ev; + gsize total; + + g_return_if_fail(ALSASEQ_IS_EVENT_CNTR(self)); + priv = alsaseq_event_cntr_get_instance_private(self); + + *cells = 0; + total = 0; + event_iterator_init(&iter, priv->buf, priv->length, priv->allocated); + while ((ev = event_iterator_next(&iter))) { + gsize size = calculate_event_size(ev, TRUE); + *cells += size /sizeof(*ev); + + if (total == count) + break; + ++total; + } +} diff --git a/src/seq/event-cntr.h b/src/seq/event-cntr.h index ac7caaa..ed22651 100644 --- a/src/seq/event-cntr.h +++ b/src/seq/event-cntr.h @@ -49,6 +49,9 @@ ALSASeqEventCntr *alsaseq_event_cntr_new(guint count, GError **error); void alsaseq_event_cntr_count_events(ALSASeqEventCntr *self, gsize *count); +void alsaseq_event_cntr_calculate_pool_consumption(ALSASeqEventCntr *self, + gsize count, gsize *cells, GError **error); + G_END_DECLS #endif diff --git a/tests/alsaseq-event-cntr b/tests/alsaseq-event-cntr index 8727bf5..19d19a1 100644 --- a/tests/alsaseq-event-cntr +++ b/tests/alsaseq-event-cntr @@ -14,6 +14,7 @@ props = () methods = ( 'new', 'count_events', + 'calculate_pool_consumption', ) signals = () -- 2.47.3