]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: elem_info: add properties for common information
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 18 Nov 2019 04:22:44 +0000 (13:22 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 12 Dec 2019 05:29:09 +0000 (14:29 +0900)
src/ctl/elem-info.c
src/ctl/elem-info.h
tests/alsactl-elem-info

index 5d96d30f9662a514e2863b002343d4324ac41da3..1dc0c7b6c2bd307567c2b7ac69a23936632d4281 100644 (file)
 // SPDX-License-Identifier: LGPL-3.0-or-later
 #include "elem-info.h"
 
-G_DEFINE_ABSTRACT_TYPE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT)
+#include <sound/asound.h>
+
+struct _ALSACtlElemInfoPrivate {
+    struct snd_ctl_elem_info info;
+};
+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ALSACtlElemInfo, alsactl_elem_info, G_TYPE_OBJECT)
+
+enum ctl_elem_info_prop_type {
+    CTL_ELEM_INFO_PROP_ELEM_ID = 1,
+    CTL_ELEM_INFO_PROP_TYPE,
+    CTL_ELEM_INFO_PROP_ACCESS,
+    CTL_ELEM_INFO_PROP_OWNER,
+    CTL_ELEM_INFO_PROP_COUNT,
+};
+static GParamSpec *ctl_elem_info_props[CTL_ELEM_INFO_PROP_COUNT] = { NULL, };
+
+static void ctl_elem_info_set_property(GObject *obj, guint id,
+                                       const GValue *val, GParamSpec *spec)
+{
+    ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj);
+    ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self);
+
+    switch (id) {
+    case CTL_ELEM_INFO_PROP_TYPE:
+        priv->info.type = (ALSACtlElemType)g_value_get_enum(val);
+        break;
+    case CTL_ELEM_INFO_PROP_ACCESS:
+        priv->info.access = (ALSACtlElemAccessFlag)g_value_get_flags(val);
+        break;
+    case CTL_ELEM_INFO_PROP_OWNER:
+         priv->info.owner = g_value_get_int(val);
+         break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
+
+static void ctl_elem_info_get_property(GObject *obj, guint id, GValue *val,
+                                       GParamSpec *spec)
+{
+    ALSACtlElemInfo *self = ALSACTL_ELEM_INFO(obj);
+    ALSACtlElemInfoPrivate *priv = alsactl_elem_info_get_instance_private(self);
+
+    switch (id) {
+    case CTL_ELEM_INFO_PROP_ELEM_ID:
+        g_value_set_static_boxed(val, (const ALSACtlElemId* )&priv->info.id);
+        break;
+    case CTL_ELEM_INFO_PROP_TYPE:
+        g_value_set_enum(val, (ALSACtlElemType)priv->info.type);
+        break;
+    case CTL_ELEM_INFO_PROP_ACCESS:
+        g_value_set_flags(val, priv->info.access);
+        break;
+    case CTL_ELEM_INFO_PROP_OWNER:
+         g_value_set_int(val, priv->info.owner);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec);
+        break;
+    }
+}
 
 static void alsactl_elem_info_class_init(ALSACtlElemInfoClass *klass)
 {
-    return;
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+    gobject_class->set_property = ctl_elem_info_set_property;
+    gobject_class->get_property = ctl_elem_info_get_property;
+
+    ctl_elem_info_props[CTL_ELEM_INFO_PROP_ELEM_ID] =
+        g_param_spec_boxed("elem-id", "elem-id",
+                           "The identifier of the element, one of ALSACtlElemId",
+                           ALSACTL_TYPE_ELEM_ID,
+                           G_PARAM_READABLE);
+
+    ctl_elem_info_props[CTL_ELEM_INFO_PROP_TYPE] =
+        g_param_spec_enum("type", "type",
+                          "The type for this element, one of ALSACtlElemType",
+                          ALSACTL_TYPE_ELEM_TYPE,
+                          ALSACTL_ELEM_TYPE_NONE,
+                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+
+    ctl_elem_info_props[CTL_ELEM_INFO_PROP_ACCESS] =
+        g_param_spec_flags("access", "access",
+                           "The access permission for this element with "
+                           "flags of ALSACtlElemAccessFlag.",
+                           ALSACTL_TYPE_ELEM_ACCESS_FLAG,
+                           ALSACTL_ELEM_ACCESS_FLAG_READ,
+                           G_PARAM_READWRITE);
+
+    ctl_elem_info_props[CTL_ELEM_INFO_PROP_OWNER] =
+        g_param_spec_int("owner", "owner",
+                         "The value of PID for process to own the element",
+                         G_MININT, G_MAXINT,
+                         -1,
+                         G_PARAM_READABLE);
+
+    g_object_class_install_properties(gobject_class, CTL_ELEM_INFO_PROP_COUNT,
+                                      ctl_elem_info_props);
 }
 
 static void alsactl_elem_info_init(ALSACtlElemInfo *self)
index 625667323c8b5a74bd5f1d9a7b6c6334e00b21f3..ea6d7e7457901eaf57d89a6195f512ae83301ebd 100644 (file)
@@ -5,6 +5,10 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include <ctl/elem-id.h>
+
+#include <ctl/alsactl-enums.h>
+
 G_BEGIN_DECLS
 
 #define ALSACTL_TYPE_ELEM_INFO      (alsactl_elem_info_get_type())
@@ -31,9 +35,12 @@ G_BEGIN_DECLS
 
 typedef struct _ALSACtlElemInfo         ALSACtlElemInfo;
 typedef struct _ALSACtlElemInfoClass    ALSACtlElemInfoClass;
+typedef struct _ALSACtlElemInfoPrivate  ALSACtlElemInfoPrivate;
 
 struct _ALSACtlElemInfo {
     GObject parent_instance;
+
+    ALSACtlElemInfoPrivate *priv;
 };
 
 struct _ALSACtlElemInfoClass {
index dfb56dd62c8a5750dc0e3a37c02085c553d96eff..36c0acde9e744ba7c74789cb0cdcfacc9a10c582 100644 (file)
@@ -10,7 +10,12 @@ gi.require_version('ALSACtl', '0.0')
 from gi.repository import ALSACtl
 
 target = ALSACtl.ElemInfo
-props = ()
+props = (
+    'elem-id',
+    'type',
+    'access',
+    'owner',
+)
 methods = ()
 signals = ()