From 222209143ced9c4361cc12253a9b856caaf97956 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Mon, 18 Nov 2019 13:22:44 +0900 Subject: [PATCH] rawmidi: substream_params: add properties Signed-off-by: Takashi Sakamoto --- src/rawmidi/substream-params.c | 95 +++++++++++++++++++++++++++++- src/rawmidi/substream-params.h | 3 + tests/alsarawmidi-substream-params | 6 +- 3 files changed, 101 insertions(+), 3 deletions(-) diff --git a/src/rawmidi/substream-params.c b/src/rawmidi/substream-params.c index c08769b..0f5f078 100644 --- a/src/rawmidi/substream-params.c +++ b/src/rawmidi/substream-params.c @@ -1,11 +1,102 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "substream-params.h" -G_DEFINE_TYPE(ALSARawmidiSubstreamParams, alsarawmidi_substream_params, G_TYPE_OBJECT) +#include + +#include + +struct _ALSARawmidiSubstreamParamsPrivate { + struct snd_rawmidi_params params; +}; +G_DEFINE_TYPE_WITH_PRIVATE(ALSARawmidiSubstreamParams, alsarawmidi_substream_params, G_TYPE_OBJECT) + +enum rawmidi_substream_params_prop_type { + RAWMIDI_SUBSTREAM_PARAMS_PROP_BUFFER_SIZE = 1, + RAWMIDI_SUBSTREAM_PARAMS_PROP_AVAIL_MIN, + RAWMIDI_SUBSTREAM_PARAMS_PROP_ACTIVE_SENSING, + RAWMIDI_SUBSTREAM_PARAMS_PROP_COUNT, +}; +static GParamSpec *rawmidi_substream_params_props[RAWMIDI_SUBSTREAM_PARAMS_PROP_COUNT] = { NULL, }; + +static void rawmidi_substream_params_set_property(GObject *obj, guint id, + const GValue *val, GParamSpec *spec) +{ + ALSARawmidiSubstreamParams *self = ALSARAWMIDI_SUBSTREAM_PARAMS(obj); + ALSARawmidiSubstreamParamsPrivate *priv = + alsarawmidi_substream_params_get_instance_private(self); + + switch (id) { + case RAWMIDI_SUBSTREAM_PARAMS_PROP_BUFFER_SIZE: + priv->params.buffer_size = g_value_get_uint(val); + break; + case RAWMIDI_SUBSTREAM_PARAMS_PROP_AVAIL_MIN: + priv->params.avail_min = g_value_get_uint(val); + break; + case RAWMIDI_SUBSTREAM_PARAMS_PROP_ACTIVE_SENSING: + priv->params.no_active_sensing = !g_value_get_boolean(val); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} + +static void rawmidi_substream_params_get_property(GObject *obj, guint id, + GValue *val, GParamSpec *spec) +{ + ALSARawmidiSubstreamParams *self = ALSARAWMIDI_SUBSTREAM_PARAMS(obj); + ALSARawmidiSubstreamParamsPrivate *priv = + alsarawmidi_substream_params_get_instance_private(self); + + switch (id) { + case RAWMIDI_SUBSTREAM_PARAMS_PROP_BUFFER_SIZE: + g_value_set_uint(val, priv->params.buffer_size); + break; + case RAWMIDI_SUBSTREAM_PARAMS_PROP_AVAIL_MIN: + g_value_set_uint(val, priv->params.avail_min); + break; + case RAWMIDI_SUBSTREAM_PARAMS_PROP_ACTIVE_SENSING: + g_value_set_boolean(val, !priv->params.no_active_sensing); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, spec); + break; + } +} static void alsarawmidi_substream_params_class_init(ALSARawmidiSubstreamParamsClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + long page_size = sysconf(_SC_PAGESIZE); + + gobject_class->set_property = rawmidi_substream_params_set_property; + gobject_class->get_property = rawmidi_substream_params_get_property; + + rawmidi_substream_params_props[RAWMIDI_SUBSTREAM_PARAMS_PROP_BUFFER_SIZE] = + g_param_spec_uint("buffer-size", "buffer-size", + "The size of intermediate buffer for substream.", + 32, 1024 * 1024, + page_size, + G_PARAM_READWRITE); + + rawmidi_substream_params_props[RAWMIDI_SUBSTREAM_PARAMS_PROP_AVAIL_MIN] = + g_param_spec_uint("avail-min", "avail-min", + "The threshold to wake up from any blocking " + "operation such as poll(2), read(2) and write(2).", + 1, G_MAXUINT, + 1, + G_PARAM_READWRITE); + + rawmidi_substream_params_props[RAWMIDI_SUBSTREAM_PARAMS_PROP_ACTIVE_SENSING] = + g_param_spec_boolean("active-sensing", "active-sensing", + "Whether to emit 0xfe one time when closing " + "substream.", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_properties(gobject_class, + RAWMIDI_SUBSTREAM_PARAMS_PROP_COUNT, + rawmidi_substream_params_props); } static void alsarawmidi_substream_params_init(ALSARawmidiSubstreamParams *self) diff --git a/src/rawmidi/substream-params.h b/src/rawmidi/substream-params.h index a8deb52..1c662a3 100644 --- a/src/rawmidi/substream-params.h +++ b/src/rawmidi/substream-params.h @@ -31,9 +31,12 @@ G_BEGIN_DECLS typedef struct _ALSARawmidiSubstreamParams ALSARawmidiSubstreamParams; typedef struct _ALSARawmidiSubstreamParamsClass ALSARawmidiSubstreamParamsClass; +typedef struct _ALSARawmidiSubstreamParamsPrivate ALSARawmidiSubstreamParamsPrivate; struct _ALSARawmidiSubstreamParams { GObject parent_instance; + + ALSARawmidiSubstreamParamsPrivate *priv; }; struct _ALSARawmidiSubstreamParamsClass { diff --git a/tests/alsarawmidi-substream-params b/tests/alsarawmidi-substream-params index 8212a82..f85a186 100644 --- a/tests/alsarawmidi-substream-params +++ b/tests/alsarawmidi-substream-params @@ -10,7 +10,11 @@ gi.require_version('ALSARawmidi', '0.0') from gi.repository import ALSARawmidi target = ALSARawmidi.SubstreamParams() -props = () +props = ( + 'buffer-size', + 'avail-min', + 'active-sensing', +) methods = ( 'new', ) -- 2.47.3