]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: add global method to get sysname of 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 523c0193b6d498a1803053f6d2aecb4c371cd865..c5f73b9f5786c263d82117d2017e50541fbdbf41 100644 (file)
@@ -7,6 +7,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_event_mask_flag_get_type";
 
     "alsactl_get_card_id_list";
+    "alsactl_get_card_sysname";
   local:
     *;
 };
index 0a83447139f3bd6224ee17e87f01fb89451a8ebd..542f92b9175f4f892deadd99def0c0069ede01f5 100644 (file)
@@ -5,9 +5,12 @@
 #include <string.h>
 #include <errno.h>
 #include <stdio.h>
+#include <stdbool.h>
 
 #include <libudev.h>
 
+#define CARD_SYSNAME_TEMPLATE       "card%u"
+
 // For error handling.
 G_DEFINE_QUARK("alsactl-error", alsactl_error)
 
@@ -169,3 +172,79 @@ void alsactl_get_card_id_list(guint **entries, gsize *entry_count,
 end:
     release_udev_enum(enumerator);
 }
+
+static void allocate_sysname(char **sysname ,const char *template,
+                             guint card_id, GError **error)
+{
+    unsigned int digits;
+    unsigned int number;
+    unsigned int length;
+
+    digits = 0;
+    number = card_id;
+    while (number > 0) {
+        number /= 10;
+        ++digits;
+    }
+
+    length = strlen(template) + digits;
+    *sysname = g_try_malloc0(length + 1);
+    if (*sysname == NULL) {
+        generate_error(error, ENOMEM);
+        return;
+    }
+
+    snprintf(*sysname, length, template, card_id);
+}
+
+static bool check_existence(char *sysname, GError **error)
+{
+    struct udev *ctx;
+    struct udev_device *dev;
+    bool result;
+
+    ctx = udev_new();
+    if (ctx == NULL) {
+        generate_error(error, errno);
+        return false;
+    }
+
+    dev = udev_device_new_from_subsystem_sysname(ctx, "sound", sysname);
+    if (dev == NULL) {
+        generate_error(error, errno);
+        result = false;
+    } else {
+        result = true;
+    }
+    udev_device_unref(dev);
+
+    udev_unref(ctx);
+
+    return result;
+}
+
+/**
+ * alsactl_get_card_sysname:
+ * @card_id: The numeridcal ID of sound card.
+ * @sysname: (out): The string for sysname of the sound card.
+ * @error: A #GError.
+ *
+ * Allocate sysname for the sound card and return it when it exists.
+ */
+void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error)
+{
+    char *name;
+
+    g_return_if_fail(sysname != NULL);
+
+    allocate_sysname(&name, CARD_SYSNAME_TEMPLATE, card_id, error);
+    if (*error != NULL)
+        return;
+
+    if (!check_existence(name, error)) {
+        g_free(name);
+        return;
+    }
+
+    *sysname = name;
+}
index 62135ba85565239c6ceb6d4ce6b65569433eb097..724f53babbecf8ebdcd2b97112e3ac22548860c9 100644 (file)
@@ -10,6 +10,8 @@ G_BEGIN_DECLS
 void alsactl_get_card_id_list(guint **entries, gsize *entry_count,
                               GError **error);
 
+void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error);
+
 G_END_DECLS
 
 #endif