From: Takashi Sakamoto Date: Thu, 2 Jun 2022 09:26:26 +0000 (+0900) Subject: ctl: elem-info-integer64: add class for element information of integer64 type X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=acf85fe10980484f81a2b4c5ad02ad73c6b105b1;p=alsa-gobject.git ctl: elem-info-integer64: add class for element information of integer64 type 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 --- diff --git a/src/ctl/alsactl.h b/src/ctl/alsactl.h index 24b5e02..d77aae4 100644 --- a/src/ctl/alsactl.h +++ b/src/ctl/alsactl.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index d0e721a..f93f23f 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -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 index 0000000..d9e3805 --- /dev/null +++ b/src/ctl/elem-info-integer64.c @@ -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 index 0000000..73a4053 --- /dev/null +++ b/src/ctl/elem-info-integer64.h @@ -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 + +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 diff --git a/src/ctl/meson.build b/src/ctl/meson.build index 51bf982..d242663 100644 --- a/src/ctl/meson.build +++ b/src/ctl/meson.build @@ -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 index 0000000..b9b8eb1 --- /dev/null +++ b/tests/alsactl-elem-info-integer64 @@ -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) diff --git a/tests/meson.build b/tests/meson.build index 85d9591..cd9862d 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -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': [