From aaeaabd8d5e137c3d0119ee950f38ce5141dfcde Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 20 Nov 2019 18:52:25 +0900 Subject: [PATCH] seq: add global method to get status of queue Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 1 + src/seq/privates.h | 4 ++++ src/seq/query.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/seq/query.h | 4 ++++ src/seq/queue-status.c | 13 ++++++++++--- 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 4f427e7..588fcee 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -30,6 +30,7 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_get_queue_id_list"; "alsaseq_get_queue_info_by_id"; "alsaseq_get_queue_info_by_name"; + "alsaseq_get_queue_status"; "alsaseq_system_info_get_type"; diff --git a/src/seq/privates.h b/src/seq/privates.h index a139aab..eed1e5e 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -14,6 +14,7 @@ #include "event.h" #include "subscribe-data.h" #include "queue-info.h" +#include "queue-status.h" #include @@ -45,6 +46,9 @@ void seq_subscribe_data_refer_private(ALSASeqSubscribeData *self, void seq_queue_info_refer_private(ALSASeqQueueInfo *self, struct snd_seq_queue_info **info); +void seq_queue_status_refer_private(ALSASeqQueueStatus *self, + struct snd_seq_queue_status **status); + G_END_DECLS #endif diff --git a/src/seq/query.c b/src/seq/query.c index d79624d..fbc2411 100644 --- a/src/seq/query.c +++ b/src/seq/query.c @@ -671,3 +671,44 @@ void alsaseq_get_queue_info_by_name(const gchar *name, close(fd); } + +/** + * alsaseq_get_queue_status: + * @queue_id: The numerical ID of queue, except for entries in + * ALSASeqSpecificQueueId. + * @queue_status: (out): The current status of queue. + * @error: A #GError. + * + * Get current status of queue. + */ +void alsaseq_get_queue_status(guint queue_id, ALSASeqQueueStatus **queue_status, + GError **error) +{ + struct snd_seq_queue_status *status; + char *devnode; + int fd; + + alsaseq_get_seq_devnode(&devnode, error); + if (*error != NULL) + return; + + fd = open(devnode, O_RDONLY); + g_free(devnode); + if (fd < 0) { + generate_error(error, errno); + return; + } + + *queue_status = g_object_new(ALSASEQ_TYPE_QUEUE_STATUS, NULL); + seq_queue_status_refer_private(*queue_status, &status); + + status->queue = (int)queue_id; + if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS, status) < 0) { + generate_error(error, errno); + close(fd); + g_object_unref(*queue_status); + return; + } + + close(fd); +} diff --git a/src/seq/query.h b/src/seq/query.h index 7653ded..08aa68d 100644 --- a/src/seq/query.h +++ b/src/seq/query.h @@ -11,6 +11,7 @@ #include #include #include +#include G_BEGIN_DECLS @@ -48,6 +49,9 @@ void alsaseq_get_queue_info_by_name(const gchar *name, ALSASeqQueueInfo **queue_info, GError **error); +void alsaseq_get_queue_status(guint queue_id, ALSASeqQueueStatus **queue_status, + GError **error); + G_END_DECLS #endif diff --git a/src/seq/queue-status.c b/src/seq/queue-status.c index 791042c..db98e64 100644 --- a/src/seq/queue-status.c +++ b/src/seq/queue-status.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "queue-status.h" - -#include +#include "privates.h" struct _ALSASeqQueueStatusPrivate { struct snd_seq_queue_status status; @@ -114,3 +112,12 @@ void alsaseq_queue_status_get_real_time(ALSASeqQueueStatus *self, // supported ABIs. *real_time = (const guint32 *)&priv->status.time; } + +void seq_queue_status_refer_private(ALSASeqQueueStatus *self, + struct snd_seq_queue_status **status) +{ + ALSASeqQueueStatusPrivate *priv = + alsaseq_queue_status_get_instance_private(self); + + *status = &priv->status; +} -- 2.47.3