]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: add global method to get devnode string of control device for sound card
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/query.c
src/ctl/query.h

index d88b1e7377ad9457a79e412dea1afc1397d555a6..45d84d3e90717411cac87bc7a2de9c58a9991707 100644 (file)
@@ -9,6 +9,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_get_card_id_list";
     "alsactl_get_card_sysname";
     "alsactl_get_control_sysname";
+    "alsactl_get_control_devnode";
   local:
     *;
 };
index 1a8118d500d85b14fd15fbaec324245d29f7466e..47499a938549e8f4d10bc88e1b1ea5656b9630e4 100644 (file)
@@ -276,3 +276,51 @@ void alsactl_get_control_sysname(guint card_id, char **sysname, GError **error)
 
     *sysname = name;
 }
+
+/**
+ * alsactl_get_control_devnode:
+ * @card_id: The numerical ID of sound card.
+ * @devnode: (out): The string for devnode of control device for the sound card.
+ * @error: A #GError.
+ *
+ * Allocate string of devnode for control device of the sound card and return it
+ * if exists.
+ */
+void alsactl_get_control_devnode(guint card_id, char **devnode, GError **error)
+{
+    char *sysname;
+    struct udev *ctx;
+    struct udev_device *dev;
+    const char *node;
+
+    g_return_if_fail(devnode != NULL);
+
+    allocate_sysname(&sysname, CONTROL_SYSNAME_TEMPLATE, card_id, error);
+    if (*error != NULL)
+        return;
+
+    ctx = udev_new();
+    if (ctx == NULL) {
+        generate_error(error, errno);
+        g_free(sysname);
+        return;
+    }
+
+    dev = udev_device_new_from_subsystem_sysname(ctx, "sound", sysname);
+    if (dev == NULL) {
+        generate_error(error, ENODEV);
+        g_free(sysname);
+        udev_unref(ctx);
+        return;
+    }
+    g_free(sysname);
+
+    node = udev_device_get_devnode(dev);
+    if (node != NULL)
+        *devnode = strdup(node);
+    else
+        generate_error(error, ENODEV);
+
+    udev_device_unref(dev);
+    udev_unref(ctx);
+}
index ef135d4a14a367061a97a5f32ae716405ffb8703..d9d3c72d98acc9ea8762d0229ae620539280cdaa 100644 (file)
@@ -14,6 +14,8 @@ void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error);
 
 void alsactl_get_control_sysname(guint card_id, char **sysname, GError **error);
 
+void alsactl_get_control_devnode(guint card_id, char **devnode, GError **error);
+
 G_END_DECLS
 
 #endif