From 84ae3ef3f3c327912dc8de9d4fa4c22e3d7c0337 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: elem_info: add properties for common information --- src/ctl/elem-info.c | 99 ++++++++++++++++++++++++++++++++++++++++- src/ctl/elem-info.h | 7 +++ tests/alsactl-elem-info | 7 ++- 3 files changed, 110 insertions(+), 3 deletions(-) diff --git a/src/ctl/elem-info.c b/src/ctl/elem-info.c index 5d96d30..1dc0c7b 100644 --- a/src/ctl/elem-info.c +++ b/src/ctl/elem-info.c @@ -1,11 +1,106 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "elem-info.h" -G_DEFINE_ABSTRACT_TYPE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT) +#include + +struct _ALSACtlElemInfoPrivate { + struct snd_ctl_elem_info info; +}; +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT) + +enum ctl_elem_info_prop_type { + CTL_ELEM_INFO_PROP_ELEM_ID = 1, + CTL_ELEM_INFO_PROP_TYPE, + CTL_ELEM_INFO_PROP_ACCESS, + CTL_ELEM_INFO_PROP_OWNER, + CTL_ELEM_INFO_PROP_COUNT, +}; +static GParamSpec *ctl_elem_info_props[CTL_ELEM_INFO_PROP_COUNT] = { NULL, }; + +static void ctl_elem_info_set_property(GObject *obj, guint id, + const GValue *val, GParamSpec *spec) +{ + ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj); + ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self); + + switch (id) { + case CTL_ELEM_INFO_PROP_TYPE: + priv->info.type = (ALSACtlElemType)g_value_get_enum(val); + break; + case CTL_ELEM_INFO_PROP_ACCESS: + priv->info.access = (ALSACtlElemAccessFlag)g_value_get_flags(val); + break; + case CTL_ELEM_INFO_PROP_OWNER: + priv->info.owner = g_value_get_int(val); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + +static void ctl_elem_info_get_property(GObject *obj, guint id, GValue *val, + GParamSpec *spec) +{ + ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj); + ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self); + + switch (id) { + case CTL_ELEM_INFO_PROP_ELEM_ID: + g_value_set_static_boxed(val, (const ALSACtlElemId* )&priv->info.id); + break; + case CTL_ELEM_INFO_PROP_TYPE: + g_value_set_enum(val, (ALSACtlElemType)priv->info.type); + break; + case CTL_ELEM_INFO_PROP_ACCESS: + g_value_set_flags(val, priv->info.access); + break; + case CTL_ELEM_INFO_PROP_OWNER: + g_value_set_int(val, priv->info.owner); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->set_property = ctl_elem_info_set_property; + gobject_class->get_property = ctl_elem_info_get_property; + + ctl_elem_info_props[CTL_ELEM_INFO_PROP_ELEM_ID] = + g_param_spec_boxed("elem-id", "elem-id", + "The identifier of the element, one of ALSACtlElemId", + ALSACTL_TYPE_ELEM_ID, + G_PARAM_READABLE); + + ctl_elem_info_props[CTL_ELEM_INFO_PROP_TYPE] = + g_param_spec_enum("type", "type", + "The type for this element, one of ALSACtlElemType", + ALSACTL_TYPE_ELEM_TYPE, + ALSACTL_ELEM_TYPE_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + ctl_elem_info_props[CTL_ELEM_INFO_PROP_ACCESS] = + g_param_spec_flags("access", "access", + "The access permission for this element with " + "flags of ALSACtlElemAccessFlag.", + ALSACTL_TYPE_ELEM_ACCESS_FLAG, + ALSACTL_ELEM_ACCESS_FLAG_READ, + G_PARAM_READWRITE); + + ctl_elem_info_props[CTL_ELEM_INFO_PROP_OWNER] = + g_param_spec_int("owner", "owner", + "The value of PID for process to own the element", + G_MININT, G_MAXINT, + -1, + G_PARAM_READABLE); + + g_object_class_install_properties(gobject_class, CTL_ELEM_INFO_PROP_COUNT, + ctl_elem_info_props); } static void alsactl_elem_info_init(ALSACtlElemInfo *self) diff --git a/src/ctl/elem-info.h b/src/ctl/elem-info.h index 6256673..ea6d7e7 100644 --- a/src/ctl/elem-info.h +++ b/src/ctl/elem-info.h @@ -5,6 +5,10 @@ #include #include +#include + +#include + G_BEGIN_DECLS #define ALSACTL_TYPE_ELEM_INFO (alsactl_elem_info_get_type()) @@ -31,9 +35,12 @@ G_BEGIN_DECLS typedef struct _ALSACtlElemInfo ALSACtlElemInfo; typedef struct _ALSACtlElemInfoClass ALSACtlElemInfoClass; +typedef struct _ALSACtlElemInfoPrivate ALSACtlElemInfoPrivate; struct _ALSACtlElemInfo { GObject parent_instance; + + ALSACtlElemInfoPrivate *priv; }; struct _ALSACtlElemInfoClass { diff --git a/tests/alsactl-elem-info b/tests/alsactl-elem-info index dfb56dd..36c0acd 100644 --- a/tests/alsactl-elem-info +++ b/tests/alsactl-elem-info @@ -10,7 +10,12 @@ gi.require_version('ALSACtl', '0.0') from gi.repository import ALSACtl target = ALSACtl.ElemInfo -props = () +props = ( + 'elem-id', + 'type', + 'access', + 'owner', +) methods = () signals = () -- 2.47.3