]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: card: add APIs to open ALSA control character devices
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 18 Nov 2019 04:22:44 +0000 (13:22 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 30 Nov 2019 08:58:41 +0000 (17:58 +0900)
src/ctl/alsactl.map
src/ctl/card.c
src/ctl/card.h
tests/alsactl-card

index f7b0ed6aff3eb8111ee7378cd835462656705554..9ad22c3eb83ca8acef2c24e0afd159115b40fe1e 100644 (file)
@@ -13,6 +13,7 @@ ALSA_GOBJECT_0_0_0 {
 
     "alsactl_card_get_type";
     "alsactl_card_new";
+    "alsactl_card_open";
   local:
     *;
 };
index 565b3c24a9d46e12fc82671cc49edc542089dc19..c890e3acbe09efe3e9549cca60169ca4b29b7dc7 100644 (file)
@@ -1,16 +1,44 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "card.h"
+#include "query.h"
+#include "privates.h"
 
-G_DEFINE_TYPE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT)
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <sound/asound.h>
+
+struct _ALSACtlCardPrivate {
+    int fd;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT)
+
+static void ctl_card_finalize(GObject *obj)
+{
+    ALSACtlCard *self = ALSACTL_CARD(obj);
+    ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self);
+
+    if (priv->fd >= 0)
+        close(priv->fd);
+
+    G_OBJECT_CLASS(alsactl_card_parent_class)->finalize(obj);
+}
 
 static void alsactl_card_class_init(ALSACtlCardClass *klass)
 {
-    return;
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->finalize = ctl_card_finalize;
 }
 
 static void alsactl_card_init(ALSACtlCard *self)
 {
-    return;
+    ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self);
+
+    priv->fd = -1;
 }
 
 /**
@@ -22,3 +50,30 @@ ALSACtlCard *alsactl_card_new()
 {
     return g_object_new(ALSACTL_TYPE_CARD, NULL);
 }
+
+/**
+ * alsactl_card_open:
+ * @self: A #ALSACtlCard.
+ * @card_id: The numerical ID of sound card.
+ * @error: A #GError.
+ *
+ * Open ALSA control character device for the sound card.
+ */
+void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error)
+{
+    ALSACtlCardPrivate *priv;
+    char *devnode;
+
+    g_return_if_fail(ALSACTL_IS_CARD(self));
+    priv = alsactl_card_get_instance_private(self);
+
+    alsactl_get_control_devnode(card_id, &devnode, error);
+    if (*error != NULL)
+        return;
+
+    priv->fd = open(devnode, O_RDONLY | O_NONBLOCK);
+    if (priv->fd < 0)
+        generate_error(error, errno);
+
+    g_free(devnode);
+}
index 9d443f868d15aff9fb881d881475b9e9b918fa16..9df24c37d4c16d2944d3faf941ae0cb768f74ca2 100644 (file)
@@ -31,9 +31,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSACtlCard         ALSACtlCard;
 typedef struct _ALSACtlCardClass    ALSACtlCardClass;
+typedef struct _ALSACtlCardPrivate  ALSACtlCardPrivate;
 
 struct _ALSACtlCard {
     GObject parent_instance;
+
+    ALSACtlCardPrivate *priv;
 };
 
 struct _ALSACtlCardClass {
@@ -44,6 +47,8 @@ GType alsactl_card_get_type() G_GNUC_CONST;
 
 ALSACtlCard *alsactl_card_new();
 
+void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error);
+
 G_END_DECLS
 
 #endif
index eb46ee8ae6e60eb06f2f854ea99e07bf2d3fca41..882049f0d82074a884ba7a9cce3f7e94323c7a30 100644 (file)
@@ -13,6 +13,7 @@ target = ALSACtl.Card()
 props = ()
 methods = (
     'new',
+    'open',
 )
 signals = ()