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].
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);
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;
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;
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);