]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem-info-integer64: add class for element information of integer64 type
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 2 Jun 2022 09:26:26 +0000 (18:26 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 2 Jun 2022 09:26:26 +0000 (18:26 +0900)
The element information of integer64 type delivers additional three
properties; the minimum, maximum, and step of value for element of
value array. The value of property is 64 bit signed integer.

This commit adds gobject class for the information.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/ctl/alsactl.h
src/ctl/alsactl.map
src/ctl/elem-info-integer64.c [new file with mode: 0644]
src/ctl/elem-info-integer64.h [new file with mode: 0644]
src/ctl/meson.build
tests/alsactl-elem-info-integer64 [new file with mode: 0644]
tests/meson.build

index 24b5e023d259d1c04f6d33ee4f382062b1f7340c..d77aae4606e5888b80dea4083e022e7ad39143cf 100644 (file)
@@ -23,6 +23,7 @@
 #include <elem-info-boolean.h>
 #include <elem-info-bytes.h>
 #include <elem-info-integer.h>
+#include <elem-info-integer64.h>
 #include <elem-value.h>
 #include <card.h>
 
index d0e721a4bb0dec4554340332689f16c89794905b..f93f23f25392e62d7f31f45293f6cc56ef2e8b4d 100644 (file)
@@ -97,4 +97,7 @@ ALSA_GOBJECT_0_3_0 {
 
     "alsactl_elem_info_integer_get_type";
     "alsactl_elem_info_integer_new";
+
+    "alsactl_elem_info_integer64_get_type";
+    "alsactl_elem_info_integer64_new";
 } ALSA_GOBJECT_0_2_0;
diff --git a/src/ctl/elem-info-integer64.c b/src/ctl/elem-info-integer64.c
new file mode 100644 (file)
index 0000000..d9e3805
--- /dev/null
@@ -0,0 +1,154 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+#include "privates.h"
+
+/**
+ * ALSACtlElemInfoInteger64:
+ * An object to express information for integer64 type of element.
+ *
+ * A [class@GObject.Object] derived object class for integer64 type of element.
+ *
+ * The object wraps `struct snd_ctl_elem_info` in UAPI of Linux sound subsystem.
+ */
+typedef struct {
+    struct snd_ctl_elem_info data;
+} ALSACtlElemInfoInteger64Private;
+
+static void elem_info_common_iface_init(ALSACtlElemInfoCommonInterface *iface);
+static void elem_info_single_array_iface_init(ALSACtlElemInfoSingleArrayInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE(ALSACtlElemInfoInteger64, alsactl_elem_info_integer64, G_TYPE_OBJECT,
+                        G_ADD_PRIVATE(ALSACtlElemInfoInteger64)
+                        G_IMPLEMENT_INTERFACE(ALSACTL_TYPE_ELEM_INFO_COMMON,
+                                              elem_info_common_iface_init)
+                        G_IMPLEMENT_INTERFACE(ALSACTL_TYPE_ELEM_INFO_SINGLE_ARRAY,
+                                              elem_info_single_array_iface_init))
+
+enum elem_info_integer64_prop_type {
+    ELEM_INFO_INTEGER64_PROP_MIN = ELEM_INFO_SINGLE_ARRAY_PROP_COUNT,
+    ELEM_INFO_INTEGER64_PROP_MAX,
+    ELEM_INFO_INTEGER64_PROP_STEP,
+    ELEM_INFO_INTEGER64_PROP_COUNT,
+};
+
+static void ctl_elem_info_integer64_set_property(GObject *obj, guint id, const GValue *val,
+                                              GParamSpec *spec)
+{
+    ALSACtlElemInfoInteger64 *self = ALSACTL_ELEM_INFO_INTEGER64(obj);
+    ALSACtlElemInfoInteger64Private *priv = alsactl_elem_info_integer64_get_instance_private(self);
+    struct snd_ctl_elem_info *data = &priv->data;
+
+    switch (id) {
+    case ELEM_INFO_INTEGER64_PROP_MIN:
+        data->value.integer64.min = g_value_get_int64(val);
+        break;
+    case ELEM_INFO_INTEGER64_PROP_MAX:
+        data->value.integer64.max = g_value_get_int64(val);
+        break;
+    case ELEM_INFO_INTEGER64_PROP_STEP:
+        data->value.integer64.step = g_value_get_int64(val);
+        break;
+    default:
+        elem_info_single_array_set_property(data, obj, id, val, spec);
+        break;
+    }
+}
+
+static void ctl_elem_info_integer64_get_property(GObject *obj, guint id, GValue *val,
+                                              GParamSpec *spec)
+{
+    ALSACtlElemInfoInteger64 *self = ALSACTL_ELEM_INFO_INTEGER64(obj);
+    ALSACtlElemInfoInteger64Private *priv = alsactl_elem_info_integer64_get_instance_private(self);
+    const struct snd_ctl_elem_info *data = &priv->data;
+
+    switch (id) {
+    case ELEM_INFO_INTEGER64_PROP_MIN:
+        g_value_set_int64(val, data->value.integer64.min);
+        break;
+    case ELEM_INFO_INTEGER64_PROP_MAX:
+        g_value_set_int64(val, data->value.integer64.max);
+        break;
+    case ELEM_INFO_INTEGER64_PROP_STEP:
+        g_value_set_int64(val, data->value.integer64.step);
+        break;
+    default:
+        elem_info_single_array_get_property(data, obj, id, val, spec);
+        break;
+    }
+}
+
+static void alsactl_elem_info_integer64_class_init(ALSACtlElemInfoInteger64Class *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->set_property = ctl_elem_info_integer64_set_property;
+    gobject_class->get_property = ctl_elem_info_integer64_get_property;
+
+    elem_info_single_array_class_override_properties(gobject_class);
+
+    /**
+     * ALSACtlElemInfoInteger64:value-min:
+     *
+     * The minimum value of element in value array for the element.
+     *
+     * Since: 0.3.
+     */
+    g_object_class_install_property(gobject_class, ELEM_INFO_INTEGER64_PROP_MIN,
+        g_param_spec_int64("value-min", "value-min",
+                           "The minimum value of element in value array for the element",
+                           G_MININT64, G_MAXINT64, 0,
+                           G_PARAM_READWRITE));
+
+    /**
+     * ALSACtlElemInfoInteger64:value-max:
+     *
+     * The maximum value of element in value array for the element.
+     *
+     * Since: 0.3.
+     */
+    g_object_class_install_property(gobject_class, ELEM_INFO_INTEGER64_PROP_MAX,
+        g_param_spec_int64("value-max", "value-max",
+                           "The maximum value of element in value array for the element",
+                           G_MININT64, G_MAXINT64, 0,
+                           G_PARAM_READWRITE));
+
+    /**
+     * ALSACtlElemInfoInteger64:value-step:
+     *
+     * The step value of element in value array for the element.
+     *
+     * Since: 0.3.
+     */
+    g_object_class_install_property(gobject_class, ELEM_INFO_INTEGER64_PROP_STEP,
+        g_param_spec_int64("value-step", "value-step",
+                           "The step value of element in value array for the element",
+                           G_MININT64, G_MAXINT64, 0,
+                           G_PARAM_READWRITE));
+}
+
+static void alsactl_elem_info_integer64_init(ALSACtlElemInfoInteger64 *self)
+{
+    return;
+}
+
+static void elem_info_single_array_iface_init(ALSACtlElemInfoSingleArrayInterface *iface)
+{
+    return;
+}
+
+static void elem_info_common_iface_init(ALSACtlElemInfoCommonInterface *iface)
+{
+    return;
+}
+
+/**
+ * alsactl_elem_info_integer64_new:
+ *
+ * Allocate and return an instance of [class@ElemInfoInteger64].
+ *
+ * Returns: An instance of [class@ElemInfoInteger64].
+ */
+ALSACtlElemInfoInteger64 *alsactl_elem_info_integer64_new()
+{
+    return g_object_new(ALSACTL_TYPE_ELEM_INFO_INTEGER64,
+                        ELEM_TYPE_PROP_NAME, ALSACTL_ELEM_TYPE_INTEGER64, NULL);
+}
diff --git a/src/ctl/elem-info-integer64.h b/src/ctl/elem-info-integer64.h
new file mode 100644 (file)
index 0000000..73a4053
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+#ifndef __ALSA_GOBJECT_ALSACTL_ELEM_INFO_INTEGER64_H__
+#define __ALSA_GOBJECT_ALSACTL_ELEM_INFO_INTEGER64_H__
+
+#include <alsactl.h>
+
+G_BEGIN_DECLS
+
+#define ALSACTL_TYPE_ELEM_INFO_INTEGER64        (alsactl_elem_info_integer64_get_type())
+
+G_DECLARE_DERIVABLE_TYPE(ALSACtlElemInfoInteger64, alsactl_elem_info_integer64, ALSACTL,
+                         ELEM_INFO_INTEGER64, GObject)
+
+struct _ALSACtlElemInfoInteger64Class {
+    GObjectClass parent_class;
+};
+
+ALSACtlElemInfoInteger64 *alsactl_elem_info_integer64_new();
+
+G_END_DECLS
+
+#endif
index 51bf982ce0c6cafbc7dcef7867dc2b29de3ba6ed..d242663b81eced84f1832499a0d785f1a0fa9920 100644 (file)
@@ -21,6 +21,7 @@ sources = files(
   'elem-info-boolean.c',
   'elem-info-bytes.c',
   'elem-info-integer.c',
+  'elem-info-integer64.c',
 )
 
 headers = files(
@@ -36,6 +37,7 @@ headers = files(
   'elem-info-boolean.h',
   'elem-info-bytes.h',
   'elem-info-integer.h',
+  'elem-info-integer64.h',
 )
 
 privates = files(
diff --git a/tests/alsactl-elem-info-integer64 b/tests/alsactl-elem-info-integer64
new file mode 100644 (file)
index 0000000..b9b8eb1
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from errno import ENXIO
+
+from helper import test
+
+import gi
+gi.require_version('ALSACtl', '0.0')
+from gi.repository import ALSACtl
+
+target = ALSACtl.ElemInfoInteger64.new()
+props = (
+    'elem-id',
+    'elem-type',
+    'access',
+    'owner',
+    'value-count',
+    'value-min',
+    'value-max',
+    'value-step',
+)
+methods = (
+    'new',
+)
+signals = ()
+
+if not test(target, props, methods, signals):
+    exit(ENXIO)
index 85d9591baf22f85b86dbd9beef9ae00ac7e08326..cd9862d9aa04ff24f89a041030b37d39ae3c1d32 100644 (file)
@@ -11,6 +11,7 @@ tests = {
     'alsactl-elem-info-boolean',
     'alsactl-elem-info-bytes',
     'alsactl-elem-info-integer',
+    'alsactl-elem-info-integer64',
     'alsactl-elem-value',
   ],
   'timer': [