From b39cd1ea18a820cf403cd23183e790f77b5d054f Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 9 Feb 2020 12:20:53 +0900 Subject: [PATCH] timer: instance_status: add properies and access methods Signed-off-by: Takashi Sakamoto --- src/timer/alsatimer.map | 1 + src/timer/instance-status.c | 100 +++++++++++++++++++++++++++++++- src/timer/instance-status.h | 6 ++ tests/alsatimer-instance-status | 11 +++- 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/src/timer/alsatimer.map b/src/timer/alsatimer.map index 5e1a91c..c3939c1 100644 --- a/src/timer/alsatimer.map +++ b/src/timer/alsatimer.map @@ -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: *; }; diff --git a/src/timer/instance-status.c b/src/timer/instance-status.c index 04f5825..85763cc 100644 --- a/src/timer/instance-status.c +++ b/src/timer/instance-status.c @@ -1,13 +1,111 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "instance-status.h" -G_DEFINE_TYPE(ALSATimerInstanceStatus, alsatimer_instance_status, G_TYPE_OBJECT) +#include + +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; + +} diff --git a/src/timer/instance-status.h b/src/timer/instance-status.h index 3a05e84..bf58ede 100644 --- a/src/timer/instance-status.h +++ b/src/timer/instance-status.h @@ -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 diff --git a/tests/alsatimer-instance-status b/tests/alsatimer-instance-status index d3b974b..5454d0b 100644 --- a/tests/alsatimer-instance-status +++ b/tests/alsatimer-instance-status @@ -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): -- 2.47.3