]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: card: add APIs to read/write value for element
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 18 Nov 2019 04:22:44 +0000 (13:22 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 12 Dec 2019 05:29:12 +0000 (14:29 +0900)
src/ctl/alsactl.map
src/ctl/card.c
src/ctl/card.h
src/ctl/elem-value.c
src/ctl/privates.h
tests/alsactl-card

index e743427e38f20ecd4f3498115a0cf20c25c5f5d7..2d06a24ff1a86ff15f5fb7674f6df1f71c0e4607 100644 (file)
@@ -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";
 
index e313c77c1f4d61fb1a9fcf382cdf2c0dfff00dd8..74fdd41ddbe0bccbc6b6e45a8efa9311f9f66526 100644 (file)
@@ -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;
index 72446de38c1f09baeb0b23d9fc49b11b363765a2..25fd3e160a14f226475942f0101483ff6b19a391 100644 (file)
@@ -8,6 +8,7 @@
 #include <ctl/card-info.h>
 #include <ctl/elem-id.h>
 #include <ctl/elem-info.h>
+#include <ctl/elem-value.h>
 
 #include <ctl/alsactl-sigs-marshal.h>
 
@@ -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);
 
index dcd5455661d6b5cc12c6fb099767a4b0762d02ca..2e88691a2d6dce4d17deab6fcbb13ace0dcadd3c 100644 (file)
@@ -1,7 +1,5 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
-#include "elem-value.h"
-
-#include <sound/asound.h>
+#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;
+}
index 48683869d9e1276e7989c0a025a2969fdd01835a..6f9c304e430a873ab60d34df7b4105223ce7e8ec 100644 (file)
@@ -10,6 +10,7 @@
 #include "card-info.h"
 #include "elem-id.h"
 #include "elem-info.h"
+#include "elem-value.h"
 
 #include <sound/asound.h>
 
@@ -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
index b9491086906e446a7a309de796112e3391c003a4..e1e089c25fbdb93c74cd54887fac58998204b307 100644 (file)
@@ -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',