From: Takashi Sakamoto Date: Tue, 14 Jun 2022 10:23:22 +0000 (+0900) Subject: seq: event-cntr: add internal API to serialize list of events X-Git-Tag: v0.3.0~85 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=8756784899b71ada1b33f5c9c9a7d01f162147b0;p=alsa-gobject.git seq: event-cntr: add internal API to serialize list of events ALSASeq.EventCntr still handles batch of events, therefore it's good to put serialization code into it. Signed-off-by: Takashi Sakamoto --- diff --git a/src/seq/event-cntr.c b/src/seq/event-cntr.c index d53c43b..86f265d 100644 --- a/src/seq/event-cntr.c +++ b/src/seq/event-cntr.c @@ -66,6 +66,53 @@ static struct snd_seq_event *seq_event_iter_next(struct seq_event_iter *iter) return NULL; } +void seq_event_cntr_serialize(ALSASeqEventCntr *self, const GList *events, gboolean aligned) +{ + const GList *entry; + gsize total_length; + guint8 *buf; + gsize pos; + + g_return_if_fail(self != NULL); + g_return_if_fail(events != NULL); + + // Calculate total length of flattened events. + total_length = 0; + for (entry = events; entry != NULL; entry = g_list_next(entry)) { + const struct snd_seq_event *ev = (const struct snd_seq_event *)entry->data; + + g_return_if_fail(ev != NULL); + + total_length += seq_event_calculate_flattened_length(ev, aligned); + } + + // Nothing to do. + if (total_length == 0) + return; + + buf = g_malloc0(total_length); + + pos = 0; + for (entry = events; entry != NULL; entry = g_list_next(entry)) { + const struct snd_seq_event *ev = (const struct snd_seq_event *)entry->data; + gsize length; + + g_return_if_fail(ev != NULL); + + length = seq_event_calculate_flattened_length(ev, aligned); + seq_event_copy_flattened(ev, buf + pos, length); + pos += length; + } + + g_return_if_fail(total_length == pos); + + g_free(self->buf); + + self->buf = buf; + self->length = total_length; + self->aligned = aligned; +} + /** * alsaseq_event_cntr_deserialize: * @self: A [struct@EventCntr]. diff --git a/src/seq/privates.h b/src/seq/privates.h index 4f51007..b8d39e9 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -39,6 +39,7 @@ void seq_event_cntr_set_buf(ALSASeqEventCntr *self, guint8 *buf, void seq_event_cntr_get_buf(ALSASeqEventCntr *self, gsize count, const guint8 **buf, gsize *length); +void seq_event_cntr_serialize(ALSASeqEventCntr *self, const GList *events, gboolean aligned); void seq_event_copy_flattened(const ALSASeqEvent *self, guint8 *buf, gsize length); gsize seq_event_calculate_flattened_length(const ALSASeqEvent *self, gboolean aligned); gboolean seq_event_is_deliverable(const ALSASeqEvent *self); diff --git a/src/seq/user-client.c b/src/seq/user-client.c index 0392f86..8b6fb88 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -617,10 +617,9 @@ gboolean alsaseq_user_client_schedule_events(ALSASeqUserClient *self, const GLis gsize *count, GError **error) { ALSASeqUserClientPrivate *priv; + ALSASeqEventCntr cntr = { 0 }; const GList *entry; gsize index; - gsize total_length; - guint8 *buf; gsize pos; ssize_t result; gsize scheduled; @@ -630,9 +629,7 @@ gboolean alsaseq_user_client_schedule_events(ALSASeqUserClient *self, const GLis g_return_val_if_fail(error == NULL || *error == NULL, FALSE); - // Calculate total length of flattened and unaligned events. index = 0; - total_length = 0; for (entry = events; entry != NULL; entry = g_list_next(entry)) { const struct snd_seq_event *ev = (const struct snd_seq_event *)entry->data; @@ -644,33 +641,17 @@ gboolean alsaseq_user_client_schedule_events(ALSASeqUserClient *self, const GLis index); return FALSE; } - - total_length += seq_event_calculate_flattened_length(ev, FALSE); ++index; } + seq_event_cntr_serialize(&cntr, events, FALSE); + // Nothing to do. - if (total_length == 0) + if (cntr.length == 0) return TRUE; - buf = g_malloc0(total_length); - - pos = 0; - for (entry = events; entry != NULL; entry = g_list_next(entry)) { - const struct snd_seq_event *ev = (const struct snd_seq_event *)entry->data; - gsize length; - - g_return_val_if_fail(ev != NULL, FALSE); - - length = seq_event_calculate_flattened_length(ev, FALSE); - seq_event_copy_flattened(ev, buf + pos, length); - pos += length; - } - - g_return_val_if_fail(total_length == pos, FALSE); - - result = write(priv->fd, buf, total_length); - g_free(buf); + result = write(priv->fd, cntr.buf, cntr.length); + g_free(cntr.buf); if (result < 0) { GFileError code = g_file_error_from_errno(errno);