// SPDX-License-Identifier: LGPL-3.0-or-later
#include "user-client.h"
+#include "query.h"
+#include "privates.h"
-G_DEFINE_TYPE(ALSASeqUserClient, alsaseq_user_client, G_TYPE_OBJECT)
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+struct _ALSASeqUserClientPrivate {
+ int fd;
+ int client_id;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSASeqUserClient, alsaseq_user_client, G_TYPE_OBJECT)
+
+static void seq_user_client_finalize(GObject *obj)
+{
+ ALSASeqUserClient *self = ALSASEQ_USER_CLIENT(obj);
+ ALSASeqUserClientPrivate *priv =
+ alsaseq_user_client_get_instance_private(self);
+
+ if (priv->fd >= 0)
+ close(priv->fd);
+
+ G_OBJECT_CLASS(alsaseq_user_client_parent_class)->finalize(obj);
+}
static void alsaseq_user_client_class_init(ALSASeqUserClientClass *klass)
{
- return;
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->finalize = seq_user_client_finalize;
}
static void alsaseq_user_client_init(ALSASeqUserClient *self)
{
- return;
+ ALSASeqUserClientPrivate *priv =
+ alsaseq_user_client_get_instance_private(self);
+ priv->fd = -1;
}
/**
{
return g_object_new(ALSASEQ_TYPE_USER_CLIENT, NULL);
}
+
+/**
+ * alsaseq_user_client_open:
+ * @self: A #ALSASeqUserClient.
+ * @open_flag: The flag of open(2) system call. O_RDWR is forced to fulfil internally.
+ * @error: A #GError.
+ *
+ * Open ALSA sequencer character device.
+ */
+void alsaseq_user_client_open(ALSASeqUserClient *self, gint open_flag,
+ GError **error)
+{
+ ALSASeqUserClientPrivate *priv;
+ char *devnode;
+
+ g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self));
+ priv = alsaseq_user_client_get_instance_private(self);
+
+ alsaseq_get_seq_devnode(&devnode, error);
+ if (*error != NULL)
+ return;
+
+ open_flag |= O_RDWR;
+ priv->fd = open(devnode, open_flag);
+ g_free(devnode);
+ if (priv->fd < 0) {
+ generate_error(error, errno);
+ return;
+ }
+
+ if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CLIENT_ID, &priv->client_id) < 0) {
+ generate_error(error, errno);
+ close(priv->fd);
+ priv->fd = -1;
+ }
+}
typedef struct _ALSASeqUserClient ALSASeqUserClient;
typedef struct _ALSASeqUserClientClass ALSASeqUserClientClass;
+typedef struct _ALSASeqUserClientPrivate ALSASeqUserClientPrivate;
struct _ALSASeqUserClient {
GObject parent_instance;
+
+ ALSASeqUserClientPrivate *priv;
};
struct _ALSASeqUserClientClass {
ALSASeqUserClient *alsaseq_user_client_new();
+void alsaseq_user_client_open(ALSASeqUserClient *self, gint open_flag,
+ GError **error);
+
G_END_DECLS
#endif