From 51513507749cae94166be3341616a82986ebea43 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: card: add an API to get information of sound card --- src/ctl/alsactl.map | 1 + src/ctl/card-info.c | 12 +++++++++--- src/ctl/card.c | 28 ++++++++++++++++++++++++++-- src/ctl/card.h | 5 +++++ src/ctl/privates.h | 7 +++++++ tests/alsactl-card | 1 + 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 05eb999..8cd4703 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -14,6 +14,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_card_get_type"; "alsactl_card_new"; "alsactl_card_open"; + "alsactl_card_get_info"; "alsactl_card_info_get_type"; local: diff --git a/src/ctl/card-info.c b/src/ctl/card-info.c index da7eca4..40a03c5 100644 --- a/src/ctl/card-info.c +++ b/src/ctl/card-info.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "card-info.h" - -#include +#include "privates.h" struct _ALSACtlCardInfoPrivate { struct snd_ctl_card_info info; @@ -112,3 +110,11 @@ static void alsactl_card_info_init(ALSACtlCardInfo *self) { return; } + +void ctl_card_info_refer_private(ALSACtlCardInfo *self, + struct snd_ctl_card_info **info) +{ + ALSACtlCardInfoPrivate *priv = alsactl_card_info_get_instance_private(self); + + *info = &priv->info; +} diff --git a/src/ctl/card.c b/src/ctl/card.c index 92bf6f4..fa505a3 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -10,8 +10,6 @@ #include #include -#include - struct _ALSACtlCardPrivate { int fd; char *devnode; @@ -116,3 +114,29 @@ void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error) priv->devnode = devnode; } + +/** + * alsactl_card_get_info: + * @self: A #ALSACtlCard. + * @card_info: (out): A #ALSACtlCardInfo for the sound card. + * @error: A #GError. + * + * Get the information of sound card. + */ +void alsactl_card_get_info(ALSACtlCard *self, ALSACtlCardInfo **card_info, + GError **error) +{ + ALSACtlCardPrivate *priv; + struct snd_ctl_card_info *info; + + g_return_if_fail(ALSACTL_IS_CARD(self)); + priv = alsactl_card_get_instance_private(self); + + *card_info = g_object_new(ALSACTL_TYPE_CARD_INFO, NULL); + + ctl_card_info_refer_private(*card_info, &info); + if (ioctl(priv->fd, SNDRV_CTL_IOCTL_CARD_INFO, info) < 0) { + generate_error(error, errno); + g_object_unref(*card_info); + } +} diff --git a/src/ctl/card.h b/src/ctl/card.h index 9df24c3..0ead57e 100644 --- a/src/ctl/card.h +++ b/src/ctl/card.h @@ -5,6 +5,8 @@ #include #include +#include + G_BEGIN_DECLS #define ALSACTL_TYPE_CARD (alsactl_card_get_type()) @@ -49,6 +51,9 @@ ALSACtlCard *alsactl_card_new(); void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error); +void alsactl_card_get_info(ALSACtlCard *self, ALSACtlCardInfo **card_info, + GError **error); + G_END_DECLS #endif diff --git a/src/ctl/privates.h b/src/ctl/privates.h index 4a61640..69aeb2b 100644 --- a/src/ctl/privates.h +++ b/src/ctl/privates.h @@ -7,6 +7,10 @@ #include #include +#include "card-info.h" + +#include + G_BEGIN_DECLS GQuark alsactl_error_quark(void); @@ -15,6 +19,9 @@ GQuark alsactl_error_quark(void); g_set_error(err, alsactl_error_quark(), errno, \ __FILE__ ":%d: %s", __LINE__, strerror(errno)) +void ctl_card_info_refer_private(ALSACtlCardInfo *self, + struct snd_ctl_card_info **info); + G_END_DECLS #endif diff --git a/tests/alsactl-card b/tests/alsactl-card index 81802ce..05127ee 100644 --- a/tests/alsactl-card +++ b/tests/alsactl-card @@ -16,6 +16,7 @@ props = ( methods = ( 'new', 'open', + 'get_info', ) signals = () -- 2.47.3