]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem_value: add APIs to set/get value of IEC 60958 type
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/elem-value.c
src/ctl/elem-value.h
tests/alsactl-elem-value

index 6b367a99b87841bb3e4a3c947aab7eec4fab1edd..366288f47a3eacc9614f02e69790bca7ca511fbf 100644 (file)
@@ -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:
     *;
 };
index 5bd458b9e2b261b6f36fa0634bd0703760071ec3..ae106d93fc1f89a6b82bec6feb116d852fbc8568 100644 (file)
@@ -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];
+    }
+}
index ddf91b2d8ed45603a5ca6491e8c75635c413aada..bbccb2c2c465279d57b7aefa9b37ae14a9a06ecf 100644 (file)
@@ -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
index c6be06177892658d305a6d15f5f6200e3638768c..9a59990264586f4b46d62211ebe790b19e1d3f75 100644 (file)
@@ -23,6 +23,8 @@ methods = (
     'get_enum',
     'set_bytes',
     'get_bytes',
+    'set_iec60958',
+    'get_iec60958',
 )
 signals = ()