From 31eabdf6bc64720072d4f21ce00532ee2c1a3851 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 20 Nov 2019 17:28:23 +0900 Subject: [PATCH] seq: add global method to get the information of queue Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 2 ++ src/seq/privates.h | 3 ++ src/seq/query.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ src/seq/query.h | 7 ++++ src/seq/queue-info.c | 13 +++++-- 5 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index cb7da25..b9286e2 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -28,6 +28,8 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_get_client_pool"; "alsaseq_get_subscription_list"; "alsaseq_get_queue_id_list"; + "alsaseq_get_queue_info_by_id"; + "alsaseq_get_queue_info_by_name"; "alsaseq_system_info_get_type"; diff --git a/src/seq/privates.h b/src/seq/privates.h index 1b5c370..a139aab 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -42,6 +42,9 @@ void seq_event_refer_private(ALSASeqEvent *self, struct snd_seq_event **ev); void seq_subscribe_data_refer_private(ALSASeqSubscribeData *self, struct snd_seq_port_subscribe **data); +void seq_queue_info_refer_private(ALSASeqQueueInfo *self, + struct snd_seq_queue_info **info); + G_END_DECLS #endif diff --git a/src/seq/query.c b/src/seq/query.c index 2e2a91f..d79624d 100644 --- a/src/seq/query.c +++ b/src/seq/query.c @@ -589,3 +589,85 @@ void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count, *entries = list; *entry_count = count; } + +/** + * alsaseq_get_queue_info_by_id: + * @queue_id: The numerical ID of queue, except for one of + * ALSASeqSpecificQueueId. + * @queue_info: (out): The information of queue. + * @error: A #GError. + * + * Get the information of queue, according to the numerical ID. + */ +void alsaseq_get_queue_info_by_id(guint queue_id, ALSASeqQueueInfo **queue_info, + GError **error) +{ + struct snd_seq_queue_info *info; + 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_info = g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL); + seq_queue_info_refer_private(*queue_info, &info); + + info->queue = queue_id; + if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_QUEUE_INFO, info) < 0) { + generate_error(error, errno); + close(fd); + g_object_unref(*queue_info); + return; + } + + close(fd); +} + +/** + * alsaseq_get_queue_info_by_name: + * @name: The name string of queue to query. + * @queue_info: (out): The information of queue. + * @error: A #GError. + * + * Get the information of queue, according to the name string. + */ +void alsaseq_get_queue_info_by_name(const gchar *name, + ALSASeqQueueInfo **queue_info, + GError **error) +{ + struct snd_seq_queue_info *info; + 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_info = g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL); + seq_queue_info_refer_private(*queue_info, &info); + + strncpy(info->name, name, sizeof(info->name)); + if (ioctl(fd, SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE, info) < 0) { + generate_error(error, errno); + close(fd); + g_object_unref(*queue_info); + return; + } + + close(fd); +} diff --git a/src/seq/query.h b/src/seq/query.h index 689327f..7653ded 100644 --- a/src/seq/query.h +++ b/src/seq/query.h @@ -10,6 +10,7 @@ #include #include #include +#include G_BEGIN_DECLS @@ -41,6 +42,12 @@ void alsaseq_get_subscription_list(const ALSASeqAddr *addr, void alsaseq_get_queue_id_list(guint **entries, gsize *entry_count, GError **error); +void alsaseq_get_queue_info_by_id(guint queue_id, ALSASeqQueueInfo **queue_info, + GError **error); +void alsaseq_get_queue_info_by_name(const gchar *name, + ALSASeqQueueInfo **queue_info, + GError **error); + G_END_DECLS #endif diff --git a/src/seq/queue-info.c b/src/seq/queue-info.c index c68826c..8f1eaf9 100644 --- a/src/seq/queue-info.c +++ b/src/seq/queue-info.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "queue-info.h" - -#include +#include "privates.h" struct _ALSASeqQueueInfoPrivate { struct snd_seq_queue_info info; @@ -125,3 +123,12 @@ ALSASeqQueueInfo *alsaseq_queue_info_new() { return g_object_new(ALSASEQ_TYPE_QUEUE_INFO, NULL); } + +void seq_queue_info_refer_private(ALSASeqQueueInfo *self, + struct snd_seq_queue_info **info) +{ + ALSASeqQueueInfoPrivate *priv = + alsaseq_queue_info_get_instance_private(self); + + *info = &priv->info; +} -- 2.47.3