From 87deb33b99c2b1ed0dfbf8a253ce60f0be10f707 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: card: add APIs to open ALSA control character devices --- src/ctl/alsactl.map | 1 + src/ctl/card.c | 61 ++++++++++++++++++++++++++++++++++++++++++--- src/ctl/card.h | 5 ++++ tests/alsactl-card | 1 + 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index f7b0ed6..9ad22c3 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -13,6 +13,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_card_get_type"; "alsactl_card_new"; + "alsactl_card_open"; local: *; }; diff --git a/src/ctl/card.c b/src/ctl/card.c index 565b3c2..c890e3a 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -1,16 +1,44 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "card.h" +#include "query.h" +#include "privates.h" -G_DEFINE_TYPE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT) +#include +#include +#include +#include +#include + +#include + +struct _ALSACtlCardPrivate { + int fd; +}; +G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT) + +static void ctl_card_finalize(GObject *obj) +{ + ALSACtlCard *self = ALSACTL_CARD(obj); + ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self); + + if (priv->fd >= 0) + close(priv->fd); + + G_OBJECT_CLASS(alsactl_card_parent_class)->finalize(obj); +} static void alsactl_card_class_init(ALSACtlCardClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->finalize = ctl_card_finalize; } static void alsactl_card_init(ALSACtlCard *self) { - return; + ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self); + + priv->fd = -1; } /** @@ -22,3 +50,30 @@ ALSACtlCard *alsactl_card_new() { return g_object_new(ALSACTL_TYPE_CARD, NULL); } + +/** + * alsactl_card_open: + * @self: A #ALSACtlCard. + * @card_id: The numerical ID of sound card. + * @error: A #GError. + * + * Open ALSA control character device for the sound card. + */ +void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error) +{ + ALSACtlCardPrivate *priv; + char *devnode; + + g_return_if_fail(ALSACTL_IS_CARD(self)); + priv = alsactl_card_get_instance_private(self); + + alsactl_get_control_devnode(card_id, &devnode, error); + if (*error != NULL) + return; + + priv->fd = open(devnode, O_RDONLY | O_NONBLOCK); + if (priv->fd < 0) + generate_error(error, errno); + + g_free(devnode); +} diff --git a/src/ctl/card.h b/src/ctl/card.h index 9d443f8..9df24c3 100644 --- a/src/ctl/card.h +++ b/src/ctl/card.h @@ -31,9 +31,12 @@ G_BEGIN_DECLS typedef struct _ALSACtlCard ALSACtlCard; typedef struct _ALSACtlCardClass ALSACtlCardClass; +typedef struct _ALSACtlCardPrivate ALSACtlCardPrivate; struct _ALSACtlCard { GObject parent_instance; + + ALSACtlCardPrivate *priv; }; struct _ALSACtlCardClass { @@ -44,6 +47,8 @@ GType alsactl_card_get_type() G_GNUC_CONST; ALSACtlCard *alsactl_card_new(); +void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error); + G_END_DECLS #endif diff --git a/tests/alsactl-card b/tests/alsactl-card index eb46ee8..882049f 100644 --- a/tests/alsactl-card +++ b/tests/alsactl-card @@ -13,6 +13,7 @@ target = ALSACtl.Card() props = () methods = ( 'new', + 'open', ) signals = () -- 2.47.3