]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem_info_enum: add properties and constructor
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/elem-info-enum.c
src/ctl/elem-info-enum.h
tests/alsactl-elem-info-enum

index f4b688ee4578a9169a8ac2db5eb24161b5cf6b50..8cbfa4fa1a3456fd208fab8c0d83576f12480228 100644 (file)
@@ -39,6 +39,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_elem_info_int_new";
 
     "alsactl_elem_info_enum_get_type";
+    "alsactl_elem_info_enum_new";
   local:
     *;
 };
index 2e47598bc358141e7e403456f77985ef24d972c5..8a28d694cb2eb725b5f4831d77ea9294323ee5b9 100644 (file)
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "elem-info-enum.h"
+#include "privates.h"
 
-G_DEFINE_TYPE(ALSACtlElemInfoEnum, alsactl_elem_info_enum, ALSACTL_TYPE_ELEM_INFO)
+struct _ALSACtlElemInfoEnumPrivate {
+    const gchar **labels;     // should have sentinel member with NULL value.
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlElemInfoEnum, alsactl_elem_info_enum, ALSACTL_TYPE_ELEM_INFO)
+
+enum ctl_elem_info_enum_prop_type {
+    CTL_ELEM_INFO_ENUM_PROP_VALUE_COUNT = 1,
+    CTL_ELEM_INFO_ENUM_PROP_LABELS,
+    CTL_ELEM_INFO_ENUM_PROP_COUNT,
+};
+static GParamSpec *ctl_elem_info_enum_props[CTL_ELEM_INFO_ENUM_PROP_COUNT] = { NULL, };
+
+static void ctl_elem_info_enum_finalize(GObject *obj)
+{
+    ALSACtlElemInfoEnum *self = ALSACTL_ELEM_INFO_ENUM(obj);
+    ALSACtlElemInfoEnumPrivate *priv =
+                            alsactl_elem_info_enum_get_instance_private(self);
+
+    g_strfreev((gchar **)priv->labels);
+
+    G_OBJECT_CLASS(alsactl_elem_info_enum_parent_class)->finalize(obj);
+}
+
+static void ctl_elem_info_enum_set_property(GObject *obj, guint id,
+                                            const GValue *val, GParamSpec *spec)
+{
+    ALSACtlElemInfoEnum *self = ALSACTL_ELEM_INFO_ENUM(obj);
+    ALSACtlElemInfoEnumPrivate *priv =
+                            alsactl_elem_info_enum_get_instance_private(self);
+    ALSACtlElemInfo *parent = ALSACTL_ELEM_INFO(obj);
+    struct snd_ctl_elem_info *info;
+
+    ctl_elem_info_refer_private(parent, &info);
+
+    switch (id) {
+    case CTL_ELEM_INFO_ENUM_PROP_VALUE_COUNT:
+        info->count = g_value_get_uint(val);
+        break;
+    case CTL_ELEM_INFO_ENUM_PROP_LABELS:
+        g_strfreev((gchar **)priv->labels);
+        priv->labels = (const gchar **)g_strdupv(g_value_get_boxed(val));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
+
+static void ctl_elem_info_enum_get_property(GObject *obj, guint id,
+                                            GValue *val, GParamSpec *spec)
+{
+    ALSACtlElemInfoEnum *self = ALSACTL_ELEM_INFO_ENUM(obj);
+    ALSACtlElemInfoEnumPrivate *priv =
+                            alsactl_elem_info_enum_get_instance_private(self);
+
+    ALSACtlElemInfo *parent = ALSACTL_ELEM_INFO(obj);
+    struct snd_ctl_elem_info *info;
+
+    ctl_elem_info_refer_private(parent, &info);
+
+    switch (id) {
+    case CTL_ELEM_INFO_ENUM_PROP_VALUE_COUNT:
+        g_value_set_uint(val, info->count);
+        break;
+    case CTL_ELEM_INFO_ENUM_PROP_LABELS:
+        g_value_set_boxed(val, priv->labels);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
 
 static void alsactl_elem_info_enum_class_init(ALSACtlElemInfoEnumClass *klass)
 {
-    return;
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->finalize = ctl_elem_info_enum_finalize;
+    gobject_class->set_property = ctl_elem_info_enum_set_property;
+    gobject_class->get_property = ctl_elem_info_enum_get_property;
+
+    ctl_elem_info_enum_props[CTL_ELEM_INFO_ENUM_PROP_VALUE_COUNT] =
+        g_param_spec_uint("value-count", "value-count",
+                          "The number of members as value of this element",
+                          0, G_MAXUINT,
+                          0,
+                          G_PARAM_READWRITE);
+
+    ctl_elem_info_enum_props[CTL_ELEM_INFO_ENUM_PROP_LABELS] =
+        g_param_spec_boxed("labels", "labels",
+                           "The list of labels for this element",
+                           G_TYPE_STRV,
+                           G_PARAM_READWRITE);
+
+    g_object_class_install_properties(gobject_class,
+                    CTL_ELEM_INFO_ENUM_PROP_COUNT, ctl_elem_info_enum_props);
 }
 
 static void alsactl_elem_info_enum_init(ALSACtlElemInfoEnum *self)
 {
     return;
 }
+
+/**
+ * alsactl_elem_info_enum_new:
+ *
+ * Allocate and return an instance of ALSACtlElemInfoEnum.
+ *
+ * Returns: (transfer full): A #ALSACtlElemInfoEnum.
+ */
+ALSACtlElemInfoEnum *alsactl_elem_info_enum_new()
+{
+    return g_object_new(ALSACTL_TYPE_ELEM_INFO_ENUM,
+                        "type", ALSACTL_ELEM_TYPE_ENUMERATED, NULL);
+}
index 4ffee53a0516c20d012bcd1f3a75b1797ed36f3e..ac757d2d9f9f0c03c9033df66001e0f45184d739 100644 (file)
@@ -33,9 +33,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSACtlElemInfoEnum         ALSACtlElemInfoEnum;
 typedef struct _ALSACtlElemInfoEnumClass    ALSACtlElemInfoEnumClass;
+typedef struct _ALSACtlElemInfoEnumPrivate  ALSACtlElemInfoEnumPrivate;
 
 struct _ALSACtlElemInfoEnum {
     ALSACtlElemInfo parent_instance;
+
+    ALSACtlElemInfoEnumPrivate *priv;
 };
 
 struct _ALSACtlElemInfoEnumClass {
@@ -43,6 +46,9 @@ struct _ALSACtlElemInfoEnumClass {
 };
 
 GType alsactl_elem_info_enum_get_type(void) G_GNUC_CONST;
+
+ALSACtlElemInfoEnum *alsactl_elem_info_enum_new();
+
 G_END_DECLS
 
 #endif
index 00a853627b7836a88af70655590d098fb21b1965..9dae1e7f7334184a50ab5c5f6550c3b6214a71cf 100644 (file)
@@ -10,8 +10,13 @@ gi.require_version('ALSACtl', '0.0')
 from gi.repository import ALSACtl
 
 target = ALSACtl.ElemInfoEnum()
-props = ()
-methods = ()
+props = (
+    'value-count',
+    'labels',
+)
+methods = (
+    'new',
+)
 signals = ()
 
 if not test(target, props, methods, signals):