]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: event-cntr: add internal API to serialize list of events
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 14 Jun 2022 10:23:22 +0000 (19:23 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Thu, 16 Jun 2022 12:52:00 +0000 (21:52 +0900)
ALSASeq.EventCntr still handles batch of events, therefore it's good to
put serialization code into it.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/event-cntr.c
src/seq/privates.h
src/seq/user-client.c

index d53c43beb90a59168886484e1a8d327f06645c2d..86f265d0927666754369ac524e1965a892623e64 100644 (file)
@@ -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].
index 4f51007c410b3810d8e2713cb3a164c5936aeb08..b8d39e9ded7fff080ed84357ffc37d6417cba0df 100644 (file)
@@ -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);
index 0392f860676e894b396a6c1f59f8dfbc7429fbc9..8b6fb88d74bdfbe3d1173d5d55e8f5c2163e6111 100644 (file)
@@ -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);