]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem-value: rewrite getter for boolean values
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 25 Jun 2022 02:00:43 +0000 (11:00 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 25 Jun 2022 02:00:43 +0000 (11:00 +0900)
This commit rewrites the getter method so that it returns a pointer to
internal storage for boolean values.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
samples/ctl
src/ctl/alsactl.map
src/ctl/elem-value.c
src/ctl/elem-value.h

index 813b5f24a19a2c809e8fa0599443f7a6fd8134fb..57742c0be34b45cc6f81fe57187d1f33e2a8d7c4 100755 (executable)
@@ -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:
index 70c69a4fb32717142014870a153745bbb91df010..398af1bedefe320e32b9602573248ec07216fa00 100644 (file)
@@ -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;
index 06d7e04034b6f84b36e885530e74d0f13f5e01c1..db22b72b896d85e68969523da6509fb9e6a54b56 100644 (file)
@@ -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);
 }
 
 /**
index b87107b328ee433bd8c310d261a50fd5ffe833d0..35e0e428131e2a9cb02ed32f832c40c873a0e870 100644 (file)
@@ -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);