]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
timer: add an API to retrieve current version of protocol in timer interface
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 21 Jun 2020 12:27:25 +0000 (21:27 +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/timer/alsatimer.map
src/timer/user-instance.c
src/timer/user-instance.h
tests/alsatimer-user-instance

index 5e42ba7960e41c54e8bd4d0d43afeaea8f512beb..7cd05746c024897265c982489c482049a67903db 100644 (file)
@@ -33,6 +33,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsatimer_user_instance_get_type";
     "alsatimer_user_instance_new";
     "alsatimer_user_instance_open";
+    "alsatimer_user_instance_get_protocol_version";
     "alsatimer_user_instance_choose_event_data_type";
     "alsatimer_user_instance_attach";
     "alsatimer_user_instance_attach_as_slave";
index 9c92ebc2a546dad2295490d86e39dbac6c39833f..b7e49dcf48e0211c2dc178afcd04af174a943663 100644 (file)
@@ -26,6 +26,7 @@
 struct _ALSATimerUserInstancePrivate {
     int fd;
     ALSATimerEventDataType event_data_type;
+    guint16 proto_ver_triplet[3];
 };
 G_DEFINE_TYPE_WITH_PRIVATE(ALSATimerUserInstance, alsatimer_user_instance, G_TYPE_OBJECT)
 
@@ -121,6 +122,7 @@ void alsatimer_user_instance_open(ALSATimerUserInstance *self, gint open_flag,
 {
     ALSATimerUserInstancePrivate *priv;
     char *devnode;
+    int proto_ver;
 
     g_return_if_fail(ALSATIMER_IS_USER_INSTANCE(self));
     priv = alsatimer_user_instance_get_instance_private(self);
@@ -134,7 +136,20 @@ void alsatimer_user_instance_open(ALSATimerUserInstance *self, gint open_flag,
     g_free(devnode);
     if (priv->fd < 0) {
         generate_error(error, errno);
+        return;
     }
+
+    // Remember the version of protocol currently used.
+    if (ioctl(priv->fd, SNDRV_TIMER_IOCTL_PVERSION, &proto_ver) < 0) {
+        generate_error(error, errno);
+        close(priv->fd);
+        priv->fd = -1;
+        return;
+    }
+
+    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);
 }
 
 ALSATimerUserInstance *alsatimer_user_instance_new()
@@ -142,6 +157,35 @@ ALSATimerUserInstance *alsatimer_user_instance_new()
     return g_object_new(ALSATIMER_TYPE_USER_INSTANCE, NULL);
 }
 
+/**
+ * alsatimer_user_instance_get_protocol_version:
+ * @self: A #ALSATimerUserInstance.
+ * @proto_ver_triplet: (array fixed-size=3)(out)(transfer none): The version of
+ *                     protocol currently used.
+ * @error: A #GError.
+ *
+ * Get the version of timer 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 alsatimer_user_instance_get_protocol_version(ALSATimerUserInstance *self,
+                                        const guint16 *proto_ver_triplet[3],
+                                        GError **error)
+{
+    ALSATimerUserInstancePrivate *priv;
+
+    g_return_if_fail(ALSATIMER_IS_USER_INSTANCE(self));
+    priv = alsatimer_user_instance_get_instance_private(self);
+
+    if (priv->fd < 0) {
+        generate_error(error, ENXIO);
+        return;
+    }
+
+    *proto_ver_triplet = (const guint16 *)priv->proto_ver_triplet;
+}
+
 /**
  * alsatimer_user_instance_choose_event_data_type:
  * @self: A #ALSATimerUserInstance.
index 1ea4478f5593527601713162d06d2114e652dc96..f6d8786f5696fee42576259f4987c1e0b19f6786 100644 (file)
@@ -77,6 +77,10 @@ ALSATimerUserInstance *alsatimer_user_instance_new();
 void alsatimer_user_instance_open(ALSATimerUserInstance *self, gint open_flag,
                                   GError **error);
 
+void alsatimer_user_instance_get_protocol_version(ALSATimerUserInstance *self,
+                                        const guint16 *proto_ver_triplet[3],
+                                        GError **error);
+
 void alsatimer_user_instance_choose_event_data_type(ALSATimerUserInstance *self,
                                         ALSATimerEventDataType event_data_type,
                                         GError **error);
index 49e925ac77040187e3154f5524105c05caf118e5..fb34eedeec624b4a0692b41e3c5214a18c98024a 100644 (file)
@@ -14,6 +14,7 @@ props = ()
 methods = (
     'new',
     'open',
+    'get_protocol_version',
     'choose_event_data_type',
     'attach',
     'attach_as_slave',