]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user_client: add an API to open ALSA Sequencer character device
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 c68c9213fa36f238e89226a9c0a05423c21533a3..c536a1fe63cb6511e22c5250b86e4a109e11e32f 100644 (file)
@@ -31,6 +31,7 @@ ALSA_GOBJECT_0_0_0 {
 
     "alsaseq_user_client_get_type";
     "alsaseq_user_client_new";
+    "alsaseq_user_client_open";
   local:
     *;
 };
index a74f2b68c6b61b6295b7b7ebf6fd7efe8107012e..15524dc773601122e9611f20f98c67871656f17e 100644 (file)
@@ -1,16 +1,45 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "user-client.h"
+#include "query.h"
+#include "privates.h"
 
-G_DEFINE_TYPE(ALSASeqUserClient, alsaseq_user_client, G_TYPE_OBJECT)
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+struct _ALSASeqUserClientPrivate {
+    int fd;
+    int client_id;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSASeqUserClient, alsaseq_user_client, G_TYPE_OBJECT)
+
+static void seq_user_client_finalize(GObject *obj)
+{
+    ALSASeqUserClient *self = ALSASEQ_USER_CLIENT(obj);
+    ALSASeqUserClientPrivate *priv =
+                                alsaseq_user_client_get_instance_private(self);
+
+    if (priv->fd >= 0)
+        close(priv->fd);
+
+    G_OBJECT_CLASS(alsaseq_user_client_parent_class)->finalize(obj);
+}
 
 static void alsaseq_user_client_class_init(ALSASeqUserClientClass *klass)
 {
-    return;
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->finalize = seq_user_client_finalize;
 }
 
 static void alsaseq_user_client_init(ALSASeqUserClient *self)
 {
-    return;
+    ALSASeqUserClientPrivate *priv =
+                                alsaseq_user_client_get_instance_private(self);
+    priv->fd = -1;
 }
 
 /**
@@ -22,3 +51,39 @@ ALSASeqUserClient *alsaseq_user_client_new()
 {
     return g_object_new(ALSASEQ_TYPE_USER_CLIENT, NULL);
 }
+
+/**
+ * alsaseq_user_client_open:
+ * @self: A #ALSASeqUserClient.
+ * @open_flag: The flag of open(2) system call. O_RDWR is forced to fulfil internally.
+ * @error: A #GError.
+ *
+ * Open ALSA sequencer character device.
+ */
+void alsaseq_user_client_open(ALSASeqUserClient *self, gint open_flag,
+                              GError **error)
+{
+    ALSASeqUserClientPrivate *priv;
+    char *devnode;
+
+    g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self));
+    priv = alsaseq_user_client_get_instance_private(self);
+
+    alsaseq_get_seq_devnode(&devnode, error);
+    if (*error != NULL)
+        return;
+
+    open_flag |= O_RDWR;
+    priv->fd = open(devnode, open_flag);
+    g_free(devnode);
+    if (priv->fd < 0) {
+        generate_error(error, errno);
+        return;
+    }
+
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CLIENT_ID, &priv->client_id) < 0) {
+        generate_error(error, errno);
+        close(priv->fd);
+        priv->fd = -1;
+    }
+}
index 3d94bf4e04078499edba7a75ddff17d9f4ee8362..1746c61bc15350cd564b2ce97ed30b979a1cf71d 100644 (file)
@@ -31,9 +31,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSASeqUserClient           ALSASeqUserClient;
 typedef struct _ALSASeqUserClientClass      ALSASeqUserClientClass;
+typedef struct _ALSASeqUserClientPrivate    ALSASeqUserClientPrivate;
 
 struct _ALSASeqUserClient {
     GObject parent_instance;
+
+    ALSASeqUserClientPrivate *priv;
 };
 
 struct _ALSASeqUserClientClass {
@@ -44,6 +47,9 @@ GType alsaseq_user_client_get_type() G_GNUC_CONST;
 
 ALSASeqUserClient *alsaseq_user_client_new();
 
+void alsaseq_user_client_open(ALSASeqUserClient *self, gint open_flag,
+                              GError **error);
+
 G_END_DECLS
 
 #endif
index d1dc6217992c5ea33030a5e34d9e8420f741f68b..e5098bdcf2f7c560c7ad505b539fd7f282f7b3dc 100644 (file)
@@ -13,6 +13,7 @@ target = ALSASeq.UserClient()
 props = ()
 methods = (
     'new',
+    'open',
 )
 signals = ()