From d88eeb2befcb9707cedbf175547b8937feb86907 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: elem_value: add APIs to set/get value of IEC 60958 type --- src/ctl/alsactl.map | 2 + src/ctl/elem-value.c | 82 ++++++++++++++++++++++++++++++++++++++++ src/ctl/elem-value.h | 7 ++++ tests/alsactl-elem-value | 2 + 4 files changed, 93 insertions(+) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 6b367a9..366288f 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -71,6 +71,8 @@ ALSA_GOBJECT_0_0_0 { "alsactl_elem_value_get_enum"; "alsactl_elem_value_set_bytes"; "alsactl_elem_value_get_bytes"; + "alsactl_elem_value_set_iec60958"; + "alsactl_elem_value_get_iec60958"; local: *; }; diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index 5bd458b..ae106d9 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -267,3 +267,85 @@ void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, for (i = 0; i < *value_count; ++i) (*values)[i] = (guint8)value->value.bytes.data[i]; } + +/** + * alsactl_elem_value_set_iec60958: + * @self: A #ALSACtlElemValue. + * @channel_status: (array length=channel_status_length)(nullable): The array of + * byte data for channel status bits in IEC 60958. + * @channel_status_length: The number of bytes in channel_status argument, up + * to 24. + * @user_data: (array length=user_data_length)(nullable): The array of byte data + * for user data bits in IEC 60958. + * @user_data_length: The number of bytes in user_data argument, up to 147. + * + * Copy a pair of array for channel status and user data of IEC 60958 into + * internal storage. + */ +void alsactl_elem_value_set_iec60958(ALSACtlElemValue *self, + const guint8 *channel_status, gsize channel_status_length, + const guint8 *user_data, gsize user_data_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); + value = &priv->value; + + if (channel_status != NULL) { + channel_status_length = MIN(channel_status_length, + G_N_ELEMENTS(value->value.iec958.status)); + for (i = 0; i < channel_status_length; ++i) + value->value.iec958.status[i] = channel_status[i]; + } + + if (user_data != NULL) { + user_data_length = MIN(user_data_length, + G_N_ELEMENTS(value->value.iec958.subcode)); + for (i = 0; i < user_data_length; ++i) + value->value.iec958.subcode[i] = user_data[i]; + } +} + +/** + * alsactl_elem_value_get_iec60958: + * @self: A #ALSACtlElemValue. + * @channel_status: (array length=channel_status_length)(inout)(nullable): The + * array of byte data for channel status bits in IEC 60958. + * @channel_status_length: The number of bytes in channel_status argument, up + * to 24. + * @user_data: (array length=user_data_length)(inout)(nullable): The array of + * byte data for user data bits in IEC 60958. + * @user_data_length: The number of bytes in user_data argument, up to 147. + * + * Copy a pair of array for channel status and user data of IEC 60958 from + * internal storage. + */ +void alsactl_elem_value_get_iec60958(ALSACtlElemValue *self, + guint8 *const *channel_status, gsize *channel_status_length, + guint8 *const *user_data, gsize *user_data_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); + value = &priv->value; + + if (channel_status != NULL) { + *channel_status_length = MIN(*channel_status_length, + G_N_ELEMENTS(value->value.iec958.status)); + for (i = 0; i < *channel_status_length; ++i) + (*channel_status)[i] = value->value.iec958.status[i]; + } + + if (user_data != NULL) { + *user_data_length = MIN(*user_data_length, + G_N_ELEMENTS(value->value.iec958.subcode)); + for (i = 0; i < *user_data_length; ++i) + (*user_data)[i] = value->value.iec958.subcode[i]; + } +} diff --git a/src/ctl/elem-value.h b/src/ctl/elem-value.h index ddf91b2..bbccb2c 100644 --- a/src/ctl/elem-value.h +++ b/src/ctl/elem-value.h @@ -69,6 +69,13 @@ void alsactl_elem_value_set_bytes(ALSACtlElemValue *self, void alsactl_elem_value_get_bytes(ALSACtlElemValue *self, guint8 *const *values, gsize *value_count); +void alsactl_elem_value_set_iec60958(ALSACtlElemValue *self, + const guint8 *channel_status, gsize channel_status_length, + const guint8 *user_data, gsize user_data_length); +void alsactl_elem_value_get_iec60958(ALSACtlElemValue *self, + guint8 *const *channel_status, gsize *channel_status_length, + guint8 *const *user_data, gsize *user_data_length); + G_END_DECLS #endif diff --git a/tests/alsactl-elem-value b/tests/alsactl-elem-value index c6be061..9a59990 100644 --- a/tests/alsactl-elem-value +++ b/tests/alsactl-elem-value @@ -23,6 +23,8 @@ methods = ( 'get_enum', 'set_bytes', 'get_bytes', + 'set_iec60958', + 'get_iec60958', ) signals = () -- 2.47.3