From b25ffd805bb1443cb48c65878519a89df4d32391 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Fri, 12 Jun 2020 13:19:45 +0900 Subject: [PATCH] ctl: elem_info: add accessor APIs for label entries of enumerated element Signed-off-by: Takashi Sakamoto --- src/ctl/alsactl.map | 2 ++ src/ctl/card.c | 8 ++++- src/ctl/elem-info.c | 72 ++++++++++++++++++++++++++++++++++++++++- src/ctl/elem-info.h | 5 +++ tests/alsactl-elem-info | 2 ++ 5 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 61f463b..63bde1d 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -47,6 +47,8 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_info_set_int_data"; "alsactl_elem_info_get_int64_data"; "alsactl_elem_info_set_int64_data"; + "alsactl_elem_info_get_enum_data"; + "alsactl_elem_info_set_enum_data"; "alsactl_elem_info_bool_get_type"; "alsactl_elem_info_bool_new"; diff --git a/src/ctl/card.c b/src/ctl/card.c index 03903b6..7100fc4 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -422,8 +422,14 @@ void alsactl_card_get_elem_info(ALSACtlCard *self, const ALSACtlElemId *elem_id, *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO_ENUM, "labels", labels, NULL); - + alsactl_elem_info_set_enum_data(*elem_info, (const gchar **)labels, + error); g_strfreev(labels); + if (*error != NULL) { + g_object_unref(*elem_info); + return; + } + break; } default: diff --git a/src/ctl/elem-info.c b/src/ctl/elem-info.c index e7e1c0f..74c7ca9 100644 --- a/src/ctl/elem-info.c +++ b/src/ctl/elem-info.c @@ -22,6 +22,7 @@ struct _ALSACtlElemInfoPrivate { gint32 max; gint32 step; } int_data; + gchar **enum_data; }; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT) @@ -81,12 +82,23 @@ static void ctl_elem_info_get_property(GObject *obj, guint id, GValue *val, } } +static void ctl_elem_info_finalize(GObject *obj) +{ + ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj); + ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self); + + g_strfreev(priv->enum_data); + + G_OBJECT_CLASS(alsactl_elem_info_parent_class)->finalize(obj); +} + static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass) { 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; + gobject_class->finalize = ctl_elem_info_finalize; ctl_elem_info_props[CTL_ELEM_INFO_PROP_ELEM_ID] = g_param_spec_boxed("elem-id", "elem-id", @@ -122,7 +134,9 @@ static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass) static void alsactl_elem_info_init(ALSACtlElemInfo *self) { - return; + ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self); + + priv->enum_data = NULL; } /** @@ -249,6 +263,62 @@ void alsactl_elem_info_set_int64_data(ALSACtlElemInfo *self, priv->info.value.integer.step = (long long)data[2]; } +/** + * alsactl_elem_info_get_enum_data: + * @self: A #ALSACtlElemInfo. + * @data: (array zero-terminated=1)(out)(transfer none): The array with elements + * for the label entries of enumerated element. + * @error: A #GError. + * + * Refer to the array with elements for the label entries of enumerated element + * in internal storage. The call of function is successful as long as the + * information is for enumerated type. + */ +void alsactl_elem_info_get_enum_data(ALSACtlElemInfo *self, + const gchar ***data, GError **error) +{ + ALSACtlElemInfoPrivate *priv; + + g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); + priv = alsactl_elem_info_get_instance_private(self); + + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) { + generate_error(error, ENXIO); + return; + } + + *data = (const gchar **)priv->enum_data; +} + +/** + * alsactl_elem_info_set_enum_data: + * @self: A #ALSACtlElemInfo. + * @data: (array zero-terminated=1): The array with elements for the label + * entries of enumerated element. + * @error: A #GError. + * + * Copy the array with elements for the label entries of enumerated element + * into internal storage. The call of function is successful as long as the + * information is for enumerated type. + */ +void alsactl_elem_info_set_enum_data(ALSACtlElemInfo *self, + const gchar **data, GError **error) +{ + ALSACtlElemInfoPrivate *priv; + + g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); + priv = alsactl_elem_info_get_instance_private(self); + + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) { + generate_error(error, ENXIO); + return; + } + + g_strfreev(priv->enum_data); + + priv->enum_data = g_strdupv((gchar **)data); +} + void ctl_elem_info_refer_private(ALSACtlElemInfo *self, struct snd_ctl_elem_info **info) { diff --git a/src/ctl/elem-info.h b/src/ctl/elem-info.h index 548e299..6891eec 100644 --- a/src/ctl/elem-info.h +++ b/src/ctl/elem-info.h @@ -59,6 +59,11 @@ void alsactl_elem_info_get_int64_data(ALSACtlElemInfo *self, void alsactl_elem_info_set_int64_data(ALSACtlElemInfo *self, const gint64 data[3], GError **error); +void alsactl_elem_info_get_enum_data(ALSACtlElemInfo *self, + const gchar ***data, GError **error); +void alsactl_elem_info_set_enum_data(ALSACtlElemInfo *self, + const gchar **data, GError **error); + G_END_DECLS #endif diff --git a/tests/alsactl-elem-info b/tests/alsactl-elem-info index 78cebdc..cc0c28c 100644 --- a/tests/alsactl-elem-info +++ b/tests/alsactl-elem-info @@ -21,6 +21,8 @@ methods = ( 'set_int_data', 'get_int64_data', 'set_int64_data', + 'get_enum_data', + 'set_enum_data', ) signals = () -- 2.47.3