]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: event_cntr: add accesor APIs for note data of event pointed by index
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 ef608c0d38a1ce7899042076eb5b2f26e58234bb..4c852efb27d936bf6715e90d62b130d372bd1121 100644 (file)
@@ -194,6 +194,8 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_event_cntr_set_dst";
     "alsaseq_event_cntr_get_src";
     "alsaseq_event_cntr_set_src";
+    "alsaseq_event_cntr_get_note_data";
+    "alsaseq_event_cntr_set_note_data";
   local:
     *;
 };
index 86924db8dbaebe99f10d059921c748cfccf5da59..d1a848d73f66d837def5a52a835dbf33fa58b387 100644 (file)
@@ -787,3 +787,97 @@ void alsaseq_event_cntr_set_src(ALSASeqEventCntr *self, gsize index,
 
     ev->source = *src;
 }
+
+static void ensure_fixed_length_event(ALSASeqEventCntrPrivate *priv,
+                                      struct snd_seq_event *ev, GError **error)
+{
+    if (!priv->allocated) {
+        generate_error(error, ENOBUFS);
+        return;
+    }
+
+    switch (ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) {
+    case SNDRV_SEQ_EVENT_LENGTH_VARIABLE:
+    {
+        // Truncate blob area.
+        guint8 *pos = (guint8 *)ev;
+        guint8 *next_ev = pos + sizeof(*ev) + ev->data.ext.len;
+        ptrdiff_t to_tail = priv->length - (next_ev - priv->buf);
+
+        memcpy(pos + sizeof(*ev), next_ev, to_tail);
+
+        priv->length -= ev->data.ext.len;
+        break;
+    }
+    default:
+        break;
+    }
+
+    ev->data.ext.ptr = NULL;
+    ev->data.ext.len = 0;
+
+    ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK;
+    ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED;
+}
+
+/**
+ * alsaseq_event_cntr_get_note_data:
+ * @self: A #ALSASeqEventCntr.
+ * @index: The index of event to set.
+ * @data: (out)(transfer none): The note data of event.
+ * @error: A #GError.
+ *
+ * Get the note data of event pointed by the index.
+ */
+void alsaseq_event_cntr_get_note_data(ALSASeqEventCntr *self, gsize index,
+                            const ALSASeqEventDataNote **data, GError **error)
+{
+    ALSASeqEventCntrPrivate *priv;
+    struct event_iterator iter;
+    struct snd_seq_event *ev;
+
+    g_return_if_fail(ALSASEQ_IS_EVENT_CNTR(self));
+    priv = alsaseq_event_cntr_get_instance_private(self);
+
+    event_iterator_init(&iter, priv->buf, priv->length, priv->allocated);
+    ev = event_iterator_find(&iter, index);
+    if (ev == NULL) {
+        generate_error(error, EINVAL);
+        return;
+    }
+
+    *data = (const ALSASeqEventDataNote *)&ev->data.note;
+}
+
+/**
+ * alsaseq_event_cntr_set_note_data:
+ * @self: A #ALSASeqEventCntr.
+ * @index: The index of event to set.
+ * @data: The note data of event.
+ * @error: A #GError.
+ *
+ * Copy the note data to the event pointed by the index.
+ */
+void alsaseq_event_cntr_set_note_data(ALSASeqEventCntr *self, gsize index,
+                            const ALSASeqEventDataNote *data, GError **error)
+{
+    ALSASeqEventCntrPrivate *priv;
+    struct event_iterator iter;
+    struct snd_seq_event *ev;
+
+    g_return_if_fail(ALSASEQ_IS_EVENT_CNTR(self));
+    priv = alsaseq_event_cntr_get_instance_private(self);
+
+    event_iterator_init(&iter, priv->buf, priv->length, priv->allocated);
+    ev = event_iterator_find(&iter, index);
+    if (ev == NULL) {
+        generate_error(error, EINVAL);
+        return;
+    }
+
+    ensure_fixed_length_event(priv, ev, error);
+    if (*error != NULL)
+        return;
+
+    ev->data.note = *(struct snd_seq_ev_note *)data;
+}
index 46de3df20e2dbc1f5a742f13a1a343fcfbd74817..d485955b1f950aafa6a1d24d61866eebcf503ddf 100644 (file)
@@ -8,6 +8,7 @@
 #include <seq/alsaseq-enums.h>
 #include <seq/tstamp.h>
 #include <seq/addr.h>
+#include <seq/event-data-note.h>
 
 G_BEGIN_DECLS
 
@@ -112,6 +113,11 @@ void alsaseq_event_cntr_get_src(ALSASeqEventCntr *self, gsize index,
 void alsaseq_event_cntr_set_src(ALSASeqEventCntr *self, gsize index,
                                   const ALSASeqAddr *src, GError **error);
 
+void alsaseq_event_cntr_get_note_data(ALSASeqEventCntr *self, gsize index,
+                            const ALSASeqEventDataNote **data, GError **error);
+void alsaseq_event_cntr_set_note_data(ALSASeqEventCntr *self, gsize index,
+                            const ALSASeqEventDataNote *data, GError **error);
+
 G_END_DECLS
 
 #endif
index b6d878e1f0c2c35dcefaf9134a7cba95a5cc1e9a..2a7b791e1185e6b84a260739e144dd85c7cc9018 100644 (file)
@@ -34,6 +34,8 @@ methods = (
     'set_dst',
     'get_src',
     'set_src',
+    'get_note_data',
+    'set_note_data',
 )
 signals = ()