From db158752e02c8872c9b97b9a147d4a08c2555d66 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 9 Feb 2020 12:20:53 +0900 Subject: [PATCH] timer: add global method to get status of timer device Signed-off-by: Takashi Sakamoto --- src/timer/alsatimer.map | 1 + src/timer/device-status.c | 13 ++++++++++--- src/timer/privates.h | 4 ++++ src/timer/query.c | 39 +++++++++++++++++++++++++++++++++++++++ src/timer/query.h | 6 ++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/timer/alsatimer.map b/src/timer/alsatimer.map index ed05263..825418f 100644 --- a/src/timer/alsatimer.map +++ b/src/timer/alsatimer.map @@ -11,6 +11,7 @@ ALSA_GOBJECT_0_0_0 { "alsatimer_get_devnode"; "alsatimer_get_device_id_list"; "alsatimer_get_device_info"; + "alsatimer_get_device_status"; "alsatimer_device_id_get_type"; "alsatimer_device_id_new"; diff --git a/src/timer/device-status.c b/src/timer/device-status.c index c27866d..233f9d2 100644 --- a/src/timer/device-status.c +++ b/src/timer/device-status.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "device-status.h" - -#include +#include "privates.h" struct _ALSATimerDeviceStatusPrivate { struct snd_timer_gstatus status; @@ -76,3 +74,12 @@ static void alsatimer_device_status_init(ALSATimerDeviceStatus *self) { return; } + +void timer_device_status_refer_private(ALSATimerDeviceStatus *self, + struct snd_timer_gstatus **status) +{ + ALSATimerDeviceStatusPrivate *priv = + alsatimer_device_status_get_instance_private(self); + + *status = &priv->status; +} diff --git a/src/timer/privates.h b/src/timer/privates.h index 5785d46..81cb6af 100644 --- a/src/timer/privates.h +++ b/src/timer/privates.h @@ -3,6 +3,7 @@ #define __ALSA_GOBJECT_ALSATIMER_PRIVATES__H__ #include "device-info.h" +#include "device-status.h" #include @@ -17,6 +18,9 @@ GQuark alsatimer_error_quark(void); void timer_device_info_refer_private(ALSATimerDeviceInfo *self, struct snd_timer_ginfo **info); +void timer_device_status_refer_private(ALSATimerDeviceStatus *self, + struct snd_timer_gstatus **status); + G_END_DECLS #endif diff --git a/src/timer/query.c b/src/timer/query.c index c88a9e5..b65a5f3 100644 --- a/src/timer/query.c +++ b/src/timer/query.c @@ -193,3 +193,42 @@ void alsatimer_get_device_info(ALSATimerDeviceId *device_id, close(fd); } + +/** + * alsatimer_get_device_status: + * @device_id: A #ALSATimerDeviceId to identify the timer device. + * @device_status: (out): The status of timer device. + * @error: A #GError. + */ +void alsatimer_get_device_status(ALSATimerDeviceId *device_id, + ALSATimerDeviceStatus **device_status, + GError **error) +{ + char *devnode; + struct snd_timer_gstatus *status; + int fd; + + g_return_if_fail(device_id != NULL); + + alsatimer_get_devnode(&devnode, error); + if (*error != NULL) + return; + + fd = open(devnode, O_RDONLY); + g_free(devnode); + if (fd < 0) { + generate_error(error, errno); + return; + } + + *device_status = g_object_new(ALSATIMER_TYPE_DEVICE_STATUS, NULL); + timer_device_status_refer_private(*device_status, &status); + + status->tid = *device_id; + if (ioctl(fd, SNDRV_TIMER_IOCTL_GSTATUS, status) < 0) { + generate_error(error, errno); + g_object_unref(*device_status); + } + + close(fd); +} diff --git a/src/timer/query.h b/src/timer/query.h index facf489..d3dc3a7 100644 --- a/src/timer/query.h +++ b/src/timer/query.h @@ -7,6 +7,7 @@ #include #include +#include #include @@ -21,6 +22,11 @@ void alsatimer_get_device_id_list(GList **entries, GError **error); void alsatimer_get_device_info(ALSATimerDeviceId *device_id, ALSATimerDeviceInfo **device_info, GError **error); + +void alsatimer_get_device_status(ALSATimerDeviceId *device_id, + ALSATimerDeviceStatus **device_status, + GError **error); + G_END_DECLS #endif -- 2.47.3