]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: event_cntr: add an API to calculate the amount of cells in pool consumed by...
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 8 Jun 2020 14:10:10 +0000 (23:10 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Tue, 9 Jun 2020 00:16:09 +0000 (09:16 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq.map
src/seq/event-cntr.c
src/seq/event-cntr.h
tests/alsaseq-event-cntr

index 745ecd05a6cf080981fb821b9092fe87dd5afe20..d0d953107ef2c563e488e4b7483e52c1a8b692de 100644 (file)
@@ -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:
     *;
 };
index 598dbf7f81b0ee368f8758b4d3a25b8a2431e0f6..26f47d87dec67f51ff13f8bf5d9c5039c57ee3bd 100644 (file)
@@ -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;
+    }
+}
index ac7caaa3b52d1e3be668e96971efda0595aeb9bc..ed22651c7b38db1b843946e0c6aa79513beedf73 100644 (file)
@@ -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
index 8727bf53365711986c9769490580ed123ab339a3..19d19a1edf65d82a46dcac682023d31701661f25 100644 (file)
@@ -14,6 +14,7 @@ props = ()
 methods = (
     'new',
     'count_events',
+    'calculate_pool_consumption',
 )
 signals = ()