]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: add global method to get the information of queue
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 20 Nov 2019 08:28:23 +0000 (17:28 +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/privates.h
src/seq/query.c
src/seq/query.h
src/seq/queue-info.c

index cb7da25dccd66a9fc63ab6847c848a60f5a8a7ff..b9286e20017ffe8033f0688ad3c5e2208ffcbaec 100644 (file)
@@ -28,6 +28,8 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_get_client_pool";
     "alsaseq_get_subscription_list";
     "alsaseq_get_queue_id_list";
+    "alsaseq_get_queue_info_by_id";
+    "alsaseq_get_queue_info_by_name";
 
     "alsaseq_system_info_get_type";
 
index 1b5c37030aa93d7d672a03fb63ebfbeda768b8b5..a139aaba9d7c6bf38a9fd3e122aeb38274862df7 100644 (file)
@@ -42,6 +42,9 @@ void seq_event_refer_private(ALSASeqEvent *self, struct snd_seq_event **ev);
 void seq_subscribe_data_refer_private(ALSASeqSubscribeData *self,
                                       struct snd_seq_port_subscribe **data);
 
+void seq_queue_info_refer_private(ALSASeqQueueInfo *self,
+                                  struct snd_seq_queue_info **info);
+
 G_END_DECLS
 
 #endif
index 2e2a91f1a2874feafaaefd127d36d8893668b974..d79624d15e18ed4431793ccbd955f19b13b67c18 100644 (file)
@@ -589,3 +589,85 @@ void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count,
     *entries = list;
     *entry_count = count;
 }
+
+/**
+ * alsaseq_get_queue_info_by_id:
+ * @queue_id: The numerical ID of queue, except for one of
+ *            ALSASeqSpecificQueueId.
+ * @queue_info: (out): The information of queue.
+ * @error: A #GError.
+ *
+ * Get the information of queue, according to the numerical ID.
+ */
+void alsaseq_get_queue_info_by_id(guint queue_id, ALSASeqQueueInfo **queue_info,
+                                  GError **error)
+{
+    struct snd_seq_queue_info *info;
+    char *devnode;
+    int fd;
+
+    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;
+    }
+
+    *queue_info = g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL);
+    seq_queue_info_refer_private(*queue_info, &info);
+
+    info->queue = queue_id;
+    if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_QUEUE_INFO, info) < 0) {
+        generate_error(error, errno);
+        close(fd);
+        g_object_unref(*queue_info);
+        return;
+    }
+
+    close(fd);
+}
+
+/**
+ * alsaseq_get_queue_info_by_name:
+ * @name: The name string of queue to query.
+ * @queue_info: (out): The information of queue.
+ * @error: A #GError.
+ *
+ * Get the information of queue, according to the name string.
+ */
+void alsaseq_get_queue_info_by_name(const gchar *name,
+                                    ALSASeqQueueInfo **queue_info,
+                                    GError **error)
+{
+    struct snd_seq_queue_info *info;
+    char *devnode;
+    int fd;
+
+    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;
+    }
+
+    *queue_info = g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL);
+    seq_queue_info_refer_private(*queue_info, &info);
+
+    strncpy(info->name, name, sizeof(info->name));
+    if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE, info) < 0) {
+        generate_error(error, errno);
+        close(fd);
+        g_object_unref(*queue_info);
+        return;
+    }
+
+    close(fd);
+}
index 689327fff2c998966b8eb3967ff44d87b813ce0d..7653ded58e1f6dbe27e2920f83f8ad41a508dcdd 100644 (file)
@@ -10,6 +10,7 @@
 #include <seq/port-info.h>
 #include <seq/client-pool.h>
 #include <seq/subscribe-data.h>
+#include <seq/queue-info.h>
 
 G_BEGIN_DECLS
 
@@ -41,6 +42,12 @@ void alsaseq_get_subscription_list(const ALSASeqAddr *addr,
 void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count,
                                GError **error);
 
+void alsaseq_get_queue_info_by_id(guint queue_id, ALSASeqQueueInfo **queue_info,
+                                  GError **error);
+void alsaseq_get_queue_info_by_name(const gchar *name,
+                                    ALSASeqQueueInfo **queue_info,
+                                    GError **error);
+
 G_END_DECLS
 
 #endif
index c68826c85cf5b4b2fe167e00869df3859ec207fa..8f1eaf9799fe670a57d083ee96887766e581bd61 100644 (file)
@@ -1,7 +1,5 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
-#include "queue-info.h"
-
-#include <sound/asequencer.h>
+#include "privates.h"
 
 struct _ALSASeqQueueInfoPrivate {
     struct snd_seq_queue_info info;
@@ -125,3 +123,12 @@ ALSASeqQueueInfo *alsaseq_queue_info_new()
 {
     return g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL);
 }
+
+void seq_queue_info_refer_private(ALSASeqQueueInfo *self,
+                                  struct snd_seq_queue_info **info)
+{
+    ALSASeqQueueInfoPrivate *priv =
+                                alsaseq_queue_info_get_instance_private(self);
+
+    *info = &priv->info;
+}