]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
hwdep: add global method to get devnode string for hwdep device
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 27 Nov 2019 06:36:46 +0000 (15:36 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Wed, 8 Apr 2020 01:40:25 +0000 (10:40 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/hwdep/alsahwdep.map
src/hwdep/query.c
src/hwdep/query.h

index 466d65adef49c87c239af5467ae1ebb51283093a..5b5eb5b00d7c5e76013a1535b5ac5d6efb35e092 100644 (file)
@@ -4,6 +4,7 @@ ALSA_GOBJECT_0_0_0 {
 
     "alsahwdep_get_device_id_list";
     "alsahwdep_get_hwdep_sysname";
+    "alsahwdep_get_hwdep_devnode";
   local:
     *;
 };
index 1b0a836f7dccd7de945faa5adbcf9b5c5d1e33cf..eaf9c13821fd53fd954e7f6ef8f76d981e6a1df6 100644 (file)
@@ -245,3 +245,58 @@ void alsahwdep_get_hwdep_sysname(guint card_id, guint device_id,
 
     udev_unref(ctx);
 }
+
+/**
+ * alsahwdep_get_hwdep_devnode:
+ * @card_id: The numeridcal ID of sound card.
+ * @device_id: The numerical ID of hwdep device for the sound card.
+ * @devnode: (out): The string for devnode of hwdep device.
+ * @error: A #GError.
+ *
+ * Allocate devnode string for hwdep device and return it when exists.
+ */
+void alsahwdep_get_hwdep_devnode(guint card_id, guint device_id,
+                                 char **devnode, GError **error)
+{
+    unsigned int length;
+    char *name;
+    struct udev *ctx;
+    struct udev_device *dev;
+    const char *node;
+
+    length = strlen(HWDEP_SYSNAME_TEMPLATE) + calculate_digits(card_id) +
+             calculate_digits(device_id) + 1;
+    name = g_try_malloc0(length);
+    if (name == NULL) {
+        generate_error(error, ENOMEM);
+        return;
+    }
+    snprintf(name, length, HWDEP_SYSNAME_TEMPLATE, card_id, device_id);
+
+    ctx = udev_new();
+    if (ctx == NULL) {
+        generate_error(error, errno);
+        g_free(name);
+        return;
+    }
+
+    dev = udev_device_new_from_subsystem_sysname(ctx, "sound", name);
+    g_free(name);
+    if (dev == NULL) {
+        generate_error(error, ENODEV);
+        udev_unref(ctx);
+        return;
+    }
+
+    node = udev_device_get_devnode(dev);
+    if (node == NULL) {
+        generate_error(error, ENOENT);
+    } else {
+        *devnode = strdup(node);
+        if (*devnode == NULL)
+            generate_error(error, ENOMEM);
+    }
+
+    udev_device_unref(dev);
+    udev_unref(ctx);
+}
index 4eed987d39a74e286aee0963656b47c32931d7a8..ed005ef8ddf87cb11f7708f43eef2b0429059795 100644 (file)
@@ -13,6 +13,9 @@ void alsahwdep_get_device_id_list(guint card_id, guint **entries,
 void alsahwdep_get_hwdep_sysname(guint card_id, guint device_id,
                                  char **sysname, GError **error);
 
+void alsahwdep_get_hwdep_devnode(guint card_id, guint device_id,
+                                 char **devnode, GError **error);
+
 G_END_DECLS
 
 #endif