diff options
Diffstat (limited to 'backends/oss4/oss4-device.c')
-rw-r--r-- | backends/oss4/oss4-device.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/backends/oss4/oss4-device.c b/backends/oss4/oss4-device.c new file mode 100644 index 0000000..b68648b --- /dev/null +++ b/backends/oss4/oss4-device.c @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2014 Michal Ratajsky <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the licence, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <unistd.h> +#include <glib.h> +#include <glib/gi18n.h> +#include <glib/gstdio.h> +#include <glib-object.h> + +#include <libmatemixer/matemixer-device.h> +#include <libmatemixer/matemixer-enums.h> +#include <libmatemixer/matemixer-port.h> +#include <libmatemixer/matemixer-port-private.h> +#include <libmatemixer/matemixer-stream.h> +#include <libmatemixer/matemixer-stream-control.h> + +#include "oss4-common.h" +#include "oss4-device.h" + +#define OSS4_DEVICE_ICON "audio-card" + +struct _Oss4DevicePrivate +{ + gint fd; + gint index; + gchar *name; + gchar *description; + gchar *icon; + MateMixerStream *input; + MateMixerStream *output; +}; + +enum { + PROP_0, + PROP_NAME, + PROP_DESCRIPTION, + PROP_ICON, + PROP_ACTIVE_PROFILE, + PROP_FD, + PROP_INDEX +}; + +static void mate_mixer_device_interface_init (MateMixerDeviceInterface *iface); + +static void oss4_device_class_init (Oss4DeviceClass *klass); + +static void oss4_device_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); +static void oss4_device_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +static void oss4_device_init (Oss4Device *device); +static void oss4_device_finalize (GObject *object); + +G_DEFINE_TYPE_WITH_CODE (Oss4Device, oss4_device, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (MATE_MIXER_TYPE_DEVICE, + mate_mixer_device_interface_init)) + +static const gchar *oss4_device_get_name (MateMixerDevice *device); +static const gchar *oss4_device_get_description (MateMixerDevice *device); +static const gchar *oss4_device_get_icon (MateMixerDevice *device); + +static gboolean read_mixer_devices (Oss4Device *device); + +static void +mate_mixer_device_interface_init (MateMixerDeviceInterface *iface) +{ + iface->get_name = oss4_device_get_name; + iface->get_description = oss4_device_get_description; + iface->get_icon = oss4_device_get_icon; +} + +static void +oss4_device_class_init (Oss4DeviceClass *klass) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = oss4_device_finalize; + object_class->get_property = oss4_device_get_property; + object_class->set_property = oss4_device_set_property; + + g_object_class_install_property (object_class, + PROP_FD, + g_param_spec_int ("fd", + "File descriptor", + "File descriptor of the device", + G_MININT, + G_MAXINT, + -1, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_INDEX, + g_param_spec_int ("index", + "Index", + "Index of the device", + G_MININT, + G_MAXINT, + 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_override_property (object_class, PROP_NAME, "name"); + g_object_class_override_property (object_class, PROP_DESCRIPTION, "description"); + g_object_class_override_property (object_class, PROP_ICON, "icon"); + g_object_class_override_property (object_class, PROP_ACTIVE_PROFILE, "active-profile"); + + g_type_class_add_private (object_class, sizeof (Oss4DevicePrivate)); +} + +static void +oss4_device_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + Oss4Device *device; + + device = OSS4_DEVICE (object); + + switch (param_id) { + case PROP_NAME: + g_value_set_string (value, device->priv->name); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, device->priv->description); + break; + case PROP_ICON: + g_value_set_string (value, OSS4_DEVICE_ICON); + break; + case PROP_ACTIVE_PROFILE: + /* Not supported */ + g_value_set_object (value, NULL); + break; + case PROP_FD: + g_value_set_int (value, device->priv->fd); + break; + case PROP_INDEX: + g_value_set_int (value, device->priv->index); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +oss4_device_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + Oss4Device *device; + + device = OSS4_DEVICE (object); + + switch (param_id) { + case PROP_NAME: + /* Construct-only string */ + device->priv->name = g_strdup (g_value_get_string (value)); + break; + case PROP_DESCRIPTION: + /* Construct-only string */ + device->priv->description = g_strdup (g_value_get_string (value)); + break; + case PROP_ICON: + /* Construct-only string */ + device->priv->icon = g_strdup (g_value_get_string (value)); + break; + case PROP_FD: + device->priv->fd = dup (g_value_get_int (value)); + break; + case PROP_INDEX: + device->priv->index = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +oss4_device_init (Oss4Device *device) +{ + device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device, + OSS4_TYPE_DEVICE, + Oss4DevicePrivate); +} + +static void +oss4_device_finalize (GObject *object) +{ + Oss4Device *device; + + device = OSS4_DEVICE (object); + + g_free (device->priv->name); + g_free (device->priv->description); + + if (device->priv->fd != -1) + g_close (device->priv->fd, NULL); + + G_OBJECT_CLASS (oss4_device_parent_class)->finalize (object); +} + +Oss4Device * +oss4_device_new (const gchar *name, + const gchar *description, + gint fd, + gint index) +{ + Oss4Device *device; + + device = g_object_new (OSS4_TYPE_DEVICE, + "name", name, + "description", description, + "fd", fd, + "index", index, + NULL); + + return device; +} + +gboolean +oss4_device_read (Oss4Device *odevice) +{ + gint exts; + gint ret; + gint i; + + ret = ioctl (odevice->priv->fd, SNDCTL_MIX_NREXT, &exts); + if (ret == -1) + return FALSE; + + for (i = 0; i < exts; i++) { + oss_mixext ext; + + ext.dev = odevice->priv->index; + ext.ctrl = i; + ret = ioctl (odevice->priv->fd, SNDCTL_MIX_EXTINFO, &ext); + if (ret == -1) + continue; + + g_debug ("Mixer control %d type %d\n" + " min %d max %d\n" + " id %s\n" + " extname %s", + i,ext.type, ext.minvalue, ext.maxvalue, ext.id, ext.extname); + } + + return TRUE; +} + +gint +oss4_device_get_index (Oss4Device *odevice) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (odevice), FALSE); + + return odevice->priv->index; +} + +MateMixerStream * +oss4_device_get_input_stream (Oss4Device *odevice) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (odevice), FALSE); + + return odevice->priv->input; +} + +MateMixerStream * +oss4_device_get_output_stream (Oss4Device *odevice) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (odevice), FALSE); + + return odevice->priv->output; +} + +static gboolean +read_mixer_devices (Oss4Device *device) +{ +} + +static const gchar * +oss4_device_get_name (MateMixerDevice *device) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (device), NULL); + + return OSS4_DEVICE (device)->priv->name; +} + +static const gchar * +oss4_device_get_description (MateMixerDevice *device) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (device), NULL); + + return OSS4_DEVICE (device)->priv->description; +} + +static const gchar * +oss4_device_get_icon (MateMixerDevice *device) +{ + g_return_val_if_fail (OSS4_IS_DEVICE (device), NULL); + + return OSS4_DEVICE_ICON; +} |