]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
timer: instance_status: add properies and access methods
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 9 Feb 2020 03:20:53 +0000 (12:20 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Tue, 11 Feb 2020 04:28:18 +0000 (13:28 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/timer/alsatimer.map
src/timer/instance-status.c
src/timer/instance-status.h
tests/alsatimer-instance-status

index 5e1a91c5076ad3593d1d446007f2b30140421b0b..c3939c1710fb0e1c8871d779351d0c915469874f 100644 (file)
@@ -43,6 +43,7 @@ ALSA_GOBJECT_0_0_0 {
     "alsatimer_instance_params_get_event_filter";
 
     "alsatimer_instance_status_get_type";
+    "alsatimer_instance_status_get_timestamp";
   local:
     *;
 };
index 04f58252a130aef14ce0d95e1d287fc8bc611959..85763cc2dbb50c3a58cab218d603adc67e435f46 100644 (file)
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "instance-status.h"
 
-G_DEFINE_TYPE(ALSATimerInstanceStatus, alsatimer_instance_status, G_TYPE_OBJECT)
+#include <sound/asound.h>
+
+struct _ALSATimerInstanceStatusPrivate {
+    struct snd_timer_status status;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSATimerInstanceStatus, alsatimer_instance_status, G_TYPE_OBJECT)
+
+enum timer_instance_status_props {
+    TIMER_INSTANCE_STATUS_PROP_INTERVAL = 1,
+    TIMER_INSTANCE_STATUS_PROP_LOST,
+    TIMER_INSTANCE_STATUS_PROP_OVERRUN,
+    TIMER_INSTANCE_STATUS_PROP_QUEUE_SIZE,
+    TIMER_INSTANCE_STATUS_PROP_COUNT,
+};
+static GParamSpec *timer_instance_status_props[TIMER_INSTANCE_STATUS_PROP_COUNT] = { NULL, };
+
+static void timer_instance_status_get_property(GObject *obj, guint id,
+                                             GValue *val, GParamSpec *spec)
+{
+    ALSATimerInstanceStatus *self = ALSATIMER_INSTANCE_STATUS(obj);
+    ALSATimerInstanceStatusPrivate *priv =
+                           alsatimer_instance_status_get_instance_private(self);
+
+    switch (id) {
+    case TIMER_INSTANCE_STATUS_PROP_INTERVAL:
+        g_value_set_uint(val, priv->status.resolution);
+        break;
+    case TIMER_INSTANCE_STATUS_PROP_LOST:
+        g_value_set_uint(val, priv->status.lost);
+        break;
+    case TIMER_INSTANCE_STATUS_PROP_OVERRUN:
+        g_value_set_uint(val, priv->status.overrun);
+        break;
+    case TIMER_INSTANCE_STATUS_PROP_QUEUE_SIZE:
+        g_value_set_uint(val, priv->status.queue);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
 
 static void alsatimer_instance_status_class_init(ALSATimerInstanceStatusClass *klass)
 {
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->get_property = timer_instance_status_get_property;
+
+    timer_instance_status_props[TIMER_INSTANCE_STATUS_PROP_INTERVAL] =
+        g_param_spec_uint("interval", "interval",
+                          "The current interval in nano second.",
+                          0, G_MAXUINT,
+                          0,
+                          G_PARAM_READABLE);
+
+    timer_instance_status_props[TIMER_INSTANCE_STATUS_PROP_LOST] =
+        g_param_spec_uint("lost", "lost",
+                          "The count of losts master ticks.",
+                          0, G_MAXUINT,
+                          0,
+                          G_PARAM_READABLE);
+
+    timer_instance_status_props[TIMER_INSTANCE_STATUS_PROP_OVERRUN] =
+        g_param_spec_uint("overrun", "overrun",
+                          "The count of overrun in read queue.",
+                          0, G_MAXUINT,
+                          0,
+                          G_PARAM_READABLE);
+
+    timer_instance_status_props[TIMER_INSTANCE_STATUS_PROP_QUEUE_SIZE] =
+        g_param_spec_uint("queue-size", "queue-size",
+                          "The current size of queue.",
+                          0, G_MAXUINT,
+                          0,
+                          G_PARAM_READABLE);
+
+    g_object_class_install_properties(gobject_class,
+                                      TIMER_INSTANCE_STATUS_PROP_COUNT,
+                                      timer_instance_status_props);
 }
 
 static void alsatimer_instance_status_init(ALSATimerInstanceStatus *self)
 {
     return;
 }
+
+/**
+ * alsatimer_instance_status_get_timestamp:
+ * @self: A #ALSATimerInstanceStatus.
+ * @tv_sec: (out): The second part of timestamp.
+ * @tv_nsec: (out): The nano second part of timerstamp.
+ *
+ * Get timestamp for the latest update.
+ */
+void alsatimer_instance_status_get_timestamp(ALSATimerInstanceStatus *self,
+                                             guint *tv_sec, guint *tv_nsec)
+{
+    ALSATimerInstanceStatusPrivate *priv;
+
+    g_return_if_fail(ALSATIMER_IS_INSTANCE_STATUS(self));
+    g_return_if_fail(tv_sec != NULL);
+    g_return_if_fail(tv_nsec != NULL);
+    priv = alsatimer_instance_status_get_instance_private(self);
+
+    *tv_sec = (guint)priv->status.tstamp.tv_sec;
+    *tv_nsec = (guint)priv->status.tstamp.tv_nsec;
+
+}
index 3a05e8442875357aa61d2a860f2fb45aa347b645..bf58edeee764b2444665132238ae1adc9e288e41 100644 (file)
@@ -31,9 +31,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSATimerInstanceStatus         ALSATimerInstanceStatus;
 typedef struct _ALSATimerInstanceStatusClass    ALSATimerInstanceStatusClass;
+typedef struct _ALSATimerInstanceStatusPrivate  ALSATimerInstanceStatusPrivate;
 
 struct _ALSATimerInstanceStatus {
     GObject parent_instance;
+
+    ALSATimerInstanceStatusPrivate *priv;
 };
 
 struct _ALSATimerInstanceStatusClass {
@@ -42,6 +45,9 @@ struct _ALSATimerInstanceStatusClass {
 
 GType alsatimer_instance_status_get_type() G_GNUC_CONST;
 
+void alsatimer_instance_status_get_timestamp(ALSATimerInstanceStatus *self,
+                                             guint *tv_sec, guint *tv_nsec);
+
 G_END_DECLS
 
 #endif
index d3b974bb5edf3fd546abad796bb41e1cd30e0058..5454d0b76a63e78f315eb5441b42f19ed1350d6e 100644 (file)
@@ -10,8 +10,15 @@ gi.require_version('ALSATimer', '0.0')
 from gi.repository import ALSATimer
 
 target = ALSATimer.InstanceStatus()
-props = ()
-methods = ()
+props = (
+    'interval',
+    'lost',
+    'overrun',
+    'queue-size',
+)
+methods = (
+    'get_timestamp',
+)
 signals = ()
 
 if not test(target, props, methods, signals):