From 6e82db25858f05d06634f39b816cb0dd7266a0fe Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 27 Jun 2022 17:46:54 +0900 Subject: [PATCH] event: add public API to compute pool consumption when scheduling event In design of ALSA Sequencer, delivery of event consumes cell in client pool. For usual event, it's one cell. For variable length of event, it's multiple cells including the total length of event. ALSASeq.ClientPool class has properties to express the number of cells and free cells in client pool. When comparing to the properties, applications get to know whether the scheduling operation is blocked or not. Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 1 + src/seq/event.c | 16 ++++++++++++++++ src/seq/event.h | 2 ++ tests/alsaseq-event | 1 + 4 files changed, 20 insertions(+) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 73f9ab1..7de2c8a 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -217,6 +217,7 @@ ALSA_GOBJECT_0_3_0 { "alsaseq_event_set_connect_data"; "alsaseq_event_get_result_data"; "alsaseq_event_set_result_data"; + "alsaseq_event_calculate_pool_consumption"; "alsaseq_user_client_schedule_events"; "alsaseq_user_client_schedule_event"; diff --git a/src/seq/event.c b/src/seq/event.c index ca5872f..4cf1f70 100644 --- a/src/seq/event.c +++ b/src/seq/event.c @@ -1620,6 +1620,22 @@ gboolean alsaseq_event_set_result_data(ALSASeqEvent *self, const ALSASeqEventDat return TRUE; } +/** + * alsaseq_event_calculate_pool_consumption: + * @self: A [struct@Event]. + * @cells: (out): The number of consumed cells in client pool. + * + * Calculate the number of cells in client pool to be consumed when the event is delivered. + * The comparison to properties of [class@ClientPool] is useful when scheduling the event. + */ +void alsaseq_event_calculate_pool_consumption(const ALSASeqEvent *self, guint *cells) +{ + g_return_if_fail(self != NULL); + g_return_if_fail(cells != NULL); + + *cells = seq_event_calculate_flattened_length(self, TRUE) / sizeof(*self); +} + void seq_event_copy_flattened(const ALSASeqEvent *self, guint8 *buf, gsize length) { memcpy(buf, self, sizeof(*self)); diff --git a/src/seq/event.h b/src/seq/event.h index 0d040f4..d18e5f4 100644 --- a/src/seq/event.h +++ b/src/seq/event.h @@ -107,6 +107,8 @@ gboolean alsaseq_event_get_result_data(const ALSASeqEvent *self, gboolean alsaseq_event_set_result_data(ALSASeqEvent *self, const ALSASeqEventDataResult *data, GError **error); +void alsaseq_event_calculate_pool_consumption(const ALSASeqEvent *self, guint *cells); + G_END_DECLS #endif diff --git a/tests/alsaseq-event b/tests/alsaseq-event index bb409d3..072df91 100644 --- a/tests/alsaseq-event +++ b/tests/alsaseq-event @@ -55,6 +55,7 @@ methods = ( 'set_connect_data', 'get_result_data', 'set_result_data', + 'calculate_pool_consumption', ) if not test_struct(target_type, methods): -- 2.47.3