]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
timer: add global method to retrieve current source of timestamp
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 9 Jun 2020 02:20:50 +0000 (11:20 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Tue, 9 Jun 2020 09:12:30 +0000 (18:12 +0900)
src/timer/alsatimer.map
src/timer/query.c
src/timer/query.h

index 04a9832c7f39feeb1a4dc318e8547a1796beed19..661b75e05cdc2f48e35175fd040113f02ed4a67e 100644 (file)
@@ -13,6 +13,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsatimer_get_device_id_list";
     "alsatimer_get_device_info";
     "alsatimer_get_device_status";
+    "alsatimer_get_tstamp_source";
 
     "alsatimer_device_id_get_type";
     "alsatimer_device_id_new";
index baa6becedba9243c5e23f8a2a151702c30405ef2..4a64187089f002eb651562b4f9cd544e50bba376 100644 (file)
@@ -2,6 +2,7 @@
 #include "query.h"
 #include "privates.h"
 
+#include <stdio.h>
 #include <stdbool.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <stdbool.h>
 
 #include <sound/asound.h>
+#include <time.h>
 
 #include <libudev.h>
 
 #define TIMER_SYSNAME_TEMPLATE  "timer"
+#define SYSFS_SND_TIMER_NODE    "/sys/module/snd_timer/"
 
 /**
  * SECTION: query
@@ -278,3 +281,94 @@ void alsatimer_set_device_params(ALSATimerDeviceId *device_id,
 
     close(fd);
 }
+
+static void timer_get_node_param_value(const char *param_name, char *buf,
+                                       gsize size, int *val, GError **error)
+{
+    char literal[64];
+    int fd;
+    ssize_t len;
+    long v;
+    char *term;
+
+    snprintf(literal, sizeof(literal), SYSFS_SND_TIMER_NODE "parameters/%s",
+             param_name);
+
+    fd = open(literal, O_RDONLY);
+    if (fd < 0) {
+        generate_error(error, errno);
+        return;
+    }
+
+    len = read(fd, buf, size);
+    if (len < 0) {
+        generate_error(error, errno);
+        goto end;
+    }
+
+    v = strtol(buf, &term, 10);
+    if (errno > 0)
+        generate_error(error, errno);
+    else if (*term != '\n')
+        generate_error(error, EIO);
+    else
+        *val = (int)v;
+end:
+    close(fd);
+}
+
+/**
+ * alsatimer_get_tstamp_source:
+ * @clock_id: (out): The clock source for timestamp. The value of CLOCK_XXX in
+ *                   UAPI of Linux kernel.
+ * @error: A #GError.
+ *
+ * Get the clock source for timestamp when #ALSATimerUserInstance is configured
+ * to receive event with timestamp. The source is selected according to
+ * parameter of 'snd-timer' kernel module, and the call of function is just to
+ * refer to it.
+ *
+ * 0 means CLOCK_REALTIME is used. 1 means CLOCK_MONOTONIC is used.
+ */
+void alsatimer_get_tstamp_source(int *clock_id, GError **error)
+{
+    int val;
+    gsize size;
+    char *buf;
+
+    // Count required digits.
+    val = INT_MAX;
+    size = 0;
+    while (val > 0) {
+        val /= 10;
+        ++size;
+    }
+
+    // For codes of sign and new line.
+    size += 2;
+
+    buf = g_try_malloc0(size);
+    if (buf == NULL) {
+        generate_error(error, ENOMEM);
+        return;
+    }
+
+    timer_get_node_param_value("timer_tstamp_monotonic", buf, size, &val,
+                               error);
+    if (*error != NULL)
+        goto end;
+
+    switch (val) {
+    case 0:
+        *clock_id = CLOCK_REALTIME;
+        break;
+    case 1:
+        *clock_id = CLOCK_MONOTONIC;
+        break;
+    default:
+        generate_error(error, EPROTO);
+        break;
+    }
+end:
+    g_free(buf);
+}
index 4707be6f025816582f17d14f12d469abd9c024bf..6c3364527b64d880e7c7b240f1d44d709dea0a83 100644 (file)
@@ -32,6 +32,8 @@ void alsatimer_set_device_params(ALSATimerDeviceId *device_id,
                                  const ALSATimerDeviceParams *device_params,
                                  GError **error);
 
+void alsatimer_get_tstamp_source(int *clock_id, GError **error);
+
 G_END_DECLS
 
 #endif