summaryrefslogtreecommitdiffstats
path: root/sys/oss
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2006-08-16 09:25:17 +0000
committerWim Taymans <wim.taymans@gmail.com>2006-08-16 09:25:17 +0000
commitd5e01fa63fb85ce2a295efedefed81f66ff13a7a (patch)
tree5066aa578992fe869ad7d762e3e40df9f98906cd /sys/oss
parent38bb20d0ff50c4d8c21bc64925700f73f52c56c5 (diff)
sys/oss/: Small cleanups. Better error reporting.
Original commit message from CVS: * sys/oss/gstossmixer.c: (gst_ossmixer_open), (gst_ossmixer_new): * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), (gst_oss_mixer_element_init), (gst_oss_mixer_element_set_property), (gst_oss_mixer_element_get_property), (gst_oss_mixer_element_change_state): * sys/oss/gstossmixerelement.h: Small cleanups. Better error reporting. Add device property for the mixer instead of the hardcoded /dev/mixer. Fixes #350785. API: GstOssMixerElement::device property
Diffstat (limited to 'sys/oss')
-rw-r--r--sys/oss/gstossmixer.c52
-rw-r--r--sys/oss/gstossmixerelement.c56
-rw-r--r--sys/oss/gstossmixerelement.h1
3 files changed, 86 insertions, 23 deletions
diff --git a/sys/oss/gstossmixer.c b/sys/oss/gstossmixer.c
index a5c8a35b..e5630318 100644
--- a/sys/oss/gstossmixer.c
+++ b/sys/oss/gstossmixer.c
@@ -66,12 +66,8 @@ gst_ossmixer_open (GstOssMixer * mixer)
g_return_val_if_fail (mixer->mixer_fd == -1, FALSE);
mixer->mixer_fd = open (mixer->device, O_RDWR);
- if (mixer->mixer_fd == -1) {
- /* this is valid. OSS devices don't need to expose a mixer */
- GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s",
- mixer->device, strerror (errno));
- return FALSE;
- }
+ if (mixer->mixer_fd == -1)
+ goto open_failed;
/* get masks */
if (ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECMASK, &mixer->recmask) < 0
@@ -79,23 +75,40 @@ gst_ossmixer_open (GstOssMixer * mixer)
|| ioctl (mixer->mixer_fd, SOUND_MIXER_READ_STEREODEVS,
&mixer->stereomask) < 0
|| ioctl (mixer->mixer_fd, SOUND_MIXER_READ_DEVMASK, &mixer->devmask) < 0
- || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0) {
- GST_DEBUG ("Failed to get device masks");
- close (mixer->mixer_fd);
- mixer->mixer_fd = -1;
- return FALSE;
- }
+ || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0)
+ goto masks_failed;
- /* get name */
+ /* get name, not fatal */
+ g_free (mixer->cardname);
#ifdef SOUND_MIXER_INFO
if (ioctl (mixer->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) {
mixer->cardname = g_strdup (minfo.name);
- }
-#else
- oss->cardname = g_strdup ("Unknown");
+ GST_INFO ("Card name = %s", GST_STR_NULL (mixer->cardname));
+ } else
#endif
+ {
+ mixer->cardname = g_strdup ("Unknown");
+ GST_INFO ("Unknown card name");
+ }
+ GST_INFO ("Opened mixer for device %s", mixer->device);
return TRUE;
+
+ /* ERRORS */
+open_failed:
+ {
+ /* this is valid. OSS devices don't need to expose a mixer */
+ GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s",
+ mixer->device, strerror (errno));
+ return FALSE;
+ }
+masks_failed:
+ {
+ GST_DEBUG ("Failed to get device masks");
+ close (mixer->mixer_fd);
+ mixer->mixer_fd = -1;
+ return FALSE;
+ }
}
static void
@@ -166,11 +179,12 @@ gst_ossmixer_new (const char *device, GstOssMixerDirection dir)
return ret;
+ /* ERRORS */
error:
- if (ret)
+ {
gst_ossmixer_free (ret);
-
- return NULL;
+ return NULL;
+ }
}
void
diff --git a/sys/oss/gstossmixerelement.c b/sys/oss/gstossmixerelement.c
index 65c12a2d..24e58763 100644
--- a/sys/oss/gstossmixerelement.c
+++ b/sys/oss/gstossmixerelement.c
@@ -27,9 +27,14 @@
GST_DEBUG_CATEGORY_EXTERN (oss_debug);
#define GST_CAT_DEFAULT oss_debug
+#define DEFAULT_DEVICE "/dev/mixer"
+#define DEFAULT_DEVICE_NAME NULL
+
enum
{
- PROP_DEVICE_NAME = 1
+ PROP_0,
+ PROP_DEVICE,
+ PROP_DEVICE_NAME
};
@@ -49,6 +54,8 @@ GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssMixerElement, gst_oss_mixer_element);
static GstStateChangeReturn gst_oss_mixer_element_change_state (GstElement *
element, GstStateChange transition);
+static void gst_oss_mixer_element_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_oss_mixer_element_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec);
@@ -68,11 +75,18 @@ gst_oss_mixer_element_class_init (GstOssMixerElementClass * klass)
element_class = (GstElementClass *) klass;
gobject_class = (GObjectClass *) klass;
+ gobject_class->set_property = gst_oss_mixer_element_set_property;
gobject_class->get_property = gst_oss_mixer_element_get_property;
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device",
+ "OSS mixer device (usually /dev/mixer)", DEFAULT_DEVICE,
+ G_PARAM_READWRITE));
+
g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
g_param_spec_string ("device-name", "Device name",
- "Human-readable name of the sound device", "", G_PARAM_READABLE));
+ "Human-readable name of the sound device", DEFAULT_DEVICE_NAME,
+ G_PARAM_READABLE));
element_class->change_state =
GST_DEBUG_FUNCPTR (gst_oss_mixer_element_change_state);
@@ -83,6 +97,28 @@ gst_oss_mixer_element_init (GstOssMixerElement * this,
GstOssMixerElementClass * g_class)
{
this->mixer = NULL;
+ this->device = g_strdup (DEFAULT_DEVICE);
+}
+
+static void
+gst_oss_mixer_element_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_free (this->device);
+ this->device = g_value_dup_string (value);
+ /* make sure we never set NULL */
+ if (this->device == NULL) {
+ this->device = g_strdup (DEFAULT_DEVICE);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
@@ -92,6 +128,9 @@ gst_oss_mixer_element_get_property (GObject * object, guint prop_id,
GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object);
switch (prop_id) {
+ case PROP_DEVICE:
+ g_value_set_string (value, this->device);
+ break;
case PROP_DEVICE_NAME:
if (this->mixer) {
g_value_set_string (value, this->mixer->cardname);
@@ -115,7 +154,9 @@ gst_oss_mixer_element_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
if (!this->mixer) {
- this->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_ALL);
+ this->mixer = gst_ossmixer_new (this->device, GST_OSS_MIXER_ALL);
+ if (!this->mixer)
+ goto open_failed;
}
break;
break;
@@ -137,6 +178,13 @@ gst_oss_mixer_element_change_state (GstElement * element,
default:
break;
}
-
return ret;
+
+ /* ERRORS */
+open_failed:
+ {
+ GST_ELEMENT_ERROR (element, RESOURCE, OPEN_READ_WRITE, (NULL),
+ ("Failed to open oss mixer device '%s'", this->device));
+ return GST_STATE_CHANGE_FAILURE;
+ }
}
diff --git a/sys/oss/gstossmixerelement.h b/sys/oss/gstossmixerelement.h
index 3770c196..2d47e0ec 100644
--- a/sys/oss/gstossmixerelement.h
+++ b/sys/oss/gstossmixerelement.h
@@ -41,6 +41,7 @@ typedef struct _GstOssMixerElementClass GstOssMixerElementClass;
struct _GstOssMixerElement {
GstElement parent;
+ gchar *device;
GstOssMixer *mixer;
};