]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: add an API to retrieve current version of protocol in control interface
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 21 Jun 2020 12:19:36 +0000 (21:19 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Sun, 21 Jun 2020 15:12:30 +0000 (00:12 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/ctl/alsactl.map
src/ctl/card.c
src/ctl/card.h
tests/alsactl-card

index 396eafd9dcdbf6eb33e2258b22ab0c76d25038f5..e5989f57dc4c94a810854c304d1f16efdcc2225d 100644 (file)
@@ -14,6 +14,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsactl_card_get_type";
     "alsactl_card_new";
     "alsactl_card_open";
+    "alsactl_card_get_protocol_version";
     "alsactl_card_get_info";
     "alsactl_card_get_elem_id_list";
     "alsactl_card_lock_elem";
index 5324da1467880a84f9604b18d67872d0ed6397f8..0a49fbbd0e00c40202199f36a8de253d97ce9ab9 100644 (file)
@@ -26,6 +26,7 @@ struct _ALSACtlCardPrivate {
     int fd;
     char *devnode;
     gint subscribers;
+    guint16 proto_ver_triplet[3];
 };
 G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT)
 
@@ -179,6 +180,7 @@ void alsactl_card_open(ALSACtlCard *self, guint card_id, gint open_flag,
 {
     ALSACtlCardPrivate *priv;
     char *devnode;
+    int proto_ver;
 
     g_return_if_fail(ALSACTL_IS_CARD(self));
     priv = alsactl_card_get_instance_private(self);
@@ -195,7 +197,48 @@ void alsactl_card_open(ALSACtlCard *self, guint card_id, gint open_flag,
         return;
     }
 
+    // Remember the version of protocol currently used.
+    if (ioctl(priv->fd, SNDRV_CTL_IOCTL_PVERSION, &proto_ver) < 0) {
+        generate_error(error, errno);
+        close(priv->fd);
+        priv->fd = -1;
+        g_free(devnode);
+        return;
+    }
+
     priv->devnode = devnode;
+    priv->proto_ver_triplet[0] = SNDRV_PROTOCOL_MAJOR(proto_ver);
+    priv->proto_ver_triplet[1] = SNDRV_PROTOCOL_MINOR(proto_ver);
+    priv->proto_ver_triplet[2] = SNDRV_PROTOCOL_MICRO(proto_ver);
+}
+
+/**
+ * alsactl_card_get_protocol_version:
+ * @self: A #ALSACtlCard.
+ * @proto_ver_triplet: (array fixed-size=3)(out)(transfer none): The version of
+ *                     protocol currently used.
+ * @error: A #GError.
+ *
+ * Get the version of control protocol currently used. The version is
+ * represented as the array with three elements; major, minor, and micro version
+ * in the order. The length of major version is 16 bit, the length of minor
+ * and micro version is 8 bit each.
+ */
+void alsactl_card_get_protocol_version(ALSACtlCard *self,
+                                       const guint16 *proto_ver_triplet[3],
+                                       GError **error)
+{
+    ALSACtlCardPrivate *priv;
+
+    g_return_if_fail(ALSACTL_IS_CARD(self));
+    priv = alsactl_card_get_instance_private(self);
+
+    if (priv->fd < 0) {
+        generate_error(error, ENXIO);
+        return;
+    }
+
+    *proto_ver_triplet = (const guint16 *)priv->proto_ver_triplet;
 }
 
 /**
index 08694d303fc15515deb0347412e46663d93c0067..d26b4645f8410d52487f2ea90d8a80fed0c53d64 100644 (file)
@@ -79,6 +79,10 @@ ALSACtlCard *alsactl_card_new();
 void alsactl_card_open(ALSACtlCard *self, guint card_id, gint open_flag,
                        GError **error);
 
+void alsactl_card_get_protocol_version(ALSACtlCard *self,
+                                       const guint16 *proto_ver_triplet[3],
+                                       GError **error);
+
 void alsactl_card_get_info(ALSACtlCard *self, ALSACtlCardInfo **card_info,
                            GError **error);
 
index e1e089c25fbdb93c74cd54887fac58998204b307..e9d7702a008aebcf50b529335a5eaaec3da15c97 100644 (file)
@@ -17,6 +17,7 @@ props = (
 methods = (
     'new',
     'open',
+    'get_protocol_version',
     'get_info',
     'get_elem_id_list',
     'lock_elem',