]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: add global method to get list of numerical ID of queue
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 20 Nov 2019 07:55:41 +0000 (16:55 +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/query.c
src/seq/query.h

index 86470dcb35b0d164cf724bccb5abe51bafa27bbd..f4ee99d9c7153a78397ef102f6c621694af7cc29 100644 (file)
@@ -27,6 +27,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_get_port_info";
     "alsaseq_get_client_pool";
     "alsaseq_get_subscription_list";
+    "alsaseq_get_queue_id_list";
 
     "alsaseq_system_info_get_type";
 
index 957d954eb4e7a50e85ddae975d51a5ac41e05993..2e2a91f1a2874feafaaefd127d36d8893668b974 100644 (file)
@@ -515,3 +515,77 @@ void alsaseq_get_subscription_list(const ALSASeqAddr *addr,
         return;
     }
 }
+
+/**
+ * alsaseq_get_queue_id_list:
+ * @entries: (array length=entry_count)(out): The array of elements for
+ *           numerical ID of queue.
+ * @entry_count: The number of entries.
+ * @error: A #GError.
+ *
+ * Get the list of queue in ALSA Sequencer.
+ */
+void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count,
+                               GError **error)
+{
+    char *devnode;
+    int fd;
+    struct snd_seq_system_info info = {0};
+    unsigned int maximum_count;
+    unsigned int count;
+    guint *list;
+    unsigned int index;
+    int i;
+
+    alsaseq_get_seq_devnode(&devnode, error);
+    if (*error != NULL)
+        return;
+
+    fd = open(devnode, O_RDONLY);
+    g_free(devnode);
+    if (fd < 0) {
+        generate_error(error, errno);
+        return;
+    }
+
+    if (ioctl(fd, SNDRV_SEQ_IOCTL_SYSTEM_INFO, &info) < 0) {
+        generate_error(error, errno);
+        close(fd);
+        return;
+    }
+    maximum_count = info.queues;
+    count = info.cur_queues;
+
+    if (count == 0) {
+        close(fd);
+        return;
+    }
+
+    list = g_try_malloc0_n(count, sizeof(*entries));
+    if (list == NULL) {
+        generate_error(error, ENOMEM);
+        close(fd);
+        return;
+    }
+
+    for (i = 0; i < maximum_count; ++i) {
+        struct snd_seq_queue_info info;
+
+        info.queue = i;
+        if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_QUEUE_INFO, &info) < 0)
+            continue;
+
+        list[index] = i;
+        if (++index >= count)
+            break;
+    }
+    close(fd);
+    if (index != count) {
+        generate_error(error, ENXIO);
+        g_free(list);
+        return;
+    }
+
+    *entries = list;
+    *entry_count = count;
+}
index 0871542a1292c4976383ca65de3152de03b84a1a..689327fff2c998966b8eb3967ff44d87b813ce0d 100644 (file)
@@ -38,6 +38,9 @@ void alsaseq_get_subscription_list(const ALSASeqAddr *addr,
                                    ALSASeqQuerySubscribeType query_type,
                                    GList **entries, GError **error);
 
+void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count,
+                               GError **error);
+
 G_END_DECLS
 
 #endif