From: Takashi Sakamoto Date: Mon, 18 Nov 2019 04:22:44 +0000 (+0900) Subject: ctl: card: add APIs to read/write value for element X-Git-Tag: v0.1.0~386 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=5033eadb2ee2d36f425fc59495416a6dfb422bd7;p=alsa-gobject.git ctl: card: add APIs to read/write value for element --- diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index e743427..2d06a24 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -24,6 +24,8 @@ ALSA_GOBJECT_0_0_0 { "alsactl_card_add_elems"; "alsactl_card_replace_elems"; "alsactl_card_remove_elems"; + "alsactl_card_write_elem_value"; + "alsactl_card_read_elem_value"; "alsactl_card_create_source"; "alsactl_sigs_marshal_VOID__BOXED_FLAGS"; diff --git a/src/ctl/card.c b/src/ctl/card.c index e313c77..74fdd41 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -701,6 +701,64 @@ void alsactl_card_remove_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, generate_error(error, errno); } +/** + * alsactl_card_write_elem_value: + * @self: A #ALSACtlCard. + * @elem_id: A #ALSACtlElemId. + * @elem_value: A derivative of #ALSACtlElemValue. + * @error: A #GError. + * + * Write given value to element indicated by given ID. + */ +void alsactl_card_write_elem_value(ALSACtlCard *self, + const ALSACtlElemId *elem_id, + const ALSACtlElemValue *elem_value, + GError **error) +{ + ALSACtlCardPrivate *priv; + struct snd_ctl_elem_value *value; + + g_return_if_fail(ALSACTL_IS_CARD(self)); + g_return_if_fail(elem_id != NULL); + g_return_if_fail(ALSACTL_IS_ELEM_VALUE(elem_value)); + + ctl_elem_value_refer_private((ALSACtlElemValue *)elem_value, &value); + value->id = *elem_id; + + priv = alsactl_card_get_instance_private(self); + if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, value) < 0) + generate_error(error, errno); +} + +/** + * alsactl_card_read_elem_value: + * @self: A #ALSACtlCard. + * @elem_id: A #ALSACtlElemId. + * @elem_value: (inout): A derivative of #ALSACtlElemValue. + * @error: A #GError. + * + * Read given value from element indicated by given ID. + */ +void alsactl_card_read_elem_value(ALSACtlCard *self, + const ALSACtlElemId *elem_id, + ALSACtlElemValue *const *elem_value, + GError **error) +{ + ALSACtlCardPrivate *priv; + struct snd_ctl_elem_value *value; + + g_return_if_fail(ALSACTL_IS_CARD(self)); + g_return_if_fail(elem_id != NULL); + g_return_if_fail(ALSACTL_IS_ELEM_VALUE(*elem_value)); + + ctl_elem_value_refer_private(*elem_value, &value); + value->id = *elem_id; + + priv = alsactl_card_get_instance_private(self); + if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_READ, value) < 0) + generate_error(error, errno); +} + static void handle_elem_event(CtlCardSource *src, struct snd_ctl_event *ev) { ALSACtlCard *self = src->self; diff --git a/src/ctl/card.h b/src/ctl/card.h index 72446de..25fd3e1 100644 --- a/src/ctl/card.h +++ b/src/ctl/card.h @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -110,6 +111,15 @@ void alsactl_card_replace_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, void alsactl_card_remove_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, GError **error); +void alsactl_card_write_elem_value(ALSACtlCard *self, + const ALSACtlElemId *elem_id, + const ALSACtlElemValue *elem_value, + GError **error); +void alsactl_card_read_elem_value(ALSACtlCard *self, + const ALSACtlElemId *elem_id, + ALSACtlElemValue *const *elem_value, + GError **error); + void alsactl_card_create_source(ALSACtlCard *self, GSource **gsrc, GError **error); diff --git a/src/ctl/elem-value.c b/src/ctl/elem-value.c index dcd5455..2e88691 100644 --- a/src/ctl/elem-value.c +++ b/src/ctl/elem-value.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "elem-value.h" - -#include +#include "privates.h" struct _ALSACtlElemValuePrivate { struct snd_ctl_elem_value value; @@ -65,3 +63,11 @@ ALSACtlElemValue *alsactl_elem_value_new() { return g_object_new(ALSACTL_TYPE_ELEM_VALUE, NULL); } + +void ctl_elem_value_refer_private(ALSACtlElemValue *self, + struct snd_ctl_elem_value **value) +{ + ALSACtlElemValuePrivate *priv = + alsactl_elem_value_get_instance_private(self); + *value = &priv->value; +} diff --git a/src/ctl/privates.h b/src/ctl/privates.h index 4868386..6f9c304 100644 --- a/src/ctl/privates.h +++ b/src/ctl/privates.h @@ -10,6 +10,7 @@ #include "card-info.h" #include "elem-id.h" #include "elem-info.h" +#include "elem-value.h" #include @@ -27,6 +28,9 @@ void ctl_card_info_refer_private(ALSACtlCardInfo *self, void ctl_elem_info_refer_private(ALSACtlElemInfo *self, struct snd_ctl_elem_info **info); +void ctl_elem_value_refer_private(ALSACtlElemValue *self, + struct snd_ctl_elem_value **value); + G_END_DECLS #endif diff --git a/tests/alsactl-card b/tests/alsactl-card index b949108..e1e089c 100644 --- a/tests/alsactl-card +++ b/tests/alsactl-card @@ -27,6 +27,8 @@ methods = ( 'add_elems', 'replace_elems', 'remove_elems', + 'write_elem_value', + 'read_elem_value', 'create_source', 'do_handle_elem_event', 'do_handle_disconnection',