From 878641c76a629a8591d26957c48580058a74500c Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] ctl: card: add properties --- src/ctl/card.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- src/ctl/privates.h | 3 +++ tests/alsactl-card | 4 +++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/ctl/card.c b/src/ctl/card.c index c890e3a..92bf6f4 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -8,21 +8,47 @@ #include #include #include +#include #include struct _ALSACtlCardPrivate { int fd; + char *devnode; }; G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT) +enum ctl_card_prop_type { + CTL_CARD_PROP_DEVNODE = 1, + CTL_CARD_PROP_COUNT, +}; +static GParamSpec *ctl_card_props[CTL_CARD_PROP_COUNT] = { NULL, }; + +static void ctl_card_get_property(GObject *obj, guint id, GValue *val, + GParamSpec *spec) +{ + ALSACtlCard *self = ALSACTL_CARD(obj); + ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self); + + switch (id) { + case CTL_CARD_PROP_DEVNODE: + g_value_set_string(val, priv->devnode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + static void ctl_card_finalize(GObject *obj) { ALSACtlCard *self = ALSACTL_CARD(obj); ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self); - if (priv->fd >= 0) + if (priv->fd >= 0) { close(priv->fd); + g_free(priv->devnode); + } G_OBJECT_CLASS(alsactl_card_parent_class)->finalize(obj); } @@ -32,6 +58,16 @@ static void alsactl_card_class_init(ALSACtlCardClass *klass) GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->finalize = ctl_card_finalize; + gobject_class->get_property = ctl_card_get_property; + + ctl_card_props[CTL_CARD_PROP_DEVNODE] = + g_param_spec_string("devnode", "devnode", + "The full path of control character device.", + "", + G_PARAM_READABLE); + + g_object_class_install_properties(gobject_class, CTL_CARD_PROP_COUNT, + ctl_card_props); } static void alsactl_card_init(ALSACtlCard *self) @@ -72,8 +108,11 @@ void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error) return; priv->fd = open(devnode, O_RDONLY | O_NONBLOCK); - if (priv->fd < 0) + if (priv->fd < 0) { generate_error(error, errno); + g_free(devnode); + return; + } - g_free(devnode); + priv->devnode = devnode; } diff --git a/src/ctl/privates.h b/src/ctl/privates.h index 4a61640..adc32ca 100644 --- a/src/ctl/privates.h +++ b/src/ctl/privates.h @@ -7,6 +7,9 @@ #include #include +#include "query.h" +#include "card.h" + G_BEGIN_DECLS GQuark alsactl_error_quark(void); diff --git a/tests/alsactl-card b/tests/alsactl-card index 882049f..81802ce 100644 --- a/tests/alsactl-card +++ b/tests/alsactl-card @@ -10,7 +10,9 @@ gi.require_version('ALSACtl', '0.0') from gi.repository import ALSACtl target = ALSACtl.Card() -props = () +props = ( + 'devnode', +) methods = ( 'new', 'open', -- 2.47.3