]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: add global method to get status of queue
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 20 Nov 2019 09:52:25 +0000 (18:52 +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-status.c

index 4f427e74a10fbf357201fe575b93290f88a8e4a4..588fcee4e2be200ba7fa983d0e46785ab67338de 100644 (file)
@@ -30,6 +30,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsaseq_get_queue_id_list";
     "alsaseq_get_queue_info_by_id";
     "alsaseq_get_queue_info_by_name";
+    "alsaseq_get_queue_status";
 
     "alsaseq_system_info_get_type";
 
index a139aaba9d7c6bf38a9fd3e122aeb38274862df7..eed1e5e6eac72b96806f15a002397b95a61cfbe1 100644 (file)
@@ -14,6 +14,7 @@
 #include "event.h"
 #include "subscribe-data.h"
 #include "queue-info.h"
+#include "queue-status.h"
 
 #include <sound/asequencer.h>
 
@@ -45,6 +46,9 @@ void seq_subscribe_data_refer_private(ALSASeqSubscribeData *self,
 void seq_queue_info_refer_private(ALSASeqQueueInfo *self,
                                   struct snd_seq_queue_info **info);
 
+void seq_queue_status_refer_private(ALSASeqQueueStatus *self,
+                                    struct snd_seq_queue_status **status);
+
 G_END_DECLS
 
 #endif
index d79624d15e18ed4431793ccbd955f19b13b67c18..fbc241122cf2b227dc9b5af97f583a2ff5799fcd 100644 (file)
@@ -671,3 +671,44 @@ void alsaseq_get_queue_info_by_name(const gchar *name,
 
     close(fd);
 }
+
+/**
+ * alsaseq_get_queue_status:
+ * @queue_id: The numerical ID of queue, except for entries in
+ *            ALSASeqSpecificQueueId.
+ * @queue_status: (out): The current status of queue.
+ * @error: A #GError.
+ *
+ * Get current status of queue.
+ */
+void alsaseq_get_queue_status(guint queue_id, ALSASeqQueueStatus **queue_status,
+                              GError **error)
+{
+    struct snd_seq_queue_status *status;
+    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_status = g_object_new(ALSASEQ_TYPE_QUEUE_STATUS, NULL);
+    seq_queue_status_refer_private(*queue_status, &status);
+
+    status->queue = (int)queue_id;
+    if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS, status) < 0) {
+        generate_error(error, errno);
+        close(fd);
+        g_object_unref(*queue_status);
+        return;
+    }
+
+    close(fd);
+}
index 7653ded58e1f6dbe27e2920f83f8ad41a508dcdd..08aa68d0673f4964360eb22970649ed559efd745 100644 (file)
@@ -11,6 +11,7 @@
 #include <seq/client-pool.h>
 #include <seq/subscribe-data.h>
 #include <seq/queue-info.h>
+#include <seq/queue-status.h>
 
 G_BEGIN_DECLS
 
@@ -48,6 +49,9 @@ void alsaseq_get_queue_info_by_name(const gchar *name,
                                     ALSASeqQueueInfo **queue_info,
                                     GError **error);
 
+void alsaseq_get_queue_status(guint queue_id, ALSASeqQueueStatus **queue_status,
+                              GError **error);
+
 G_END_DECLS
 
 #endif
index 791042ca41f58069fd881eaa9fb37bd75d34c0e5..db98e6469e8235ef81b326b26e68fab63710f4ec 100644 (file)
@@ -1,7 +1,5 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
-#include "queue-status.h"
-
-#include <sound/asequencer.h>
+#include "privates.h"
 
 struct _ALSASeqQueueStatusPrivate {
     struct snd_seq_queue_status status;
@@ -114,3 +112,12 @@ void alsaseq_queue_status_get_real_time(ALSASeqQueueStatus *self,
     // supported ABIs.
     *real_time = (const guint32 *)&priv->status.time;
 }
+
+void seq_queue_status_refer_private(ALSASeqQueueStatus *self,
+                                    struct snd_seq_queue_status **status)
+{
+    ALSASeqQueueStatusPrivate *priv =
+                                alsaseq_queue_status_get_instance_private(self);
+
+    *status = &priv->status;
+}