From aac870451a899910c2233621244e567067b4c545 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: elem_info_int: add properties for type-dependent parameters and constructor --- src/ctl/alsactl.map | 1 + src/ctl/elem-info-int.c | 113 +++++++++++++++++++++++++++++++++++- src/ctl/elem-info-int.h | 2 + tests/alsactl-elem-info-int | 11 +++- 4 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index f828f09..cd24eed 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -36,6 +36,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_info_bool_new"; "alsactl_elem_info_int_get_type"; + "alsactl_elem_info_int_new"; local: *; }; diff --git a/src/ctl/elem-info-int.c b/src/ctl/elem-info-int.c index 64ac570..2bdfe36 100644 --- a/src/ctl/elem-info-int.c +++ b/src/ctl/elem-info-int.c @@ -1,14 +1,125 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "elem-info-int.h" +#include "privates.h" G_DEFINE_TYPE(ALSACtlElemInfoInt, alsactl_elem_info_int, ALSACTL_TYPE_ELEM_INFO) +enum ctl_elem_info_int_prop_type { + CTL_ELEM_INFO_INT_PROP_VALUE_COUNT = 1, + CTL_ELEM_INFO_INT_PROP_MIN, + CTL_ELEM_INFO_INT_PROP_MAX, + CTL_ELEM_INFO_INT_PROP_STEP, + CTL_ELEM_INFO_INT_PROP_COUNT, +}; +static GParamSpec *ctl_elem_info_int_props[CTL_ELEM_INFO_INT_PROP_COUNT] = { NULL, }; + +static void ctl_elem_info_int_set_property(GObject *obj, guint id, + const GValue *val, GParamSpec *spec) +{ + 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_INT_PROP_VALUE_COUNT: + info->count = g_value_get_uint(val); + break; + case CTL_ELEM_INFO_INT_PROP_MIN: + info->value.integer.min = (long)g_value_get_int(val); + break; + case CTL_ELEM_INFO_INT_PROP_MAX: + info->value.integer.min = (long)g_value_get_int(val); + break; + case CTL_ELEM_INFO_INT_PROP_STEP: + info->value.integer.min = (long)g_value_get_int(val); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + +static void ctl_elem_info_int_get_property(GObject *obj, guint id, GValue *val, + GParamSpec *spec) +{ + 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_INT_PROP_VALUE_COUNT: + g_value_set_uint(val, info->count); + break; + case CTL_ELEM_INFO_INT_PROP_MIN: + g_value_set_int(val, (int)info->value.integer.min); + break; + case CTL_ELEM_INFO_INT_PROP_MAX: + g_value_set_int(val, (int)info->value.integer.max); + break; + case CTL_ELEM_INFO_INT_PROP_STEP: + g_value_set_int(val, (int)info->value.integer.step); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + static void alsactl_elem_info_int_class_init(ALSACtlElemInfoIntClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->set_property = ctl_elem_info_int_set_property; + gobject_class->get_property = ctl_elem_info_int_get_property; + + ctl_elem_info_int_props[CTL_ELEM_INFO_INT_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_int_props[CTL_ELEM_INFO_INT_PROP_MIN] = + g_param_spec_int("min", "min", + "The minimum value for data of this element", + G_MININT, G_MAXINT, + 0, + G_PARAM_READWRITE); + + ctl_elem_info_int_props[CTL_ELEM_INFO_INT_PROP_MAX] = + g_param_spec_int("max", "max", + "The maximum value for data of this element", + G_MININT, G_MAXINT, + 0, + G_PARAM_READWRITE); + + ctl_elem_info_int_props[CTL_ELEM_INFO_INT_PROP_STEP] = + g_param_spec_int("step", "step", + "The gap of value for data of this element", + G_MININT, G_MAXINT, + 0, + G_PARAM_READWRITE); + + g_object_class_install_properties(gobject_class, + CTL_ELEM_INFO_INT_PROP_COUNT, ctl_elem_info_int_props); } static void alsactl_elem_info_int_init(ALSACtlElemInfoInt *self) { return; } + +/** + * alsactl_elem_info_int: + * + * Allocate and return an instance of ALSACtlElemInfoInt. + * + * Returns: (transfer full): A #ALSACtlElemInfoInt. + */ +ALSACtlElemInfoInt *alsactl_elem_info_int_new() +{ + return g_object_new(ALSACTL_TYPE_ELEM_INFO_INT, + "type", ALSACTL_ELEM_TYPE_INTEGER, NULL); +} diff --git a/src/ctl/elem-info-int.h b/src/ctl/elem-info-int.h index 433fabd..6f8df9a 100644 --- a/src/ctl/elem-info-int.h +++ b/src/ctl/elem-info-int.h @@ -42,6 +42,8 @@ struct _ALSACtlElemInfoIntClass { GType alsactl_elem_info_int_get_type(void) G_GNUC_CONST; +ALSACtlElemInfoInt *alsactl_elem_info_int_new(); + G_END_DECLS #endif diff --git a/tests/alsactl-elem-info-int b/tests/alsactl-elem-info-int index 168e2e9..111d858 100644 --- a/tests/alsactl-elem-info-int +++ b/tests/alsactl-elem-info-int @@ -10,8 +10,15 @@ gi.require_version('ALSACtl', '0.0') from gi.repository import ALSACtl target = ALSACtl.ElemInfoInt() -props = () -methods = () +props = ( + 'value-count', + 'min', + 'max', + 'step', +) +methods = ( + 'new', +) signals = () if not test(target, props, methods, signals): -- 2.47.3