From 2cd95a0a0f87a8ef4ae5c7e5feed3f888935e9fb Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: elem_info_bool: add properties for specific information and constructor --- src/ctl/alsactl.map | 1 + src/ctl/elem-info-bool.c | 71 +++++++++++++++++++++++++++++++++++- src/ctl/elem-info-bool.h | 2 + src/ctl/elem-info.c | 12 ++++-- src/ctl/privates.h | 4 ++ tests/alsactl-elem-info-bool | 8 +++- 6 files changed, 92 insertions(+), 6 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index cfb13c1..ae2a381 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -33,6 +33,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_info_get_type"; "alsactl_elem_info_bool_get_type"; + "alsactl_elem_info_bool_new"; local: *; }; diff --git a/src/ctl/elem-info-bool.c b/src/ctl/elem-info-bool.c index 0a72ce0..ac2623f 100644 --- a/src/ctl/elem-info-bool.c +++ b/src/ctl/elem-info-bool.c @@ -1,11 +1,68 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "elem-info-bool.h" +#include "privates.h" G_DEFINE_TYPE(ALSACtlElemInfoBool, alsactl_elem_info_bool, ALSACTL_TYPE_ELEM_INFO) +enum ctl_elem_info_bool_prop_type { + CTL_ELEM_INFO_BOOL_PROP_VALUE_COUNT = 1, + CTL_ELEM_INFO_BOOL_PROP_COUNT, +}; +static GParamSpec *ctl_elem_info_bool_props[CTL_ELEM_INFO_BOOL_PROP_COUNT] = { NULL, }; + +static void ctl_elem_info_bool_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_BOOL_PROP_VALUE_COUNT: + info->count = g_value_get_uint(val); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} +static void ctl_elem_info_bool_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_BOOL_PROP_VALUE_COUNT: + g_value_set_uint(val, info->count); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + + static void alsactl_elem_info_bool_class_init(ALSACtlElemInfoBoolClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->set_property = ctl_elem_info_bool_set_property; + gobject_class->get_property = ctl_elem_info_bool_get_property; + + ctl_elem_info_bool_props[CTL_ELEM_INFO_BOOL_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); + + g_object_class_install_properties(gobject_class, + CTL_ELEM_INFO_BOOL_PROP_COUNT, + ctl_elem_info_bool_props); } static void alsactl_elem_info_bool_init(ALSACtlElemInfoBool *self) @@ -13,3 +70,15 @@ static void alsactl_elem_info_bool_init(ALSACtlElemInfoBool *self) return; } +/** + * alsactl_elem_info_bool_new: + * + * Allocate and return an instance of ALSACtlElemInfoBool. + * + * Returns: (transfer full): A #ALSACtlElemInfoBool. + */ +ALSACtlElemInfoBool *alsactl_elem_info_bool_new() +{ + return g_object_new(ALSACTL_TYPE_ELEM_INFO_BOOL, + "type", ALSACTL_ELEM_TYPE_BOOLEAN, NULL); +} diff --git a/src/ctl/elem-info-bool.h b/src/ctl/elem-info-bool.h index 96f2665..d79a516 100644 --- a/src/ctl/elem-info-bool.h +++ b/src/ctl/elem-info-bool.h @@ -44,6 +44,8 @@ struct _ALSACtlElemInfoBoolClass { GType alsactl_elem_info_bool_get_type(void) G_GNUC_CONST; +ALSACtlElemInfoBool *alsactl_elem_info_bool_new(); + G_END_DECLS #endif diff --git a/src/ctl/elem-info.c b/src/ctl/elem-info.c index 1dc0c7b..79744de 100644 --- a/src/ctl/elem-info.c +++ b/src/ctl/elem-info.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "elem-info.h" - -#include +#include "privates.h" struct _ALSACtlElemInfoPrivate { struct snd_ctl_elem_info info; @@ -107,3 +105,11 @@ static void alsactl_elem_info_init(ALSACtlElemInfo *self) { return; } + +void ctl_elem_info_refer_private(ALSACtlElemInfo *self, + struct snd_ctl_elem_info **info) +{ + ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self); + + *info = &priv->info; +} diff --git a/src/ctl/privates.h b/src/ctl/privates.h index 986c7de..4868386 100644 --- a/src/ctl/privates.h +++ b/src/ctl/privates.h @@ -9,6 +9,7 @@ #include "card-info.h" #include "elem-id.h" +#include "elem-info.h" #include @@ -23,6 +24,9 @@ GQuark alsactl_error_quark(void); void ctl_card_info_refer_private(ALSACtlCardInfo *self, struct snd_ctl_card_info **info); +void ctl_elem_info_refer_private(ALSACtlElemInfo *self, + struct snd_ctl_elem_info **info); + G_END_DECLS #endif diff --git a/tests/alsactl-elem-info-bool b/tests/alsactl-elem-info-bool index 0493eec..c4b6cc3 100644 --- a/tests/alsactl-elem-info-bool +++ b/tests/alsactl-elem-info-bool @@ -10,8 +10,12 @@ gi.require_version('ALSACtl', '0.0') from gi.repository import ALSACtl target = ALSACtl.ElemInfoBool() -props = () -methods = () +props = ( + 'value-count', +) +methods = ( + 'new', +) signals = () if not test(target, props, methods, signals): -- 2.47.3