From: Takashi Sakamoto Date: Sun, 9 Feb 2020 03:20:53 +0000 (+0900) Subject: timer: user_instance: add an API to open ALSA Timer character device X-Git-Tag: v0.1.0~349 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=f329e6b395d856e22a640f6791739123dfcb200f;p=alsa-gobject.git timer: user_instance: add an API to open ALSA Timer character device Signed-off-by: Takashi Sakamoto --- diff --git a/src/timer/alsatimer.map b/src/timer/alsatimer.map index b3d6eae..63be1eb 100644 --- a/src/timer/alsatimer.map +++ b/src/timer/alsatimer.map @@ -29,6 +29,7 @@ ALSA_GOBJECT_0_0_0 { "alsatimer_user_instance_get_type"; "alsatimer_user_instance_new"; + "alsatimer_user_instance_open"; local: *; }; diff --git a/src/timer/user-instance.c b/src/timer/user-instance.c index d8e873d..f9e0835 100644 --- a/src/timer/user-instance.c +++ b/src/timer/user-instance.c @@ -1,16 +1,70 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "user-instance.h" +#include "query.h" +#include "privates.h" -G_DEFINE_TYPE(ALSATimerUserInstance, alsatimer_user_instance, G_TYPE_OBJECT) +#include +#include +#include +#include +#include + +struct _ALSATimerUserInstancePrivate { + int fd; +}; +G_DEFINE_TYPE_WITH_PRIVATE(ALSATimerUserInstance, alsatimer_user_instance, G_TYPE_OBJECT) + +static void timer_user_instance_finalize(GObject *obj) +{ + ALSATimerUserInstance *self = ALSATIMER_USER_INSTANCE(obj); + ALSATimerUserInstancePrivate *priv = + alsatimer_user_instance_get_instance_private(self); + + if (priv->fd >= 0) + close(priv->fd); + + G_OBJECT_CLASS(alsatimer_user_instance_parent_class)->finalize(obj); +} static void alsatimer_user_instance_class_init(ALSATimerUserInstanceClass *klass) { - return; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->finalize = timer_user_instance_finalize; } static void alsatimer_user_instance_init(ALSATimerUserInstance *self) { - return; + ALSATimerUserInstancePrivate *priv = + alsatimer_user_instance_get_instance_private(self); + + priv->fd = -1; +} + +/** + * alsatimer_user_instance_open: + * @self: A #ALSATimerUserInstance. + * @error: A #GError. + * + * Open ALSA Timer character device to allocate queue. + */ +void alsatimer_user_instance_open(ALSATimerUserInstance *self, GError **error) +{ + ALSATimerUserInstancePrivate *priv; + char *devnode; + + g_return_if_fail(ALSATIMER_IS_USER_INSTANCE(self)); + priv = alsatimer_user_instance_get_instance_private(self); + + alsatimer_get_devnode(&devnode, error); + if (*error != NULL) + return; + + priv->fd = open(devnode, O_RDONLY); + g_free(devnode); + if (priv->fd < 0) { + generate_error(error, errno); + } } ALSATimerUserInstance *alsatimer_user_instance_new() diff --git a/src/timer/user-instance.h b/src/timer/user-instance.h index 141d798..768b8bf 100644 --- a/src/timer/user-instance.h +++ b/src/timer/user-instance.h @@ -31,9 +31,12 @@ G_BEGIN_DECLS typedef struct _ALSATimerUserInstance ALSATimerUserInstance; typedef struct _ALSATimerUserInstanceClass ALSATimerUserInstanceClass; +typedef struct _ALSATimerUserInstancePrivate ALSATimerUserInstancePrivate; struct _ALSATimerUserInstance { GObject parent_instance; + + ALSATimerUserInstancePrivate *priv; }; struct _ALSATimerUserInstanceClass { @@ -44,6 +47,8 @@ GType alsatimer_user_instance_get_type() G_GNUC_CONST; ALSATimerUserInstance *alsatimer_user_instance_new(); +void alsatimer_user_instance_open(ALSATimerUserInstance *self, GError **error); + G_END_DECLS #endif diff --git a/tests/alsatimer-user-instance b/tests/alsatimer-user-instance index 60cbcf0..33ad6b3 100644 --- a/tests/alsatimer-user-instance +++ b/tests/alsatimer-user-instance @@ -13,6 +13,7 @@ target = ALSATimer.UserInstance() props = () methods = ( 'new', + 'open', ) signals = ()