]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: add global method to get information of ALSA Sequencer
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/privates.h
src/seq/query.c
src/seq/query.h
src/seq/system-info.c

index 87c04ffa27d2225cfa4a93f3f4d36390f2a055b0..1b9fca68eb90e110ae28441f36e69598a420c788 100644 (file)
@@ -18,6 +18,7 @@ ALSA_GOBJECT_0_0_0 {
 
     "alsaseq_get_seq_sysname";
     "alsaseq_get_seq_devnode";
+    "alsaseq_get_system_info";
 
     "alsaseq_system_info_get_type";
   local:
index 4472217832ff75aab510f134a952a0de66b2b1b6..68316f9593911459b9369eb636250ff16afdd1fc 100644 (file)
@@ -7,6 +7,10 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "system-info.h"
+
+#include <sound/asequencer.h>
+
 G_BEGIN_DECLS
 
 GQuark alsaseq_error_quark(void);
@@ -15,6 +19,9 @@ GQuark alsaseq_error_quark(void);
     g_set_error(err, alsaseq_error_quark(), errno,      \
                 __FILE__ ":%d: %s", __LINE__, strerror(errno))
 
+void seq_system_info_refer_private(ALSASeqSystemInfo *self,
+                                   struct snd_seq_system_info **info);
+
 G_END_DECLS
 
 #endif
index 91356e4bdd506e52bba0625c455d13fa14c2e9e3..d81f251f4ef4705c91c64d552c21c57771c9a684 100644 (file)
@@ -3,6 +3,11 @@
 #include "privates.h"
 
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
 
 #include <libudev.h>
 
@@ -94,3 +99,45 @@ void alsaseq_get_seq_devnode(gchar **devnode, GError **error)
     udev_device_unref(dev);
     udev_unref(ctx);
 }
+
+/**
+ * alsaseq_get_system_info:
+ * @system_info: (out): The information of ALSA Sequencer.
+ * @error: A #GError.
+ *
+ * Get information of ALSA Sequencer.
+ */
+void alsaseq_get_system_info(ALSASeqSystemInfo **system_info, GError **error)
+{
+    char *devnode;
+    struct snd_seq_system_info *info;
+    int fd;
+
+    alsaseq_get_seq_devnode(&devnode, error);
+    if (*error != NULL)
+        return;
+
+    *system_info = g_object_new(ALSASEQ_TYPE_SYSTEM_INFO, NULL);
+    seq_system_info_refer_private(*system_info, &info);
+
+    fd = open(devnode, O_RDONLY);
+    g_free(devnode);
+    if (fd < 0) {
+        generate_error(error, errno);
+        g_object_unref(*system_info);
+        *system_info = NULL;
+        return;
+    }
+
+    if (ioctl(fd, SNDRV_SEQ_IOCTL_SYSTEM_INFO, info) < 0)
+        generate_error(error, errno);
+    close(fd);
+    if (*error != NULL) {
+        g_object_unref(*system_info);
+        *system_info = NULL;
+        return;
+    }
+
+    // Decrement count for the above connection.
+    --info->cur_clients;
+}
index 1f428f4d4c2792eed1d6ea065965d2c6f9a09fcd..14eb961e597ee8cf80bd0443d114bbcc56d7a167 100644 (file)
@@ -5,12 +5,16 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include <seq/system-info.h>
+
 G_BEGIN_DECLS
 
 void alsaseq_get_seq_sysname(gchar **sysname, GError **error);
 
 void alsaseq_get_seq_devnode(gchar **devnode, GError **error);
 
+void alsaseq_get_system_info(ALSASeqSystemInfo **system_info, GError **error);
+
 G_END_DECLS
 
 #endif
index bdb0458677d4a552b46ae6eea0f0ec7eacb968b1..147952e50bfabea9aad5162492aea4184867b093 100644 (file)
@@ -1,7 +1,5 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
-#include "system-info.h"
-
-#include <sound/asequencer.h>
+#include "privates.h"
 
 struct _ALSASeqSystemInfoPrivate {
     struct snd_seq_system_info info;
@@ -109,3 +107,12 @@ static void alsaseq_system_info_init(ALSASeqSystemInfo *self)
 {
     return;
 }
+
+void seq_system_info_refer_private(ALSASeqSystemInfo *self,
+                                   struct snd_seq_system_info **info)
+{
+    ALSASeqSystemInfoPrivate *priv =
+                                alsaseq_system_info_get_instance_private(self);
+
+    *info = &priv->info;
+}