]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: remove_filter; add constructor methods
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 9 Dec 2019 13:56:39 +0000 (22:56 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Tue, 7 Apr 2020 08:08:24 +0000 (17:08 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq.map
src/seq/remove-filter.c
src/seq/remove-filter.h

index 77bc253a9430d74627445991a54d9a34c10013cc..c1e6cc28eb5045cf05b8b1e491064081a5fe6d76 100644 (file)
@@ -161,6 +161,13 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_queue_timer_alsa_new";
 
     "alsaseq_remove_filter_get_type";
+    "alsaseq_remove_filter_new_with_dest_addr";
+    "alsaseq_remove_filter_new_with_note_channel";
+    "alsaseq_remove_filter_new_with_event_type";
+    "alsaseq_remove_filter_new_with_note";
+    "alsaseq_remove_filter_new_with_tag";
+    "alsaseq_remove_filter_new_with_tick_time";
+    "alsaseq_remove_filter_new_with_real_time";
   local:
     *;
 };
index 618241040e498c1387de326af0080b1d3506ccf2..ecb8d7cf8b8ce89bc96a531eaed367e368c5123b 100644 (file)
@@ -1,5 +1,8 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "remove-filter.h"
+#include "privates.h"
+
+#include <errno.h>
 
 ALSASeqRemoveFilter *seq_remove_filter_copy(const ALSASeqRemoveFilter *self)
 {
@@ -7,3 +10,220 @@ ALSASeqRemoveFilter *seq_remove_filter_copy(const ALSASeqRemoveFilter *self)
 }
 
 G_DEFINE_BOXED_TYPE(ALSASeqRemoveFilter, alsaseq_remove_filter, seq_remove_filter_copy, g_free)
+
+/**
+ * alsaseq_remove_filter_new_with_dest_addr:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @dest: The address of destination.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events towards the destination.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_dest_addr(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                ALSASeqAddr *dest, GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_DEST;
+    filter.queue = queue_id;
+    filter.dest = *dest;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_note_channel:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @channel: The channel for note event.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events with note type towards the channel.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_note_channel(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                guint8 channel, GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_DEST_CHANNEL;
+    filter.queue = queue_id;
+    filter.channel = channel;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_event_type:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @ev_type: The type of event.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events with the type.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_event_type(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                ALSASeqEventType ev_type, GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_EVENT_TYPE;
+    filter.queue = queue_id;
+    filter.type = ev_type;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_note:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events for note, except for ALSASEQ_EVENT_TYPE_NOTEOFF.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_note(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_IGNORE_OFF;
+    filter.queue = queue_id;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_tag:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @tag: The tag of event to remove.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events with the tag.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_tag(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint8 tag, GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_TAG_MATCH;
+    filter.queue = queue_id;
+    filter.tag = tag;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_tick_time:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @tick_time: The count of tick.
+ * @after: Remove events after the tick time if true, else remove events before
+ *         the tick time.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events before/after the tick time.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_tick_time(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint32 tick_time, gboolean after,
+                                GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout | SNDRV_SEQ_REMOVE_TIME_TICK;
+    if (after)
+        filter.remove_mode |= SNDRV_SEQ_REMOVE_TIME_BEFORE;
+    else
+        filter.remove_mode |= SNDRV_SEQ_REMOVE_TIME_AFTER;
+    filter.queue = queue_id;
+    filter.time.tick = tick_time;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
+
+/**
+ * alsaseq_remove_filter_new_with_real_time:
+ * @inout: The direction of queue; ALSASEQ_REMOVE_FILTER_FLAG_INPUT or
+ *         ALSASEQ_REMOVE_FILTER_FLAG_OUTPUT.
+ * @queue_id: The numerical ID of queue.
+ * @tv_sec: The second part of time.
+ * @tv_nsec: The nanosecond part of time.
+ * @after: Remove events after the real time if true, else remove events before
+ *         the real time.
+ * @error: A #GError.
+ *
+ * Allocate and return a memory object of ALSASeqRemoveFilter to remove queued
+ * events before/after the real time.
+ */
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_real_time(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint32 tv_sec, guint32 tv_nsec, gboolean after,
+                                GError **error)
+{
+    struct snd_seq_remove_events filter;
+
+    if (inout & ~(SNDRV_SEQ_REMOVE_INPUT | SNDRV_SEQ_REMOVE_OUTPUT)) {
+        generate_error(error, EINVAL);
+        return NULL;
+    }
+
+    filter.remove_mode = inout;
+    if (after)
+        filter.remove_mode |= SNDRV_SEQ_REMOVE_TIME_AFTER;
+    else
+        filter.remove_mode |= SNDRV_SEQ_REMOVE_TIME_BEFORE;
+    filter.queue = queue_id;
+    filter.time.time.tv_sec = tv_sec;
+    filter.time.time.tv_nsec = tv_nsec;
+
+    return g_boxed_copy(ALSASEQ_TYPE_REMOVE_FILTER, &filter);
+}
index 6bf9a6ec2a52c53dffda2565efe9ed3d3931dcde..631c21f9bc1185093f98f4568bcd999345237632 100644 (file)
@@ -5,6 +5,9 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include <seq/addr.h>
+#include <seq/alsaseq-enums.h>
+
 #include <sound/asequencer.h>
 
 G_BEGIN_DECLS
@@ -15,6 +18,36 @@ typedef struct snd_seq_remove_events    ALSASeqRemoveFilter;
 
 GType alsaseq_remove_filter_get_type() G_GNUC_CONST;
 
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_dest_addr(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                ALSASeqAddr *dest, GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_note_channel(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                guint8 channel, GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_event_type(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                ALSASeqEventType ev_type, GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_note(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_tag(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint8 tag, GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_tick_time(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint32 tick_time, gboolean after,
+                               GError **error);
+
+ALSASeqRemoveFilter *alsaseq_remove_filter_new_with_real_time(
+                                ALSASeqRemoveFilterFlag inout, guint8 queue_id,
+                                gint32 tv_sec, guint32 tv_nsec, gboolean after,
+                                GError **error);
+
 G_END_DECLS
 
 #endif