]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user_client: add an API to operate subscription between two ports
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 1 Apr 2020 09:13:28 +0000 (18:13 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Fri, 3 Apr 2020 13:06:25 +0000 (22:06 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq.map
src/seq/user-client.c
src/seq/user-client.h
tests/alsaseq-user-client

index dbddb71c5ba7c8c5b471b69c0841d43c3ba5999d..84482824a84566da2beebd957e162df654ef6631 100644 (file)
@@ -45,6 +45,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_user_client_get_pool";
     "alsaseq_user_client_schedule_event";
     "alsaseq_user_client_create_source";
+    "alsaseq_user_client_operate_subscription";
 
     "alsaseq_addr_get_type";
     "alsaseq_addr_new";
index 7aaad9368d69be7e1dc9a80767b1feea3aeb3f86..e862f58b22a1ac2302abd8b53663bf1bda5d2a00 100644 (file)
@@ -557,3 +557,36 @@ void alsaseq_user_client_create_source(ALSASeqUserClient *self,
     src->buf = buf;
     src->buf_len = page_size;
 }
+
+/**
+ * alsaseq_user_client_operate_subscription:
+ * @self: A #ALSASeqUserClient.
+ * @subs_data: A #ALSASeqSubscribeData.
+ * @establish: Whether to establish subscription between two ports, or break it.
+ * @error: A #GError.
+ *
+ * Operate subscription between two ports pointed by the data.
+ */
+void alsaseq_user_client_operate_subscription(ALSASeqUserClient *self,
+                                         ALSASeqSubscribeData *subs_data,
+                                         gboolean establish,
+                                         GError **error)
+{
+    ALSASeqUserClientPrivate *priv;
+    struct snd_seq_port_subscribe *data;
+    long request;
+
+    g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self));
+    g_return_if_fail(ALSASEQ_IS_SUBSCRIBE_DATA(subs_data));
+    priv = alsaseq_user_client_get_instance_private(self);
+
+    seq_subscribe_data_refer_private(subs_data, &data);
+
+    if (establish)
+        request = SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT;
+    else
+        request = SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT;
+
+    if (ioctl(priv->fd, request, data) < 0)
+        generate_error(error, errno);
+}
index 09979365ec0640d6af8f7d90a458c07f68080aaa..6bc9e0ae45592188cdd3e12d085186793db1b3c8 100644 (file)
@@ -9,6 +9,7 @@
 #include <seq/port-info.h>
 #include <seq/client-pool.h>
 #include <seq/event.h>
+#include <seq/subscribe-data.h>
 
 G_BEGIN_DECLS
 
@@ -97,6 +98,11 @@ void alsaseq_user_client_schedule_event(ALSASeqUserClient *self,
 void alsaseq_user_client_create_source(ALSASeqUserClient *self,
                                        GSource **gsrc, GError **error);
 
+void alsaseq_user_client_operate_subscription(ALSASeqUserClient *self,
+                                              ALSASeqSubscribeData *subs_data,
+                                              gboolean establish,
+                                              GError **error);
+
 G_END_DECLS
 
 #endif
index fd84fc2f6d5bc1059a455d43400ff3a6a2e51378..63952e271b576f155e8101d3d35ff0a65ade217f 100644 (file)
@@ -25,6 +25,7 @@ methods = (
     'get_pool',
     'schedule_event',
     'create_source',
+    'operate_subscription',
 )
 signals = ()