]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem_info: add accessor APIs for label entries of enumerated element
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 12 Jun 2020 04:19:45 +0000 (13:19 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Fri, 12 Jun 2020 06:45:37 +0000 (15:45 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/ctl/alsactl.map
src/ctl/card.c
src/ctl/elem-info.c
src/ctl/elem-info.h
tests/alsactl-elem-info

index 61f463b1a75278da3e9ece78cfcf6df548874c68..63bde1d20b22bd21102f9695602d788dc3ecc871 100644 (file)
@@ -47,6 +47,8 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_elem_info_set_int_data";
     "alsactl_elem_info_get_int64_data";
     "alsactl_elem_info_set_int64_data";
+    "alsactl_elem_info_get_enum_data";
+    "alsactl_elem_info_set_enum_data";
 
     "alsactl_elem_info_bool_get_type";
     "alsactl_elem_info_bool_new";
index 03903b6ab7cf1ad9ff5afff8b727d0ddacbeebe2..7100fc470fcfce1c79db66e29ae3bbd472ea8b6e 100644 (file)
@@ -422,8 +422,14 @@ void alsactl_card_get_elem_info(ALSACtlCard *self, const ALSACtlElemId *elem_id,
 
         *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_ENUM, "labels", labels,
                                   NULL);
-
+        alsactl_elem_info_set_enum_data(*elem_info, (const gchar **)labels,
+                                        error);
         g_strfreev(labels);
+        if (*error != NULL) {
+            g_object_unref(*elem_info);
+            return;
+        }
+
         break;
     }
     default:
index e7e1c0fe2f58cbcec702fa6fe682066886d7203a..74c7ca99c0c2ccdb02fed2a3684ee074096c5128 100644 (file)
@@ -22,6 +22,7 @@ struct _ALSACtlElemInfoPrivate {
         gint32 max;
         gint32 step;
     } int_data;
+    gchar **enum_data;
 };
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT)
 
@@ -81,12 +82,23 @@ static void ctl_elem_info_get_property(GObject *obj, guint id, GValue *val,
     }
 }
 
+static void ctl_elem_info_finalize(GObject *obj)
+{
+    ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj);
+    ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self);
+
+    g_strfreev(priv->enum_data);
+
+    G_OBJECT_CLASS(alsactl_elem_info_parent_class)->finalize(obj);
+}
+
 static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass)
 {
     GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 
     gobject_class->set_property = ctl_elem_info_set_property;
     gobject_class->get_property = ctl_elem_info_get_property;
+    gobject_class->finalize = ctl_elem_info_finalize;
 
     ctl_elem_info_props[CTL_ELEM_INFO_PROP_ELEM_ID] =
         g_param_spec_boxed("elem-id", "elem-id",
@@ -122,7 +134,9 @@ static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass)
 
 static void alsactl_elem_info_init(ALSACtlElemInfo *self)
 {
-    return;
+    ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self);
+
+    priv->enum_data = NULL;
 }
 
 /**
@@ -249,6 +263,62 @@ void alsactl_elem_info_set_int64_data(ALSACtlElemInfo *self,
     priv->info.value.integer.step = (long long)data[2];
 }
 
+/**
+ * alsactl_elem_info_get_enum_data:
+ * @self: A #ALSACtlElemInfo.
+ * @data: (array zero-terminated=1)(out)(transfer none): The array with elements
+ *        for the label entries of enumerated element.
+ * @error: A #GError.
+ *
+ * Refer to the array with elements for the label entries of enumerated element
+ * in internal storage. The call of function is successful as long as the
+ * information is for enumerated type.
+ */
+void alsactl_elem_info_get_enum_data(ALSACtlElemInfo *self,
+                                     const gchar ***data, GError **error)
+{
+    ALSACtlElemInfoPrivate *priv;
+
+    g_return_if_fail(ALSACTL_IS_ELEM_INFO(self));
+    priv = alsactl_elem_info_get_instance_private(self);
+
+    if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) {
+        generate_error(error, ENXIO);
+        return;
+    }
+
+    *data = (const gchar **)priv->enum_data;
+}
+
+/**
+ * alsactl_elem_info_set_enum_data:
+ * @self: A #ALSACtlElemInfo.
+ * @data: (array zero-terminated=1): The array with elements for the label
+ *        entries of enumerated element.
+ * @error: A #GError.
+ *
+ * Copy the array with elements for the label entries of enumerated element
+ * into internal storage. The call of function is successful as long as the
+ * information is for enumerated type.
+ */
+void alsactl_elem_info_set_enum_data(ALSACtlElemInfo *self,
+                                     const gchar **data, GError **error)
+{
+    ALSACtlElemInfoPrivate *priv;
+
+    g_return_if_fail(ALSACTL_IS_ELEM_INFO(self));
+    priv = alsactl_elem_info_get_instance_private(self);
+
+    if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) {
+        generate_error(error, ENXIO);
+        return;
+    }
+
+    g_strfreev(priv->enum_data);
+
+    priv->enum_data = g_strdupv((gchar **)data);
+}
+
 void ctl_elem_info_refer_private(ALSACtlElemInfo *self,
                                  struct snd_ctl_elem_info **info)
 {
index 548e2996594adf72dc41c39629535e0b939486c1..6891eec688913937e87cad5f47241d0a0f6ec4c8 100644 (file)
@@ -59,6 +59,11 @@ void alsactl_elem_info_get_int64_data(ALSACtlElemInfo *self,
 void alsactl_elem_info_set_int64_data(ALSACtlElemInfo *self,
                                       const gint64 data[3], GError **error);
 
+void alsactl_elem_info_get_enum_data(ALSACtlElemInfo *self,
+                                     const gchar ***data, GError **error);
+void alsactl_elem_info_set_enum_data(ALSACtlElemInfo *self,
+                                     const gchar **data, GError **error);
+
 G_END_DECLS
 
 #endif
index 78cebdc2156a7f5af85b5ab9bc9bf22ca28339d5..cc0c28c762e10c3e5cb4b56b54f5510eed14c896 100644 (file)
@@ -21,6 +21,8 @@ methods = (
     'set_int_data',
     'get_int64_data',
     'set_int64_data',
+    'get_enum_data',
+    'set_enum_data',
 )
 signals = ()