From 19c5ac41019425e92a0b55f92d7dfc5d99f105b7 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH] ctl: elem-value: rewrite getter for boolean values This commit rewrites the getter method so that it returns a pointer to internal storage for boolean values. Signed-off-by: Takashi Sakamoto --- samples/ctl | 2 +- src/ctl/alsactl.map | 3 ++- src/ctl/elem-value.c | 17 ++++++++++------- src/ctl/elem-value.h | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/samples/ctl b/samples/ctl index 813b5f2..57742c0 100755 --- a/samples/ctl +++ b/samples/ctl @@ -42,7 +42,7 @@ def handle_elem_event(card, elem_id, events): value_count = info.get_property('value-count') value = [0] * value_count if info.get_property('elem-type') == ALSACtl.ElemType.BOOLEAN: - value = elem_value.get_bool(value) + value = elem_value.get_bool()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER: value = elem_value.get_int(value) elif info.get_property('elem-type') == ALSACtl.ElemType.ENUMERATED: diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 70c69a4..398af1b 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -25,7 +25,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_get_type"; "alsactl_elem_value_new"; "alsactl_elem_value_set_bool"; - "alsactl_elem_value_get_bool"; "alsactl_elem_value_set_int"; "alsactl_elem_value_get_int"; "alsactl_elem_value_set_enum"; @@ -93,4 +92,6 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_info_enumerated_get_type"; "alsactl_elem_info_enumerated_new"; + + "alsactl_elem_value_get_bool"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 06d7e04..db22b72 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -15,6 +15,7 @@ */ typedef struct { struct snd_ctl_elem_value value; + gboolean boolean[128]; } ALSACtlElemValuePrivate; G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlElemValue, alsactl_elem_value, G_TYPE_OBJECT) @@ -117,12 +118,12 @@ void alsactl_elem_value_set_bool(ALSACtlElemValue *self, const gboolean *values, /** * alsactl_elem_value_get_bool: * @self: A [class@ElemValue]. - * @values: (array length=value_count)(inout): The array for values of boolean type. + * @values: (array length=value_count) (out) (transfer none): The array for boolean values. * @value_count: The number of values up to 128. - * - * Copy the array for values of boolean type from internal data. + * + * Refer to the array specific to [enum@ElemType].BOOLEAN element in internal storage. */ -void alsactl_elem_value_get_bool(ALSACtlElemValue *self, gboolean *const *values, +void alsactl_elem_value_get_bool(ALSACtlElemValue *self, const gboolean **values, gsize *value_count) { ALSACtlElemValuePrivate *priv; @@ -136,9 +137,11 @@ void alsactl_elem_value_get_bool(ALSACtlElemValue *self, gboolean *const *values g_return_if_fail(value_count != NULL); value = &priv->value; - *value_count = MIN(*value_count, G_N_ELEMENTS(value->value.integer.value)); - for (i = 0; i < *value_count; ++i) - (*values)[i] = (gboolean)value->value.integer.value[i]; + for (i = 0; i < G_N_ELEMENTS(value->value.integer.value); ++i) + priv->boolean[i] = value->value.integer.value[i] > 0; + + *values = priv->boolean; + *value_count = G_N_ELEMENTS(value->value.integer.value); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index b87107b..35e0e42 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -19,7 +19,7 @@ ALSACtlElemValue *alsactl_elem_value_new(); void alsactl_elem_value_set_bool(ALSACtlElemValue *self, const gboolean *values, gsize value_count); void alsactl_elem_value_get_bool(ALSACtlElemValue *self, - gboolean *const *values, gsize *value_count); + const gboolean **values, gsize *value_count); void alsactl_elem_value_set_int(ALSACtlElemValue *self, const gint32 *values, gsize value_count); -- 2.47.3