From fd94f701a2d421e8f03fc400d9af5de8611574d7 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Wed, 1 Apr 2020 18:13:28 +0900 Subject: [PATCH] seq: add global method to get information of ALSA Sequencer Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq.map | 1 + src/seq/privates.h | 7 +++++++ src/seq/query.c | 47 +++++++++++++++++++++++++++++++++++++++++++ src/seq/query.h | 4 ++++ src/seq/system-info.c | 13 +++++++++--- 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 87c04ff..1b9fca6 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -18,6 +18,7 @@ ALSA_GOBJECT_0_0_0 { "alsaseq_get_seq_sysname"; "alsaseq_get_seq_devnode"; + "alsaseq_get_system_info"; "alsaseq_system_info_get_type"; local: diff --git a/src/seq/privates.h b/src/seq/privates.h index 4472217..68316f9 100644 --- a/src/seq/privates.h +++ b/src/seq/privates.h @@ -7,6 +7,10 @@ #include #include +#include "system-info.h" + +#include + G_BEGIN_DECLS GQuark alsaseq_error_quark(void); @@ -15,6 +19,9 @@ GQuark alsaseq_error_quark(void); g_set_error(err, alsaseq_error_quark(), errno, \ __FILE__ ":%d: %s", __LINE__, strerror(errno)) +void seq_system_info_refer_private(ALSASeqSystemInfo *self, + struct snd_seq_system_info **info); + G_END_DECLS #endif diff --git a/src/seq/query.c b/src/seq/query.c index 91356e4..d81f251 100644 --- a/src/seq/query.c +++ b/src/seq/query.c @@ -3,6 +3,11 @@ #include "privates.h" #include +#include +#include +#include +#include +#include #include @@ -94,3 +99,45 @@ void alsaseq_get_seq_devnode(gchar **devnode, GError **error) udev_device_unref(dev); udev_unref(ctx); } + +/** + * alsaseq_get_system_info: + * @system_info: (out): The information of ALSA Sequencer. + * @error: A #GError. + * + * Get information of ALSA Sequencer. + */ +void alsaseq_get_system_info(ALSASeqSystemInfo **system_info, GError **error) +{ + char *devnode; + struct snd_seq_system_info *info; + int fd; + + alsaseq_get_seq_devnode(&devnode, error); + if (*error != NULL) + return; + + *system_info = g_object_new(ALSASEQ_TYPE_SYSTEM_INFO, NULL); + seq_system_info_refer_private(*system_info, &info); + + fd = open(devnode, O_RDONLY); + g_free(devnode); + if (fd < 0) { + generate_error(error, errno); + g_object_unref(*system_info); + *system_info = NULL; + return; + } + + if (ioctl(fd, SNDRV_SEQ_IOCTL_SYSTEM_INFO, info) < 0) + generate_error(error, errno); + close(fd); + if (*error != NULL) { + g_object_unref(*system_info); + *system_info = NULL; + return; + } + + // Decrement count for the above connection. + --info->cur_clients; +} diff --git a/src/seq/query.h b/src/seq/query.h index 1f428f4..14eb961 100644 --- a/src/seq/query.h +++ b/src/seq/query.h @@ -5,12 +5,16 @@ #include #include +#include + G_BEGIN_DECLS void alsaseq_get_seq_sysname(gchar **sysname, GError **error); void alsaseq_get_seq_devnode(gchar **devnode, GError **error); +void alsaseq_get_system_info(ALSASeqSystemInfo **system_info, GError **error); + G_END_DECLS #endif diff --git a/src/seq/system-info.c b/src/seq/system-info.c index bdb0458..147952e 100644 --- a/src/seq/system-info.c +++ b/src/seq/system-info.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "system-info.h" - -#include +#include "privates.h" struct _ALSASeqSystemInfoPrivate { struct snd_seq_system_info info; @@ -109,3 +107,12 @@ static void alsaseq_system_info_init(ALSASeqSystemInfo *self) { return; } + +void seq_system_info_refer_private(ALSASeqSystemInfo *self, + struct snd_seq_system_info **info) +{ + ALSASeqSystemInfoPrivate *priv = + alsaseq_system_info_get_instance_private(self); + + *info = &priv->info; +} -- 2.47.3