]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: card: add an API to get information of element
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 18 Nov 2019 04:22:44 +0000 (13:22 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 12 Dec 2019 05:29:12 +0000 (14:29 +0900)
src/ctl/alsactl.map
src/ctl/card.c
src/ctl/card.h
tests/alsactl-card

index 55c23774ceb091d13f4c4130bb2107b786128275..cb85df7846cebde908e170655a459117687eaa2c 100644 (file)
@@ -17,6 +17,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_card_get_info";
     "alsactl_card_get_elem_id_list";
     "alsactl_card_lock_elem";
+    "alsactl_card_get_elem_info";
 
     "alsactl_card_info_get_type";
 
index 4d9e08b9571ed89e5a77d65eab77bee0d2af11e3..061ab547a903cfb648c27e4878342395fac17169 100644 (file)
@@ -1,6 +1,12 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "card.h"
 #include "query.h"
+#include "elem-info-bool.h"
+#include "elem-info-int.h"
+#include "elem-info-enum.h"
+#include "elem-info-bytes.h"
+#include "elem-info-iec60958.h"
+#include "elem-info-int64.h"
 #include "privates.h"
 
 #include <sys/types.h>
@@ -251,3 +257,85 @@ void alsactl_card_lock_elem(ALSACtlCard *self, const ALSACtlElemId *elem_id,
     if (ret < 0)
         generate_error(error, errno);
 }
+
+/**
+ * alsactl_card_get_elem_info:
+ * @self: A #ALSACtlCard.
+ * @elem_id: A #ALSACtlElemId.
+ * @elem_info: (out): A %ALSACtlElemInfo.
+ * @error: A #GError.
+ *
+ * Get information of element corresponding to given id.
+ */
+void alsactl_card_get_elem_info(ALSACtlCard *self, const ALSACtlElemId *elem_id,
+                                ALSACtlElemInfo **elem_info, GError **error)
+{
+    ALSACtlCardPrivate *priv;
+    struct snd_ctl_elem_info *info_ptr, info = {0};
+
+    g_return_if_fail(ALSACTL_IS_CARD(self));
+    g_return_if_fail(elem_id != NULL);
+    priv = alsactl_card_get_instance_private(self);
+
+    info.id = *elem_id;
+    if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_INFO, &info)) {
+        generate_error(error, errno);
+        return;
+    }
+
+    if (info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) {
+        switch (info.type) {
+        case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
+            *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_BOOL, NULL);
+            break;
+        case SNDRV_CTL_ELEM_TYPE_INTEGER:
+            *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_INT, NULL);
+            break;
+        case SNDRV_CTL_ELEM_TYPE_BYTES:
+            *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_BYTES, NULL);
+            break;
+        case SNDRV_CTL_ELEM_TYPE_IEC958:
+            *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_IEC60958, NULL);
+            break;
+        case SNDRV_CTL_ELEM_TYPE_INTEGER64:
+            *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_INT64, NULL);
+            break;
+        default:
+            generate_error(error, ENXIO);
+            return;
+        }
+    } else {
+        gchar **labels;
+        int i;
+
+        labels = g_malloc0_n(info.value.enumerated.items + 1, sizeof(*labels));
+        if (labels == NULL) {
+            generate_error(error, ENOMEM);
+            return;
+        }
+
+        for (i = 0; i < info.value.enumerated.items; ++i) {
+            info.value.enumerated.item = i;
+            if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_INFO, &info)) {
+                generate_error(error, errno);
+                g_strfreev(labels);
+                return;
+            }
+
+            labels[i] = strdup(info.value.enumerated.name);
+            if (labels[i] == NULL) {
+                generate_error(error, ENOMEM);
+                g_strfreev(labels);
+                return;
+            }
+        }
+        labels[info.value.enumerated.items] = NULL;
+
+        *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_ENUM, "labels", labels,
+                                  NULL);
+        g_strfreev(labels);
+    }
+
+    ctl_elem_info_refer_private(ALSACTL_ELEM_INFO(*elem_info), &info_ptr);
+    *info_ptr = info;
+}
index 526c917d5e0aa32379e961746edb777fc8967400..8dacecb5f125fe5e87ea4aa136be92b43f44a0a1 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <ctl/card-info.h>
 #include <ctl/elem-id.h>
+#include <ctl/elem-info.h>
 
 G_BEGIN_DECLS
 
@@ -61,6 +62,9 @@ void alsactl_card_get_elem_id_list(ALSACtlCard *self, GList **entries,
 void alsactl_card_lock_elem(ALSACtlCard *self, const ALSACtlElemId *elem_id,
                             gboolean lock, GError **error);
 
+void alsactl_card_get_elem_info(ALSACtlCard *self, const ALSACtlElemId *elem_id,
+                                ALSACtlElemInfo **elem_info, GError **error);
+
 G_END_DECLS
 
 #endif
index 2b550e7952b205a5c86f9d3397797156ab598599..12ca1c92083df79b89da36870edebfd206f422cb 100644 (file)
@@ -19,6 +19,7 @@ methods = (
     'get_info',
     'get_elem_id_list',
     'lock_elem',
+    'get_elem_info',
 )
 signals = ()