// SPDX-License-Identifier: LGPL-3.0-or-later
#include "card.h"
+#include "query.h"
+#include "privates.h"
-G_DEFINE_TYPE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT)
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <sound/asound.h>
+
+struct _ALSACtlCardPrivate {
+ int fd;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(ALSACtlCard, alsactl_card, G_TYPE_OBJECT)
+
+static void ctl_card_finalize(GObject *obj)
+{
+ ALSACtlCard *self = ALSACTL_CARD(obj);
+ ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self);
+
+ if (priv->fd >= 0)
+ close(priv->fd);
+
+ G_OBJECT_CLASS(alsactl_card_parent_class)->finalize(obj);
+}
static void alsactl_card_class_init(ALSACtlCardClass *klass)
{
- return;
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->finalize = ctl_card_finalize;
}
static void alsactl_card_init(ALSACtlCard *self)
{
- return;
+ ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(self);
+
+ priv->fd = -1;
}
/**
{
return g_object_new(ALSACTL_TYPE_CARD, NULL);
}
+
+/**
+ * alsactl_card_open:
+ * @self: A #ALSACtlCard.
+ * @card_id: The numerical ID of sound card.
+ * @error: A #GError.
+ *
+ * Open ALSA control character device for the sound card.
+ */
+void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error)
+{
+ ALSACtlCardPrivate *priv;
+ char *devnode;
+
+ g_return_if_fail(ALSACTL_IS_CARD(self));
+ priv = alsactl_card_get_instance_private(self);
+
+ alsactl_get_control_devnode(card_id, &devnode, error);
+ if (*error != NULL)
+ return;
+
+ priv->fd = open(devnode, O_RDONLY | O_NONBLOCK);
+ if (priv->fd < 0)
+ generate_error(error, errno);
+
+ g_free(devnode);
+}
typedef struct _ALSACtlCard ALSACtlCard;
typedef struct _ALSACtlCardClass ALSACtlCardClass;
+typedef struct _ALSACtlCardPrivate ALSACtlCardPrivate;
struct _ALSACtlCard {
GObject parent_instance;
+
+ ALSACtlCardPrivate *priv;
};
struct _ALSACtlCardClass {
ALSACtlCard *alsactl_card_new();
+void alsactl_card_open(ALSACtlCard *self, guint card_id, GError **error);
+
G_END_DECLS
#endif