From 93f889410df6af0744184b8fb9e5c4d4e4426461 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Thu, 2 Jun 2022 18:26:26 +0900 Subject: [PATCH] ctl: elem-info-integer: add class for element information of integer type The element information of integer type delivers additional three properties; the minimum, maximum, and step of value for element of value array. The value of property is 32 bit integer. This commit adds gobject class for the information. Signed-off-by: Takashi Sakamoto --- src/ctl/alsactl.h | 1 + src/ctl/alsactl.map | 3 + src/ctl/elem-info-integer.c | 154 ++++++++++++++++++++++++++++++++ src/ctl/elem-info-integer.h | 22 +++++ src/ctl/meson.build | 2 + tests/alsactl-elem-info-integer | 29 ++++++ tests/meson.build | 1 + 7 files changed, 212 insertions(+) create mode 100644 src/ctl/elem-info-integer.c create mode 100644 src/ctl/elem-info-integer.h create mode 100644 tests/alsactl-elem-info-integer diff --git a/src/ctl/alsactl.h b/src/ctl/alsactl.h index 141632e..24b5e02 100644 --- a/src/ctl/alsactl.h +++ b/src/ctl/alsactl.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 7c498bb..d0e721a 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -94,4 +94,7 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_info_bytes_get_type"; "alsactl_elem_info_bytes_new"; + + "alsactl_elem_info_integer_get_type"; + "alsactl_elem_info_integer_new"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-info-integer.c b/src/ctl/elem-info-integer.c new file mode 100644 index 0000000..be1cf18 --- /dev/null +++ b/src/ctl/elem-info-integer.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#include "privates.h" + +/** + * ALSACtlElemInfoInteger: + * An object to express information for integer type of element. + * + * A [class@GObject.Object] derived object class for integer 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; +} ALSACtlElemInfoIntegerPrivate; + +static void elem_info_common_iface_init(ALSACtlElemInfoCommonInterface *iface); +static void elem_info_single_array_iface_init(ALSACtlElemInfoSingleArrayInterface *iface); + +G_DEFINE_TYPE_WITH_CODE(ALSACtlElemInfoInteger, alsactl_elem_info_integer, G_TYPE_OBJECT, + G_ADD_PRIVATE(ALSACtlElemInfoInteger) + 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_integer_prop_type { + ELEM_INFO_INTEGER_PROP_MIN = ELEM_INFO_SINGLE_ARRAY_PROP_COUNT, + ELEM_INFO_INTEGER_PROP_MAX, + ELEM_INFO_INTEGER_PROP_STEP, + ELEM_INFO_INTEGER_PROP_COUNT, +}; + +static void ctl_elem_info_integer_set_property(GObject *obj, guint id, const GValue *val, + GParamSpec *spec) +{ + ALSACtlElemInfoInteger *self = ALSACTL_ELEM_INFO_INTEGER(obj); + ALSACtlElemInfoIntegerPrivate *priv = alsactl_elem_info_integer_get_instance_private(self); + struct snd_ctl_elem_info *data = &priv->data; + + switch (id) { + case ELEM_INFO_INTEGER_PROP_MIN: + data->value.integer.min = (long)g_value_get_int(val); + break; + case ELEM_INFO_INTEGER_PROP_MAX: + data->value.integer.max = (long)g_value_get_int(val); + break; + case ELEM_INFO_INTEGER_PROP_STEP: + data->value.integer.step = (long)g_value_get_int(val); + break; + default: + elem_info_single_array_set_property(data, obj, id, val, spec); + break; + } +} + +static void ctl_elem_info_integer_get_property(GObject *obj, guint id, GValue *val, + GParamSpec *spec) +{ + ALSACtlElemInfoInteger *self = ALSACTL_ELEM_INFO_INTEGER(obj); + ALSACtlElemInfoIntegerPrivate *priv = alsactl_elem_info_integer_get_instance_private(self); + const struct snd_ctl_elem_info *data = &priv->data; + + switch (id) { + case ELEM_INFO_INTEGER_PROP_MIN: + g_value_set_int(val, (int)data->value.integer.min); + break; + case ELEM_INFO_INTEGER_PROP_MAX: + g_value_set_int(val, (int)data->value.integer.max); + break; + case ELEM_INFO_INTEGER_PROP_STEP: + g_value_set_int(val, (int)data->value.integer.step); + break; + default: + elem_info_single_array_get_property(data, obj, id, val, spec); + break; + } +} + +static void alsactl_elem_info_integer_class_init(ALSACtlElemInfoIntegerClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->set_property = ctl_elem_info_integer_set_property; + gobject_class->get_property = ctl_elem_info_integer_get_property; + + elem_info_single_array_class_override_properties(gobject_class); + + /** + * ALSACtlElemInfoInteger: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_INTEGER_PROP_MIN, + g_param_spec_int("value-min", "value-min", + "The minimum value of element in value array for the element", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE)); + + /** + * ALSACtlElemInfoInteger: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_INTEGER_PROP_MAX, + g_param_spec_int("value-max", "value-max", + "The maximum value of element in value array for the element", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE)); + + /** + * ALSACtlElemInfoInteger: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_INTEGER_PROP_STEP, + g_param_spec_int("value-step", "value-step", + "The step value of element in value array for the element", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE)); +} + +static void alsactl_elem_info_integer_init(ALSACtlElemInfoInteger *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_integer_new: + * + * Allocate and return an instance of [class@ElemInfoInteger]. + * + * Returns: An instance of [class@ElemInfoInteger]. + */ +ALSACtlElemInfoInteger *alsactl_elem_info_integer_new() +{ + return g_object_new(ALSACTL_TYPE_ELEM_INFO_INTEGER, ELEM_TYPE_PROP_NAME, ALSACTL_ELEM_TYPE_INTEGER, + NULL); +} diff --git a/src/ctl/elem-info-integer.h b/src/ctl/elem-info-integer.h new file mode 100644 index 0000000..dcd75ec --- /dev/null +++ b/src/ctl/elem-info-integer.h @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#ifndef __ALSA_GOBJECT_ALSACTL_ELEM_INFO_INTEGER_H__ +#define __ALSA_GOBJECT_ALSACTL_ELEM_INFO_INTEGER_H__ + +#include + +G_BEGIN_DECLS + +#define ALSACTL_TYPE_ELEM_INFO_INTEGER (alsactl_elem_info_integer_get_type()) + +G_DECLARE_DERIVABLE_TYPE(ALSACtlElemInfoInteger, alsactl_elem_info_integer, ALSACTL, + ELEM_INFO_INTEGER, GObject) + +struct _ALSACtlElemInfoIntegerClass { + GObjectClass parent_class; +}; + +ALSACtlElemInfoInteger *alsactl_elem_info_integer_new(); + +G_END_DECLS + +#endif diff --git a/src/ctl/meson.build b/src/ctl/meson.build index 4b6884c..51bf982 100644 --- a/src/ctl/meson.build +++ b/src/ctl/meson.build @@ -20,6 +20,7 @@ sources = files( 'elem-info-single-array.c', 'elem-info-boolean.c', 'elem-info-bytes.c', + 'elem-info-integer.c', ) headers = files( @@ -34,6 +35,7 @@ headers = files( 'elem-info-single-array.h', 'elem-info-boolean.h', 'elem-info-bytes.h', + 'elem-info-integer.h', ) privates = files( diff --git a/tests/alsactl-elem-info-integer b/tests/alsactl-elem-info-integer new file mode 100644 index 0000000..d5868a5 --- /dev/null +++ b/tests/alsactl-elem-info-integer @@ -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.ElemInfoInteger.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) diff --git a/tests/meson.build b/tests/meson.build index 8ea4375..85d9591 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -10,6 +10,7 @@ tests = { 'alsactl-elem-info-iec60958', 'alsactl-elem-info-boolean', 'alsactl-elem-info-bytes', + 'alsactl-elem-info-integer', 'alsactl-elem-value', ], 'timer': [ -- 2.47.3