From 453a39e8d210b370b18b7afb0dddd5581f081ae7 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 01/11] timer: fix entry in exported symbol map Fixes: b4e62cdc0eac ("timer: instance-status: rename method with real time") Signed-off-by: Takashi Sakamoto --- src/timer/alsatimer.map | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/timer/alsatimer.map b/src/timer/alsatimer.map index 8ed662b3..d827e74e 100644 --- a/src/timer/alsatimer.map +++ b/src/timer/alsatimer.map @@ -33,7 +33,6 @@ ALSA_GOBJECT_0_0_0 { "alsatimer_instance_status_get_type"; "alsatimer_instance_status_new"; - "alsatimer_instance_status_get_time"; local: *; }; @@ -77,4 +76,6 @@ ALSA_GOBJECT_0_3_0 { "alsatimer_real_time_event_get_event"; "alsatimer_real_time_event_get_time"; "alsatimer_real_time_event_get_val"; + + "alsatimer_instance_status_get_time"; } ALSA_GOBJECT_0_2_0; From 98858e84c8bdd83a7134815df2cad942dc06e8ad Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 02/11] ctl: elem-value: clear value field at setter method For safe at reuse of the boxed structure. Signed-off-by: Takashi Sakamoto --- src/ctl/elem-value.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 615e8faf..06d7e040 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -108,6 +108,7 @@ void alsactl_elem_value_set_bool(ALSACtlElemValue *self, const gboolean *values, g_return_if_fail(values != NULL); value = &priv->value; + memset(&value->value.integer.value, 0, sizeof(value->value.integer.value)); value_count = MIN(value_count, G_N_ELEMENTS(value->value.integer.value)); for (i = 0; i < value_count; ++i) value->value.integer.value[i] = (long)values[i]; @@ -160,6 +161,7 @@ void alsactl_elem_value_set_int(ALSACtlElemValue *self, const gint32 *values, gs g_return_if_fail(values != NULL); value = &priv->value; + memset(&value->value.integer.value, 0, sizeof(value->value.integer.value)); value_count = MIN(value_count, G_N_ELEMENTS(value->value.integer.value)); for (i = 0; i < value_count; ++i) value->value.integer.value[i] = (long)values[i]; @@ -212,6 +214,7 @@ void alsactl_elem_value_set_enum(ALSACtlElemValue *self, const guint32 *values, g_return_if_fail(values != NULL); value = &priv->value; + memset(&value->value.enumerated.item, 0, sizeof(value->value.enumerated.item)); value_count = MIN(value_count, G_N_ELEMENTS(value->value.enumerated.item)); for (i = 0; i < value_count; ++i) value->value.enumerated.item[i] = (unsigned int)values[i]; @@ -263,6 +266,7 @@ void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, const guint8 *values, g_return_if_fail(values != NULL); value = &priv->value; + memset(&value->value.bytes.data, 0, sizeof(value->value.bytes.data)); value_count = MIN(value_count, G_N_ELEMENTS(value->value.bytes.data)); for (i = 0; i < value_count; ++i) value->value.bytes.data[i] = (long)values[i]; @@ -315,6 +319,7 @@ void alsactl_elem_value_set_iec60958_channel_status(ALSACtlElemValue *self, cons g_return_if_fail(status != NULL); value = &priv->value; + memset(&value->value.iec958.status, 0, sizeof(value->value.iec958.status)); length = MIN(length, G_N_ELEMENTS(value->value.iec958.status)); for (i = 0; i < length; ++i) value->value.iec958.status[i] = status[i]; @@ -369,6 +374,7 @@ void alsactl_elem_value_set_iec60958_user_data(ALSACtlElemValue *self, const gui g_return_if_fail(data != NULL); value = &priv->value; + memset(&value->value.iec958.subcode, 0, sizeof(value->value.iec958.subcode)); length = MIN(length, G_N_ELEMENTS(value->value.iec958.subcode)); for (i = 0; i < length; ++i) value->value.iec958.subcode[i] = data[i]; @@ -421,6 +427,7 @@ void alsactl_elem_value_set_int64(ALSACtlElemValue *self, const gint64 *values, g_return_if_fail(values != NULL); value = &priv->value; + memset(&value->value.integer64.value, 0, sizeof(value->value.integer64.value)); value_count = MIN(value_count, G_N_ELEMENTS(value->value.integer64.value)); for (i = 0; i < value_count; ++i) value->value.integer64.value[i] = (long long)values[i]; From 8838f341c164d688882200986b94b82fd05f378f Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 03/11] 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 813b5f24..57742c0b 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 70c69a4f..398af1be 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 06d7e040..db22b72b 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 b87107b3..35e0e428 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); From 87de08b33ce8c51638d9ac19fd61d1e1044e13b0 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 04/11] ctl: elem-value: rewrite getter for 32 bit signed integer values This commit rewrites the getter method so that it returns a pointer to internal storage for 32 bit signed integer values. Signed-off-by: Takashi Sakamoto --- samples/ctl | 2 +- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 17 ++++++++++------- src/ctl/elem-value.h | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/samples/ctl b/samples/ctl index 57742c0b..a12b91a9 100755 --- a/samples/ctl +++ b/samples/ctl @@ -44,7 +44,7 @@ def handle_elem_event(card, elem_id, events): if info.get_property('elem-type') == ALSACtl.ElemType.BOOLEAN: value = elem_value.get_bool()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER: - value = elem_value.get_int(value) + value = elem_value.get_int()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.ENUMERATED: value = elem_value.get_enum(value) elif info.get_property('elem-type') == ALSACtl.ElemType.BYTES: diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 398af1be..85f4ff80 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -26,7 +26,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_new"; "alsactl_elem_value_set_bool"; "alsactl_elem_value_set_int"; - "alsactl_elem_value_get_int"; "alsactl_elem_value_set_enum"; "alsactl_elem_value_get_enum"; "alsactl_elem_value_set_bytes"; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_info_enumerated_new"; "alsactl_elem_value_get_bool"; + "alsactl_elem_value_get_int"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index db22b72b..59f466d9 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -16,6 +16,7 @@ typedef struct { struct snd_ctl_elem_value value; gboolean boolean[128]; + gint32 integer[128]; } ALSACtlElemValuePrivate; G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlElemValue, alsactl_elem_value, G_TYPE_OBJECT) @@ -173,13 +174,13 @@ void alsactl_elem_value_set_int(ALSACtlElemValue *self, const gint32 *values, gs /** * alsactl_elem_value_get_int: * @self: A [class@ElemValue]. - * @values: (array length=value_count)(inout): The array for values of integer - * type. + * @values: (array length=value_count) (out) (transfer none): The array for 32 bit signed integer + * values. * @value_count: The number of values up to 128. * - * Copy the array for values of integer type from internal storage. + * Refer to the array for [enum@ElemType].INTEGER element in internal storage. */ -void alsactl_elem_value_get_int(ALSACtlElemValue *self, gint32 *const *values, gsize *value_count) +void alsactl_elem_value_get_int(ALSACtlElemValue *self, const gint32 **values, gsize *value_count) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; @@ -192,9 +193,11 @@ void alsactl_elem_value_get_int(ALSACtlElemValue *self, gint32 *const *values, g 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] = (gint32)value->value.integer.value[i]; + for (i = 0; i < G_N_ELEMENTS(value->value.integer.value); ++i) + priv->integer[i] = (gint32)value->value.integer.value[i]; + + *values = priv->integer; + *value_count = G_N_ELEMENTS(value->value.integer.value); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 35e0e428..0e2ff57b 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -23,7 +23,7 @@ void alsactl_elem_value_get_bool(ALSACtlElemValue *self, void alsactl_elem_value_set_int(ALSACtlElemValue *self, const gint32 *values, gsize value_count); -void alsactl_elem_value_get_int(ALSACtlElemValue *self, gint32 *const *values, +void alsactl_elem_value_get_int(ALSACtlElemValue *self, const gint32 **values, gsize *value_count); void alsactl_elem_value_set_enum(ALSACtlElemValue *self, From 857481c73f31fd2ed92863ef0ea7aab7da71e56f Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 05/11] ctl: elem-value: rewrite getter for enumeration index values This commit rewrites the getter method so that it returns a pointer to internal storage for enumeration index values. Signed-off-by: Takashi Sakamoto --- samples/ctl | 2 +- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 13 ++++++------- src/ctl/elem-value.h | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/samples/ctl b/samples/ctl index a12b91a9..a199ce49 100755 --- a/samples/ctl +++ b/samples/ctl @@ -46,7 +46,7 @@ def handle_elem_event(card, elem_id, events): elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER: value = elem_value.get_int()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.ENUMERATED: - value = elem_value.get_enum(value) + value = elem_value.get_enum()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.BYTES: value = elem_value.get_bytes(value) elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER64: diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 85f4ff80..93bf2a7c 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -27,7 +27,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_set_bool"; "alsactl_elem_value_set_int"; "alsactl_elem_value_set_enum"; - "alsactl_elem_value_get_enum"; "alsactl_elem_value_set_bytes"; "alsactl_elem_value_get_bytes"; "alsactl_elem_value_set_iec60958_user_data"; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_value_get_bool"; "alsactl_elem_value_get_int"; + "alsactl_elem_value_get_enum"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 59f466d9..2dbe2c13 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -229,16 +229,16 @@ void alsactl_elem_value_set_enum(ALSACtlElemValue *self, const guint32 *values, /** * alsactl_elem_value_get_enum: * @self: A [class@ElemValue]. - * @values: (array length=value_count)(inout): The array for values of enumeration index. + * @values: (array length=value_count) (out) (transfer none): The array for enumeration index + * values. * @value_count: The number of values up to 128. * - * Copy the array for values of enumeration index from internal storage. + * Refer to the array specific to [enum@ElemType].ENUMERATED element in internal storage. */ -void alsactl_elem_value_get_enum(ALSACtlElemValue *self, guint32 *const *values, gsize *value_count) +void alsactl_elem_value_get_enum(ALSACtlElemValue *self, const guint32 **values, gsize *value_count) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; - int i; g_return_if_fail(ALSACTL_IS_ELEM_VALUE(self)); priv = alsactl_elem_value_get_instance_private(self); @@ -247,9 +247,8 @@ void alsactl_elem_value_get_enum(ALSACtlElemValue *self, guint32 *const *values, g_return_if_fail(value_count != NULL); value = &priv->value; - *value_count = MIN(*value_count, G_N_ELEMENTS(value->value.enumerated.item)); - for (i = 0; i < *value_count; ++i) - (*values)[i] = (guint32)value->value.enumerated.item[i]; + *values = value->value.enumerated.item; + *value_count = G_N_ELEMENTS(value->value.enumerated.item); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 0e2ff57b..20e23f19 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -29,7 +29,7 @@ void alsactl_elem_value_get_int(ALSACtlElemValue *self, const gint32 **values, void alsactl_elem_value_set_enum(ALSACtlElemValue *self, const guint32 *values, gsize value_count); void alsactl_elem_value_get_enum(ALSACtlElemValue *self, - guint32 *const *values, gsize *value_count); + const guint32 **values, gsize *value_count); void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, const guint8 *values, gsize value_count); From 99a2b3475763e44ea521cd495b2e0fbc6a1146b6 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 06/11] ctl: elem-value: rewrite getter for 8 bit unsigned integer values This commit rewrites the getter method so that it returns a pointer to internal storage for 8 bit unsigned integer values. Signed-off-by: Takashi Sakamoto --- samples/ctl | 2 +- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 15 +++++++-------- src/ctl/elem-value.h | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/samples/ctl b/samples/ctl index a199ce49..dadffb10 100755 --- a/samples/ctl +++ b/samples/ctl @@ -48,7 +48,7 @@ def handle_elem_event(card, elem_id, events): elif info.get_property('elem-type') == ALSACtl.ElemType.ENUMERATED: value = elem_value.get_enum()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.BYTES: - value = elem_value.get_bytes(value) + value = elem_value.get_bytes()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER64: value = elem_value.get_int64(value) print(value) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 93bf2a7c..b2902989 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -28,7 +28,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_set_int"; "alsactl_elem_value_set_enum"; "alsactl_elem_value_set_bytes"; - "alsactl_elem_value_get_bytes"; "alsactl_elem_value_set_iec60958_user_data"; "alsactl_elem_value_get_iec60958_user_data"; "alsactl_elem_value_set_iec60958_channel_status"; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_value_get_bool"; "alsactl_elem_value_get_int"; "alsactl_elem_value_get_enum"; + "alsactl_elem_value_get_bytes"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 2dbe2c13..efde32ba 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -280,16 +280,16 @@ void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, const guint8 *values, /** * alsactl_elem_value_get_bytes: * @self: A [class@ElemValue]. - * @values: (array length=value_count)(inout): The array for values of bytes type. - * @value_count: The number of values up to 512. + * @values: (array length=value_count) (out) (transfer none): The array for 8 bit unsigned integer + * values. + * @value_count: (out): The number of values up to 512. * - * Copy the array for values of bytes type into internal storage. + * Refer to the array specific to [enum@ElemType].BYTES element in internal storage. */ -void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, guint8 *const *values, gsize *value_count) +void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, const guint8 **values, gsize *value_count) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; - int i; g_return_if_fail(ALSACTL_IS_ELEM_VALUE(self)); priv = alsactl_elem_value_get_instance_private(self); @@ -298,9 +298,8 @@ void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, guint8 *const *values, g_return_if_fail(value_count != NULL); value = &priv->value; - *value_count = MIN(*value_count, G_N_ELEMENTS(value->value.bytes.data)); - for (i = 0; i < *value_count; ++i) - (*values)[i] = (guint8)value->value.bytes.data[i]; + *values = value->value.bytes.data; + *value_count = G_N_ELEMENTS(value->value.bytes.data); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 20e23f19..6a1ef6e1 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -34,7 +34,7 @@ void alsactl_elem_value_get_enum(ALSACtlElemValue *self, void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, const guint8 *values, gsize value_count); void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, - guint8 *const *values, gsize *value_count); + const guint8 **values, gsize *value_count); void alsactl_elem_value_set_iec60958_channel_status(ALSACtlElemValue *self, const guint8 *status, gsize length); From c63ec99c9bf72b96fd25b56c34cf222555ae9d93 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 07/11] ctl: elem-value: rewrite getter for IEC 60958 channel status This commit rewrites the getter method so that it returns a pointer to internal storage for IEC 60958 channel status. Signed-off-by: Takashi Sakamoto --- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 16 +++++++--------- src/ctl/elem-value.h | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index b2902989..a8fd5563 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -29,7 +29,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_set_enum"; "alsactl_elem_value_set_bytes"; "alsactl_elem_value_set_iec60958_user_data"; - "alsactl_elem_value_get_iec60958_user_data"; "alsactl_elem_value_set_iec60958_channel_status"; "alsactl_elem_value_get_iec60958_channel_status"; "alsactl_elem_value_set_int64"; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_value_get_int"; "alsactl_elem_value_get_enum"; "alsactl_elem_value_get_bytes"; + "alsactl_elem_value_get_iec60958_user_data"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index efde32ba..697fad22 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -332,18 +332,17 @@ void alsactl_elem_value_set_iec60958_channel_status(ALSACtlElemValue *self, cons /** * alsactl_elem_value_get_iec60958_channel_status: * @self: A [class@ElemValue]. - * @status: (array length=length)(inout): The array of byte data for channel status bits for - * IEC 60958 element. - * @length: The number of bytes in status argument, up to 24. + * @status: (array length=length) (out) (transfer none): The array of byte data for channel status + * bits of IEC 60958. + * @length: The number of bytes in status argument up to 24. * - * Copy channel status of IEC 60958 from internal storage. + * Refer to the array specific to [enum@ElemType].IEC60958 element in internal storage. */ -void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, guint8 *const *status, +void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, const guint8 **status, gsize *length) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; - int i; g_return_if_fail(ALSACTL_IS_ELEM_VALUE(self)); priv = alsactl_elem_value_get_instance_private(self); @@ -352,9 +351,8 @@ void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, guin g_return_if_fail(length != NULL); value = &priv->value; - *length = MIN(*length, G_N_ELEMENTS(value->value.iec958.status)); - for (i = 0; i < *length; ++i) - (*status)[i] = value->value.iec958.status[i]; + *status = value->value.iec958.status; + *length = G_N_ELEMENTS(value->value.iec958.status); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 6a1ef6e1..6a69105e 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -39,7 +39,7 @@ void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, void alsactl_elem_value_set_iec60958_channel_status(ALSACtlElemValue *self, const guint8 *status, gsize length); void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, - guint8 *const *status, gsize *length); + const guint8 **status, gsize *length); void alsactl_elem_value_set_iec60958_user_data(ALSACtlElemValue *self, const guint8 *data, gsize length); From 847f35a5c0b2072b37dd194aa473273d0896b266 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 08/11] ctl: elem-value: rewrite getter for IEC 60958 user data This commit rewrites the getter method so that it returns a pointer to internal storage for IEC 60958 user data. Signed-off-by: Takashi Sakamoto --- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 15 +++++++-------- src/ctl/elem-value.h | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index a8fd5563..385d1979 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -30,7 +30,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_set_bytes"; "alsactl_elem_value_set_iec60958_user_data"; "alsactl_elem_value_set_iec60958_channel_status"; - "alsactl_elem_value_get_iec60958_channel_status"; "alsactl_elem_value_set_int64"; "alsactl_elem_value_get_int64"; "alsactl_elem_value_equal"; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_value_get_enum"; "alsactl_elem_value_get_bytes"; "alsactl_elem_value_get_iec60958_user_data"; + "alsactl_elem_value_get_iec60958_channel_status"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 697fad22..44f92683 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -385,17 +385,17 @@ void alsactl_elem_value_set_iec60958_user_data(ALSACtlElemValue *self, const gui /** * alsactl_elem_value_get_iec60958_user_data: * @self: A [class@ElemValue]. - * @data: (array length=length)(inout): The array of byte data for user data bits in IEC 60958. - * @length: The number of bytes in user_data argument, up to 147. + * @data: (array length=length) (out) (transfer none): The array of byte data for user data bits of + * IEC 60958. + * @length: The number of bytes in user_data argument up to 147. * - * Copy user data of IEC 60958 from internal storage. + * Refer to the array specific to [enum@ElemType].IEC60958 element in internal storage. */ -void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, guint8 *const *data, +void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, const guint8 **data, gsize *length) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; - int i; g_return_if_fail(ALSACTL_IS_ELEM_VALUE(self)); priv = alsactl_elem_value_get_instance_private(self); @@ -404,9 +404,8 @@ void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, guint8 *c g_return_if_fail(length != NULL); value = &priv->value; - *length = MIN(*length, G_N_ELEMENTS(value->value.iec958.subcode)); - for (i = 0; i < *length; ++i) - (*data)[i] = value->value.iec958.subcode[i]; + *data = value->value.iec958.subcode; + *length = G_N_ELEMENTS(value->value.iec958.subcode); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 6a69105e..17d08b09 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -44,7 +44,7 @@ void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, void alsactl_elem_value_set_iec60958_user_data(ALSACtlElemValue *self, const guint8 *data, gsize length); void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, - guint8 *const *data, gsize *length); + const guint8 **data, gsize *length); void alsactl_elem_value_set_int64(ALSACtlElemValue *self, const gint64 *values, gsize value_count); From b20de41f78ab4e1d4c6f15dae66f13a4004b321e Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 09/11] ctl: elem-value: rewrite getter for 64 bit signed integer values This commit rewrites the getter method so that it returns a pointer to internal storage for 64 bit signed integer values. Signed-off-by: Takashi Sakamoto --- samples/ctl | 3 +-- src/ctl/alsactl.map | 2 +- src/ctl/elem-value.c | 13 ++++++------- src/ctl/elem-value.h | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/samples/ctl b/samples/ctl index dadffb10..cc4609a1 100755 --- a/samples/ctl +++ b/samples/ctl @@ -40,7 +40,6 @@ def handle_elem_event(card, elem_id, events): _, elem_value = card.read_elem_value(elem_id, elem_value) if isinstance(info, ALSACtl.ElemInfoSingleArray): 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_count] elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER: @@ -50,7 +49,7 @@ def handle_elem_event(card, elem_id, events): elif info.get_property('elem-type') == ALSACtl.ElemType.BYTES: value = elem_value.get_bytes()[:value_count] elif info.get_property('elem-type') == ALSACtl.ElemType.INTEGER64: - value = elem_value.get_int64(value) + value = elem_value.get_int64()[:value_count] print(value) elif info.get_property('elem-type') == ALSACtl.ElemType.IEC60958: channel_status = elem_value.get_channel_status() diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 385d1979..f4507862 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -31,7 +31,6 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_set_iec60958_user_data"; "alsactl_elem_value_set_iec60958_channel_status"; "alsactl_elem_value_set_int64"; - "alsactl_elem_value_get_int64"; "alsactl_elem_value_equal"; local: *; @@ -94,4 +93,5 @@ ALSA_GOBJECT_0_3_0 { "alsactl_elem_value_get_bytes"; "alsactl_elem_value_get_iec60958_user_data"; "alsactl_elem_value_get_iec60958_channel_status"; + "alsactl_elem_value_get_int64"; } ALSA_GOBJECT_0_2_0; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 44f92683..02d60079 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -437,16 +437,16 @@ void alsactl_elem_value_set_int64(ALSACtlElemValue *self, const gint64 *values, /** * alsactl_elem_value_get_int64: * @self: A [class@ElemValue]. - * @values: (array length=value_count)(inout): The array for values of integer64 type. + * @values: (array length=value_count) (out) (transfer none): The array for 64 bit signed integer + * values. * @value_count: The number of values up to 64. * - * Copy the array for values of integer64 type from internal storage. + * Refer to the array for [enum@ElemType].INTEGER64 element in internal storage. */ -void alsactl_elem_value_get_int64(ALSACtlElemValue *self, gint64 *const *values, gsize *value_count) +void alsactl_elem_value_get_int64(ALSACtlElemValue *self, const gint64 **values, gsize *value_count) { ALSACtlElemValuePrivate *priv; struct snd_ctl_elem_value *value; - int i; g_return_if_fail(ALSACTL_IS_ELEM_VALUE(self)); priv = alsactl_elem_value_get_instance_private(self); @@ -455,9 +455,8 @@ void alsactl_elem_value_get_int64(ALSACtlElemValue *self, gint64 *const *values, g_return_if_fail(value_count != NULL); value = &priv->value; - *value_count = MIN(*value_count, G_N_ELEMENTS(value->value.integer64.value)); - for (i = 0; i < *value_count; ++i) - (*values)[i] = (gint64)value->value.integer64.value[i]; + *values = (const gint64 *)value->value.integer64.value; + *value_count = G_N_ELEMENTS(value->value.integer64.value); } /** diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index 17d08b09..8d9f8986 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -49,7 +49,7 @@ void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, void alsactl_elem_value_set_int64(ALSACtlElemValue *self, const gint64 *values, gsize value_count); void alsactl_elem_value_get_int64(ALSACtlElemValue *self, - gint64 *const *values, gsize *value_count); + const gint64 **values, gsize *value_count); gboolean alsactl_elem_value_equal(const ALSACtlElemValue *self, const ALSACtlElemValue *target); From 840d198c4f09358bfbeb8e378a28d0f4fd4c2046 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 10/11] ctl: elem-value: update class description Signed-off-by: Takashi Sakamoto --- src/ctl/elem-value.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 02d60079..fae9d8b6 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -3,13 +3,12 @@ /** * ALSACtlElemValue: - * A boxed object to represent the container of array of values for any type of element. + * A GObject-derived object to express the container of array for values specific to element type. * - * A [class@ElemValue] is boxed object to represent the container of values for any type of - * element. The arrays of values for each type of element shares the same storage, thus it's - * important for applications to distinguish the type of element in advance of accessing the - * array. The object is used for the call of [method@Card.write_elem_value] and - * [method@Card.read_elem_value]. + * A [class@ElemValue] includes several types of array for values specific to element type. The + * arrays shares the same internal storage, thus the user application should decide the type of + * array according to the type of element when accessing to the array. The object is used for the + * call of [method@Card.write_elem_value] and [method@Card.read_elem_value]. * * The object wraps `struct snd_ctl_elem_value` in UAPI of Linux sound subsystem. */ @@ -93,10 +92,10 @@ void ctl_elem_value_refer_private(ALSACtlElemValue *self, struct snd_ctl_elem_va /** * alsactl_elem_value_set_bool: * @self: A [class@ElemValue]. - * @values: (array length=value_count): The array for values of boolean type. + * @values: (array length=value_count): The array for boolean values. * @value_count: The number of values up to 128. * - * Copy the array for values of boolean type into internal data. + * Copy the array into internal data for [enum@ElemType].BOOLEAN element. */ void alsactl_elem_value_set_bool(ALSACtlElemValue *self, const gboolean *values, gsize value_count) { @@ -148,10 +147,10 @@ void alsactl_elem_value_get_bool(ALSACtlElemValue *self, const gboolean **values /** * alsactl_elem_value_set_int: * @self: A [class@ElemValue]. - * @values: (array length=value_count): The array for values of integer type. + * @values: (array length=value_count): The array for 32 bit signed integer values. * @value_count: The number of values up to 128. * - * Copy the array for values of integer type into internal storage. + * Copy the array into internal storage for [enum@ElemType].INTEGER element. */ void alsactl_elem_value_set_int(ALSACtlElemValue *self, const gint32 *values, gsize value_count) { @@ -203,10 +202,10 @@ void alsactl_elem_value_get_int(ALSACtlElemValue *self, const gint32 **values, g /** * alsactl_elem_value_set_enum: * @self: A [class@ElemValue]. - * @values: (array length=value_count): The array for values of enumeration index. + * @values: (array length=value_count): The array for enumeration index values. * @value_count: The number of values up to 128. * - * Copy the array for values of enumeration index into internal storage. + * Copy the array into internal storage for [enum@ElemType].ENUMERATED element. */ void alsactl_elem_value_set_enum(ALSACtlElemValue *self, const guint32 *values, gsize value_count) { @@ -254,10 +253,10 @@ void alsactl_elem_value_get_enum(ALSACtlElemValue *self, const guint32 **values, /** * alsactl_elem_value_set_bytes: * @self: A [class@ElemValue]. - * @values: (array length=value_count): The array for values of bytes type. + * @values: (array length=value_count): The array for 8 bit unsigned integer values. * @value_count: The number of values up to 512. * - * Copy the array for values of bytes type into internal storage. + * Copy the array into internal storage for [enum@ElemType].BYTES element. */ void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, const guint8 *values, gsize value_count) { @@ -305,10 +304,10 @@ void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, const guint8 **values, /** * alsactl_elem_value_set_iec60958_channel_status: * @self: A [class@ElemValue]. - * @status: (array length=length): The array of byte data for channel status bits in IEC 60958. + * @status: (array length=length): The array of byte data for channel status bits of IEC 60958. * @length: The number of bytes in channel_status argument, up to 24. * - * Copy the given channel status of IEC 60958 into internal storage. + * Copy the channel status bits into internal storage for [enum@ElemType].IEC60958 element. */ void alsactl_elem_value_set_iec60958_channel_status(ALSACtlElemValue *self, const guint8 *status, gsize length) @@ -358,10 +357,10 @@ void alsactl_elem_value_get_iec60958_channel_status(ALSACtlElemValue *self, cons /** * alsactl_elem_value_set_iec60958_user_data: * @self: A [class@ElemValue]. - * @data: (array length=length): The array of byte data for user data bits in IEC 60958. + * @data: (array length=length): The array of byte data for user data bits of IEC 60958. * @length: The number of bytes in data argument, up to 147. * - * Copy the given user data of IEC 60958 into internal storage. + * Copy the user data bits into internal storage for [enum@ElemType].IEC60958 element. */ void alsactl_elem_value_set_iec60958_user_data(ALSACtlElemValue *self, const guint8 *data, gsize length) @@ -411,10 +410,10 @@ void alsactl_elem_value_get_iec60958_user_data(ALSACtlElemValue *self, const gui /** * alsactl_elem_value_set_int64: * @self: A [class@ElemValue]. - * @values: (array length=value_count): The array for values of integer64 type. + * @values: (array length=value_count): The array for 64 bit signed integer values. * @value_count: The number of values up to 64. * - * Copy the array for values of integer64 type into internal storage. + * Copy the array into internal storage for [enum@ElemType].INTEGER64 element. */ void alsactl_elem_value_set_int64(ALSACtlElemValue *self, const gint64 *values, gsize value_count) { From 3d334399bdcfce45e20594cd621f0786f2e79ed4 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sat, 25 Jun 2022 11:00:43 +0900 Subject: [PATCH 11/11] update README with compatibility note Signed-off-by: Takashi Sakamoto --- README.rst | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index bd8db7de..5a3a6e79 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ The alsa-gobject project ======================== -2022/06/06 +2022/06/25 Takashi Sakamoto Introduction @@ -30,15 +30,15 @@ Namespaces of g-i produced by the project ========================================= ALSACtl-0.0 - For bindings to use libalsactl0 + For bindings to use the ``libalsactl0`` ALSATimer-0.0 - For bindings to use libalsatimer0 + For bindings to use the ``libalsatimer0`` ALSASeq-0.0 - For bindings to use libalsaseq0 + For bindings to use the ``libalsaseq0`` ALSAHwdep-0.0 - For bindings to use libalsahwdep0 + For bindings to use the ``libalsahwdep0`` ALSARawmidi-0.0 - For bindings to use libalsarawmidi0 + For bindings to use the ``libalsarawmidi0`` Documentation ============= @@ -111,7 +111,7 @@ Design note kernel land directly by system calls without alsa-lib's configuration space and plugin framework. * The way to enumerate any device is based on sysfs, programmed with libudev1. -* GObject object is used for structures in UAPI of Linux sound subsystem with +* GObject-drived object is used for structures in UAPI of Linux sound subsystem with reserved space. * Boxed object is used for structures in UAPI of Linux sound subsystem without reserved space. @@ -137,3 +137,113 @@ included in this repository and available to suppress the report. For example :: $ valgrind --suppressions=valgrind-glib.suppressions --leak-check=full your-executable + +Loss of backward compatibility between v0.2/0.3 releases +======================================================== + +Following to GNOME convention for throw function +------------------------------------------------ + +In GNOME convention, the throw function to report error at GError argument should return gboolean +value to report the overall operation finished successfully or not. At v0.3 release, the most of +public API are rewritten according to it. + +All of constructor in ``ALSASeq.RemoveFilter`` become non-throw function since they bring no +failure. + +Using GObject Interface +----------------------- + +GObject Interface is utilized for some cases to express structure with union. + +- ``ALSACtl.ElemInfoCommon`` and ``ALSACtl.ElemInfoSingleArray`` for ``struct snd_ctl_elem_info`` +- ``ALSASeq.QueueTimerCommon`` for ``struct snd_seq_queue_timer`` + +Therefore some GObject-derived objects implements the interfaces. + +- ``ALSACtl.ElemInfoIec60958`` +- ``ALSACtl.ElemInfoBoolean`` +- ``ALSACtl.ElemInfoBytes`` +- ``ALSACtl.ElemInfoInteger`` +- ``ALSACtl.ElemInfoInteger64`` +- ``ALSACtl.ElemInfoEnumerated`` +- ``ALSASeq.QueueTimerAlsa`` + +Some boxed structures are obsoleted and removed. + +- ``ALSACtl.ElemInfo`` +- ``ALSACtl.QueueTimer`` +- ``ALSACtl.QueueTimerDataAlsa`` + +GObject Interface is utlized to define common feature of hwdep device as well. +``ALSAHwdep.DeviceCommon`` interface is added for the purpose. + +Event expression for ALSA Sequencer +----------------------------------- + +``ALSASeq.Event`` boxed structure is newly added to each event, and ``ALSASeq.EventCntr`` is +simplified to include deserializer only. ``ALSASeq.EventError`` domain is newly added to express +event handling problem. + +Name consistency in time stamp expression +----------------------------------------- + +The word ``tstamp`` is renamed to ``real time`` in the most of functions, enumerations, object +names, and methods for name consistency. + +- ``ALSATimer.TstampEvent`` boxed structure is renamed to ``ALSATimer.RealTimeEvent`` +- ``ALSATimer.EventType`` enumeration is renamed to ``ALSATimer.RealTimeEventType`` +- ``ALSATimer.EventDataType`` enumeration is renamed to ``ALSATimer.EventType`` +- ``ALSATimer.InstanceStatus.get_tstamp()`` method is renamed to ``ALSATimer.InstanceStatus.get_time()`` +- ``ALSATimer.get_tstamp_source()`` function is renamed to ``ALSATimer.get_real_time_clock_id()`` + +In time stamp, the counterpart of ``real time`` is ``tick``. ``ALSATimer.TickEvent`` boxed structure +is renamed to ``ALSATimer.TickTimeEvent``. ``ALSATimer.Event``, ``ALSATimer.EventDataTick`` and +``ALSATimer.EventDataTstamp`` are obsoleted and removed. ``ALSATimer.UserInstance::handle-event`` +is obsoleted as well. The alternatives are available to retrieve corresponding event. + +- ``ALSATimer.UserInstance::handle-tick-time-event`` +- ``ALSATimer.UserInstance::handle-real-time-event`` + +``ALSASeq.Tstamp`` is obsoleted and removed as well. The accessor methods to it are rewritten +to retrieve either tick time or real time. + +- ``ALSASeq.Event.get_tick_time()`` +- ``ALSASeq.Event.get_real_time()`` +- ``ALSASeq.Event.get_tick_time_data()`` +- ``ALSASeq.Event.get_real_time_data()`` +- ``ALSASeq.EventDataQueue.get_tick_time_param()`` +- ``ALSASeq.EventDataQueue.get_real_time_param()`` +- ``ALSASeq.RemoveFilter.new_with_tick_time()`` +- ``ALSASeq.RemoveFilter.new_with_real_time()`` + +The word ``tstamp`` still remains in the enumerations and properties to affects both ``tick`` +and ``real time``. + +- ``ALSASeq.EventTstampMode`` +- ``ALSASeq.Event.get_tstamp_mode()`` +- ``ALSASeq.PortInfo:tstamp-mode`` +- ``ALSASeq.PortInfo:tstamp-overwrite`` +- ``ALSASeq.SusbscribeData:has-tstamp`` +- ``ALSASeq.SusbscribeData:tstamp-mode`` + +Some properties are added to ``ALSASeq.SubscribeData`` to obsolete ``ALSASeq.PortSubscribeFlag``. + +- ``ALSASeq.SubscribeData:is-exclusive`` +- ``ALSASeq.SubscribeData:has-tstamp`` +- ``ALSASeq.SubscribeData:tstamp-mode`` +- ``ALSASeq.SubscribeData:queue-id`` + +Rewrite setter method in ALSACtl.ElemValue +------------------------------------------ + +Below methods are rewritten to retrieve the pointer in internal storage instead of copying to given +buffer: + +- ``ALSACtl.ElemValue.get_bool`` +- ``ALSACtl.ElemValue.get_int`` +- ``ALSACtl.ElemValue.get_enum`` +- ``ALSACtl.ElemValue.get_bytes`` +- ``ALSACtl.ElemValue.get_iec60958_user_data`` +- ``ALSACtl.ElemValue.get_iec60958_channel_status`` +- ``ALSACtl.ElemValue.get_int64``