summaryrefslogtreecommitdiffstats
path: root/sys/oss/gstosselement.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/oss/gstosselement.c')
-rw-r--r--sys/oss/gstosselement.c570
1 files changed, 279 insertions, 291 deletions
diff --git a/sys/oss/gstosselement.c b/sys/oss/gstosselement.c
index 7dfac627..56dd20da 100644
--- a/sys/oss/gstosselement.c
+++ b/sys/oss/gstosselement.c
@@ -39,7 +39,8 @@
#include "gstosselement.h"
#include "gstossmixer.h"
-enum {
+enum
+{
ARG_0,
ARG_DEVICE,
ARG_MIXERDEV,
@@ -47,49 +48,45 @@ enum {
};
/* elementfactory information */
-static GstElementDetails gst_osselement_details = GST_ELEMENT_DETAILS (
- "Audio Mixer (OSS)",
- "Generic/Audio",
- "OSS-based mixer element",
- "Ronald Bultje <rbultje@ronald.bitfreak.net>"
-);
-
-static void gst_osselement_base_init (GstOssElementClass *klass);
-static void gst_osselement_class_init (GstOssElementClass *klass);
-
-static void gst_ossprobe_interface_init (GstPropertyProbeInterface *iface);
-static void gst_osselement_init (GstOssElement *oss);
-static void gst_osselement_dispose (GObject *object);
-
-static void gst_osselement_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gst_osselement_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static GstElementStateReturn gst_osselement_change_state (GstElement *element);
+static GstElementDetails gst_osselement_details =
+GST_ELEMENT_DETAILS ("Audio Mixer (OSS)",
+ "Generic/Audio",
+ "OSS-based mixer element",
+ "Ronald Bultje <rbultje@ronald.bitfreak.net>");
+
+static void gst_osselement_base_init (GstOssElementClass * klass);
+static void gst_osselement_class_init (GstOssElementClass * klass);
+
+static void gst_ossprobe_interface_init (GstPropertyProbeInterface * iface);
+static void gst_osselement_init (GstOssElement * oss);
+static void gst_osselement_dispose (GObject * object);
+
+static void gst_osselement_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_osselement_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static GstElementStateReturn gst_osselement_change_state (GstElement * element);
static GstElementClass *parent_class = NULL;
+
/*static guint gst_osssrc_signals[LAST_SIGNAL] = { 0 }; */
GType
-gst_osselement_get_type (void)
+gst_osselement_get_type (void)
{
static GType osselement_type = 0;
if (!osselement_type) {
static const GTypeInfo osselement_info = {
- sizeof(GstOssElementClass),
- (GBaseInitFunc)gst_osselement_base_init,
+ sizeof (GstOssElementClass),
+ (GBaseInitFunc) gst_osselement_base_init,
NULL,
- (GClassInitFunc)gst_osselement_class_init,
+ (GClassInitFunc) gst_osselement_class_init,
NULL,
NULL,
- sizeof(GstOssElement),
+ sizeof (GstOssElement),
0,
- (GInstanceInitFunc)gst_osselement_init
+ (GInstanceInitFunc) gst_osselement_init
};
static const GInterfaceInfo ossiface_info = {
(GInterfaceInitFunc) gst_oss_interface_init,
@@ -108,24 +105,20 @@ gst_osselement_get_type (void)
};
osselement_type = g_type_register_static (GST_TYPE_ELEMENT,
- "GstOssElement",
- &osselement_info, 0);
+ "GstOssElement", &osselement_info, 0);
g_type_add_interface_static (osselement_type,
- GST_TYPE_IMPLEMENTS_INTERFACE,
- &ossiface_info);
+ GST_TYPE_IMPLEMENTS_INTERFACE, &ossiface_info);
g_type_add_interface_static (osselement_type,
- GST_TYPE_MIXER,
- &ossmixer_info);
+ GST_TYPE_MIXER, &ossmixer_info);
g_type_add_interface_static (osselement_type,
- GST_TYPE_PROPERTY_PROBE,
- &ossprobe_info);
+ GST_TYPE_PROPERTY_PROBE, &ossprobe_info);
}
return osselement_type;
}
static void
-gst_osselement_base_init (GstOssElementClass *klass)
+gst_osselement_base_init (GstOssElementClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
@@ -135,36 +128,36 @@ gst_osselement_base_init (GstOssElementClass *klass)
}
static void
-gst_osselement_class_init (GstOssElementClass *klass)
+gst_osselement_class_init (GstOssElementClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
- gobject_class = (GObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DEVICE,
- g_param_spec_string ("device", "Device", "OSS device (/dev/dspN usually)",
- "default", G_PARAM_READWRITE));
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MIXERDEV,
- g_param_spec_string ("mixerdev", "Mixer device",
- "OSS mixer device (/dev/mixerN usually)",
- "default", G_PARAM_READWRITE));
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DEVICE_NAME,
- g_param_spec_string ("device_name", "Device name", "Name of the device",
- NULL, G_PARAM_READABLE));
-
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE,
+ g_param_spec_string ("device", "Device", "OSS device (/dev/dspN usually)",
+ "default", G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MIXERDEV,
+ g_param_spec_string ("mixerdev", "Mixer device",
+ "OSS mixer device (/dev/mixerN usually)",
+ "default", G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE_NAME,
+ g_param_spec_string ("device_name", "Device name", "Name of the device",
+ NULL, G_PARAM_READABLE));
+
gobject_class->set_property = gst_osselement_set_property;
gobject_class->get_property = gst_osselement_get_property;
- gobject_class->dispose = gst_osselement_dispose;
+ gobject_class->dispose = gst_osselement_dispose;
gstelement_class->change_state = gst_osselement_change_state;
}
static const GList *
-gst_ossprobe_get_properties (GstPropertyProbe *probe)
+gst_ossprobe_get_properties (GstPropertyProbe * probe)
{
GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
static GList *list = NULL;
@@ -180,10 +173,8 @@ gst_ossprobe_get_properties (GstPropertyProbe *probe)
#define MAX_OSS_DEVICES 16
static void
-gst_osselement_probe (gchar *device_base,
- gint device_num,
- gchar **name,
- dev_t *devno)
+gst_osselement_probe (gchar * device_base,
+ gint device_num, gchar ** name, dev_t * devno)
{
gchar *device = NULL;
struct stat s;
@@ -208,22 +199,22 @@ gst_osselement_probe (gchar *device_base,
*name = device;
*devno = s.st_rdev;
- return;
+ return;
end:
g_free (device);
}
-static GList*
-device_combination_append (GList *device_combinations,
- GstOssDeviceCombination *combi)
+static GList *
+device_combination_append (GList * device_combinations,
+ GstOssDeviceCombination * combi)
{
GList *it;
for (it = device_combinations; it != NULL; it = it->next) {
GstOssDeviceCombination *cur;
- cur = (GstOssDeviceCombination*)it->data;
+ cur = (GstOssDeviceCombination *) it->data;
if (cur->dev == combi->dev) {
return device_combinations;
}
@@ -233,8 +224,7 @@ device_combination_append (GList *device_combinations,
}
static gboolean
-gst_osselement_class_probe_devices (GstOssElementClass *klass,
- gboolean check)
+gst_osselement_class_probe_devices (GstOssElementClass * klass, gboolean check)
{
GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
static gboolean init = FALSE;
@@ -249,6 +239,7 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass,
padtempllist = gst_element_class_get_pad_template_list (eklass);
if (padtempllist != NULL) {
GstPadTemplate *firstpadtempl = padtempllist->data;
+
if (GST_PAD_TEMPLATE_DIRECTION (firstpadtempl) == GST_PAD_SINK) {
openmode = O_WRONLY;
}
@@ -258,9 +249,12 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass,
if (!init && !check) {
#define MIXER 0
#define DSP 1
- gchar *dev_base[][2] = { {"/dev/mixer", "/dev/dsp"},
- {"/dev/sound/mixer", "/dev/sound/dsp"},
- {NULL, NULL}};
+ gchar *dev_base[][2] = { {"/dev/mixer", "/dev/dsp"}
+ ,
+ {"/dev/sound/mixer", "/dev/sound/dsp"}
+ ,
+ {NULL, NULL}
+ };
gint n;
gint base;
@@ -285,36 +279,36 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass,
dev_t dsp_dev;
dev_t mixer_dev;
- gst_osselement_probe (dev_base[base][DSP], n, &dsp, &dsp_dev);
+ gst_osselement_probe (dev_base[base][DSP], n, &dsp, &dsp_dev);
if (dsp == NULL) {
continue;
}
gst_osselement_probe (dev_base[base][MIXER], n, &mixer, &mixer_dev);
/* does the device exist (can we open them)? */
-
+
/* we just check the dsp. we assume the mixer always works.
* we don't need a mixer anyway (says OSS)... If we are a
* mixer element, we use the mixer anyway. */
if ((fd = open (mixer ? mixer :
- dsp, openmode | O_NONBLOCK)) > 0 || errno == EBUSY) {
+ dsp, openmode | O_NONBLOCK)) > 0 || errno == EBUSY) {
GstOssDeviceCombination *combi;
-
+
if (fd > 0)
close (fd);
-
+
/* yay! \o/ */
combi = g_new0 (GstOssDeviceCombination, 1);
- combi->dsp = dsp;
+ combi->dsp = dsp;
combi->mixer = mixer;
device_combinations = device_combination_append (device_combinations,
- combi);
+ combi);
} else {
g_free (dsp);
g_free (mixer);
}
}
}
-
+
init = TRUE;
}
@@ -324,7 +318,7 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass,
}
static GValueArray *
-gst_osselement_class_list_devices (GstOssElementClass *klass)
+gst_osselement_class_list_devices (GstOssElementClass * klass)
{
GValueArray *array;
GValue value = { 0 };
@@ -350,9 +344,8 @@ gst_osselement_class_list_devices (GstOssElementClass *klass)
}
static void
-gst_ossprobe_probe_property (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
+gst_ossprobe_probe_property (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
{
GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe);
@@ -367,9 +360,8 @@ gst_ossprobe_probe_property (GstPropertyProbe *probe,
}
static gboolean
-gst_ossprobe_needs_probe (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
+gst_ossprobe_needs_probe (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
{
GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe);
gboolean ret = FALSE;
@@ -387,9 +379,8 @@ gst_ossprobe_needs_probe (GstPropertyProbe *probe,
}
static GValueArray *
-gst_ossprobe_get_values (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
+gst_ossprobe_get_values (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
{
GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe);
GValueArray *array = NULL;
@@ -407,16 +398,16 @@ gst_ossprobe_get_values (GstPropertyProbe *probe,
}
static void
-gst_ossprobe_interface_init (GstPropertyProbeInterface *iface)
+gst_ossprobe_interface_init (GstPropertyProbeInterface * iface)
{
iface->get_properties = gst_ossprobe_get_properties;
iface->probe_property = gst_ossprobe_probe_property;
- iface->needs_probe = gst_ossprobe_needs_probe;
- iface->get_values = gst_ossprobe_get_values;
+ iface->needs_probe = gst_ossprobe_needs_probe;
+ iface->get_values = gst_ossprobe_get_values;
}
-static void
-gst_osselement_init (GstOssElement *oss)
+static void
+gst_osselement_init (GstOssElement * oss)
{
oss->device = g_strdup ("/dev/dsp");
oss->mixer_dev = g_strdup ("/dev/mixer");
@@ -429,7 +420,7 @@ gst_osselement_init (GstOssElement *oss)
}
static void
-gst_osselement_dispose (GObject *object)
+gst_osselement_dispose (GObject * object)
{
GstOssElement *oss = (GstOssElement *) object;
@@ -439,8 +430,8 @@ gst_osselement_dispose (GObject *object)
G_OBJECT_CLASS (parent_class)->dispose (object);
}
-void
-gst_osselement_reset (GstOssElement *oss)
+void
+gst_osselement_reset (GstOssElement * oss)
{
oss->law = 0;
oss->endianness = G_BYTE_ORDER;
@@ -457,14 +448,14 @@ gst_osselement_reset (GstOssElement *oss)
oss->format = AFMT_S16_BE;
#else
oss->format = AFMT_S16_LE;
-#endif /* WORDS_BIGENDIAN */
+#endif /* WORDS_BIGENDIAN */
}
-static gboolean
-gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint depth,
- gint *format, gint *bps)
+static gboolean
+gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width,
+ gint depth, gint * format, gint * bps)
{
- if (width != depth)
+ if (width != depth)
return FALSE;
*bps = 1;
@@ -472,52 +463,39 @@ gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint de
if (law == 0) {
if (width == 16) {
if (sign == TRUE) {
- if (endianness == G_LITTLE_ENDIAN) {
+ if (endianness == G_LITTLE_ENDIAN) {
*format = AFMT_S16_LE;
- GST_DEBUG (
- "16 bit signed LE, no law (%d)", *format);
- }
- else if (endianness == G_BIG_ENDIAN) {
+ GST_DEBUG ("16 bit signed LE, no law (%d)", *format);
+ } else if (endianness == G_BIG_ENDIAN) {
*format = AFMT_S16_BE;
- GST_DEBUG (
- "16 bit signed BE, no law (%d)", *format);
+ GST_DEBUG ("16 bit signed BE, no law (%d)", *format);
}
- }
- else {
- if (endianness == G_LITTLE_ENDIAN) {
+ } else {
+ if (endianness == G_LITTLE_ENDIAN) {
*format = AFMT_U16_LE;
- GST_DEBUG (
- "16 bit unsigned LE, no law (%d)", *format);
- }
- else if (endianness == G_BIG_ENDIAN) {
+ GST_DEBUG ("16 bit unsigned LE, no law (%d)", *format);
+ } else if (endianness == G_BIG_ENDIAN) {
*format = AFMT_U16_BE;
- GST_DEBUG (
- "16 bit unsigned BE, no law (%d)", *format);
+ GST_DEBUG ("16 bit unsigned BE, no law (%d)", *format);
}
}
*bps = 2;
- }
- else if (width == 8) {
+ } else if (width == 8) {
if (sign == TRUE) {
*format = AFMT_S8;
- GST_DEBUG (
- "8 bit signed, no law (%d)", *format);
- }
- else {
- *format = AFMT_U8;
- GST_DEBUG (
- "8 bit unsigned, no law (%d)", *format);
+ GST_DEBUG ("8 bit signed, no law (%d)", *format);
+ } else {
+ *format = AFMT_U8;
+ GST_DEBUG ("8 bit unsigned, no law (%d)", *format);
}
*bps = 1;
}
} else if (law == 1) {
*format = AFMT_MU_LAW;
- GST_DEBUG (
- "mu law (%d)", *format);
+ GST_DEBUG ("mu law (%d)", *format);
} else if (law == 2) {
*format = AFMT_A_LAW;
- GST_DEBUG (
- "a law (%d)", *format);
+ GST_DEBUG ("a law (%d)", *format);
} else {
g_critical ("unknown law");
return FALSE;
@@ -526,34 +504,33 @@ gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint de
return TRUE;
}
-gboolean
-gst_osselement_parse_caps (GstOssElement *oss, const GstCaps *caps)
+gboolean
+gst_osselement_parse_caps (GstOssElement * oss, const GstCaps * caps)
{
gint bps, format;
GstStructure *structure;
structure = gst_caps_get_structure (caps, 0);
- gst_structure_get_int (structure, "width", &oss->width);
- gst_structure_get_int (structure, "depth", &oss->depth);
-
- if (oss->width != oss->depth)
+ gst_structure_get_int (structure, "width", &oss->width);
+ gst_structure_get_int (structure, "depth", &oss->depth);
+
+ if (oss->width != oss->depth)
+ return FALSE;
+
+ gst_structure_get_int (structure, "law", &oss->law);
+ gst_structure_get_int (structure, "endianness", &oss->endianness);
+ gst_structure_get_boolean (structure, "signed", &oss->sign);
+
+ if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign,
+ oss->width, oss->depth, &format, &bps)) {
+ GST_DEBUG ("could not get format");
return FALSE;
-
- gst_structure_get_int (structure, "law", &oss->law);
- gst_structure_get_int (structure, "endianness", &oss->endianness);
- gst_structure_get_boolean (structure, "signed", &oss->sign);
-
- if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign,
- oss->width, oss->depth, &format, &bps))
- {
- GST_DEBUG ("could not get format");
- return FALSE;
}
- gst_structure_get_int (structure, "channels", &oss->channels);
- gst_structure_get_int (structure, "rate", &oss->rate);
-
+ gst_structure_get_int (structure, "channels", &oss->channels);
+ gst_structure_get_int (structure, "rate", &oss->rate);
+
oss->bps = bps * oss->channels * oss->rate;
oss->format = format;
@@ -571,38 +548,37 @@ G_STMT_START { \
gst_structure_get_boolean (structure, name, dest); \
} G_STMT_END
-gboolean
-gst_osselement_merge_fixed_caps (GstOssElement *oss, GstCaps *caps)
+gboolean
+gst_osselement_merge_fixed_caps (GstOssElement * oss, GstCaps * caps)
{
gint bps, format;
GstStructure *structure;
structure = gst_caps_get_structure (caps, 0);
-
+
/* peel off fixed stuff from the caps */
- gst_structure_get_int (structure, "law", &oss->law);
+ gst_structure_get_int (structure, "law", &oss->law);
gst_structure_get_int (structure, "endianness", &oss->endianness);
- gst_structure_get_boolean (structure, "signed", &oss->sign);
- gst_structure_get_int (structure, "width", &oss->width);
- gst_structure_get_int (structure, "depth", &oss->depth);
-
- if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign,
- oss->width, oss->depth, &format, &bps))
- {
- return FALSE;
+ gst_structure_get_boolean (structure, "signed", &oss->sign);
+ gst_structure_get_int (structure, "width", &oss->width);
+ gst_structure_get_int (structure, "depth", &oss->depth);
+
+ if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign,
+ oss->width, oss->depth, &format, &bps)) {
+ return FALSE;
}
- gst_structure_get_int (structure, "rate", &oss->rate);
- gst_structure_get_int (structure, "channels", &oss->channels);
-
+ gst_structure_get_int (structure, "rate", &oss->rate);
+ gst_structure_get_int (structure, "channels", &oss->channels);
+
oss->bps = bps * oss->channels * oss->rate;
oss->format = format;
-
+
return TRUE;
}
-gboolean
-gst_osselement_sync_parms (GstOssElement *oss)
+gboolean
+gst_osselement_sync_parms (GstOssElement * oss)
{
audio_buf_info space;
int frag;
@@ -613,33 +589,32 @@ gst_osselement_sync_parms (GstOssElement *oss)
if (oss->fd == -1)
return FALSE;
-
+
if (oss->fragment >> 16)
frag = oss->fragment;
else
frag = 0x7FFF0000 | oss->fragment;
-
- GST_INFO ("osselement: setting sound card to %dHz %d format %s (%08x fragment)",
- oss->rate, oss->format,
- (oss->channels == 2) ? "stereo" : "mono", frag);
+
+ GST_INFO
+ ("osselement: setting sound card to %dHz %d format %s (%08x fragment)",
+ oss->rate, oss->format, (oss->channels == 2) ? "stereo" : "mono", frag);
ioctl (oss->fd, SNDCTL_DSP_SETFRAGMENT, &frag);
ioctl (oss->fd, SNDCTL_DSP_RESET, 0);
- target_format = oss->format;
+ target_format = oss->format;
target_channels = oss->channels;
- target_rate = oss->rate;
+ target_rate = oss->rate;
- ioctl (oss->fd, SNDCTL_DSP_SETFMT, &oss->format);
+ ioctl (oss->fd, SNDCTL_DSP_SETFMT, &oss->format);
ioctl (oss->fd, SNDCTL_DSP_CHANNELS, &oss->channels);
- ioctl (oss->fd, SNDCTL_DSP_SPEED, &oss->rate);
+ ioctl (oss->fd, SNDCTL_DSP_SPEED, &oss->rate);
ioctl (oss->fd, SNDCTL_DSP_GETBLKSIZE, &oss->fragment_size);
if (oss->mode == GST_OSSELEMENT_WRITE) {
ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &space);
- }
- else {
+ } else {
ioctl (oss->fd, SNDCTL_DSP_GETISPACE, &space);
}
@@ -651,25 +626,26 @@ gst_osselement_sync_parms (GstOssElement *oss)
frag_ln++;
}
oss->fragment = space.fragstotal << 16 | frag_ln;
-
+
GST_INFO ("osselement: set sound card to %dHz, %d format, %s "
- "(%d bytes buffer, %08x fragment)",
- oss->rate, oss->format,
- (oss->channels == 2) ? "stereo" : "mono",
- space.bytes, oss->fragment);
+ "(%d bytes buffer, %08x fragment)",
+ oss->rate, oss->format,
+ (oss->channels == 2) ? "stereo" : "mono", space.bytes, oss->fragment);
oss->fragment_time = (GST_SECOND * oss->fragment_size) / oss->bps;
- GST_INFO ("fragment time %u %" G_GUINT64_FORMAT "\n",
- oss->bps, oss->fragment_time);
+ GST_INFO ("fragment time %u %" G_GUINT64_FORMAT "\n",
+ oss->bps, oss->fragment_time);
- if (target_format != oss->format ||
- target_channels != oss->channels ||
- target_rate != oss->rate)
- {
+ if (target_format != oss->format ||
+ target_channels != oss->channels || target_rate != oss->rate) {
if (target_channels != oss->channels)
- g_warning ("couldn't set the right number of channels (wanted %d, got %d), enjoy the tone difference", target_channels, oss->channels);
+ g_warning
+ ("couldn't set the right number of channels (wanted %d, got %d), enjoy the tone difference",
+ target_channels, oss->channels);
if (target_rate != oss->rate)
- g_warning ("couldn't set the right sample rate (wanted %d, got %d), enjoy the speed difference", target_rate, oss->rate);
+ g_warning
+ ("couldn't set the right sample rate (wanted %d, got %d), enjoy the speed difference",
+ target_rate, oss->rate);
if (target_format != oss->format)
g_warning ("couldn't set requested OSS format, enjoy the noise :)");
/* we could eventually return FALSE here, or just do some additional tests
@@ -679,7 +655,7 @@ gst_osselement_sync_parms (GstOssElement *oss)
}
static gboolean
-gst_osselement_open_audio (GstOssElement *oss)
+gst_osselement_open_audio (GstOssElement * oss)
{
gint caps;
GstOssOpenMode mode = GST_OSSELEMENT_READ;
@@ -693,6 +669,7 @@ gst_osselement_open_audio (GstOssElement *oss)
padlist = gst_element_get_pad_list (GST_ELEMENT (oss));
if (padlist != NULL) {
GstPad *firstpad = padlist->data;
+
if (GST_PAD_IS_SINK (firstpad)) {
mode = GST_OSSELEMENT_WRITE;
}
@@ -708,12 +685,11 @@ gst_osselement_open_audio (GstOssElement *oss)
if (oss->fd >= 0) {
close (oss->fd);
-
+
/* re-open the sound device in blocking mode */
oss->fd = open (oss->device, O_WRONLY);
}
- }
- else {
+ } else {
oss->fd = open (oss->device, O_RDONLY);
}
@@ -721,37 +697,37 @@ gst_osselement_open_audio (GstOssElement *oss)
switch (errno) {
case EBUSY:
GST_ELEMENT_ERROR (oss, RESOURCE, BUSY,
- (_("OSS device \"%s\" is already in use by another program."), oss->device),
- (NULL));
+ (_("OSS device \"%s\" is already in use by another program."),
+ oss->device), (NULL));
break;
case EACCES:
case ETXTBSY:
- if (mode == GST_OSSELEMENT_WRITE)
+ if (mode == GST_OSSELEMENT_WRITE)
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE,
- (_("Could not access device \"%s\", check its permissions."), oss->device),
- GST_ERROR_SYSTEM);
- else
+ (_("Could not access device \"%s\", check its permissions."),
+ oss->device), GST_ERROR_SYSTEM);
+ else
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ,
- (_("Could not access device \"%s\", check its permissions."), oss->device),
- GST_ERROR_SYSTEM);
+ (_("Could not access device \"%s\", check its permissions."),
+ oss->device), GST_ERROR_SYSTEM);
break;
case ENXIO:
case ENODEV:
case ENOENT:
GST_ELEMENT_ERROR (oss, RESOURCE, NOT_FOUND,
- (_("Device \"%s\" does not exist."), oss->device),
- GST_ERROR_SYSTEM);
+ (_("Device \"%s\" does not exist."), oss->device),
+ GST_ERROR_SYSTEM);
break;
default:
/* FIXME: strerror is not threadsafe */
- if (mode == GST_OSSELEMENT_WRITE)
+ if (mode == GST_OSSELEMENT_WRITE)
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE,
- (_("Could not open device \"%s\" for writing."), oss->device),
- GST_ERROR_SYSTEM);
- else
+ (_("Could not open device \"%s\" for writing."), oss->device),
+ GST_ERROR_SYSTEM);
+ else
GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ,
- (_("Could not open device \"%s\" for reading."), oss->device),
- GST_ERROR_SYSTEM);
+ (_("Could not open device \"%s\" for reading."), oss->device),
+ GST_ERROR_SYSTEM);
break;
}
return FALSE;
@@ -765,40 +741,58 @@ gst_osselement_open_audio (GstOssElement *oss)
GST_INFO ("osselement: Capabilities %08x", caps);
- if (caps & DSP_CAP_DUPLEX) GST_INFO ( "osselement: Full duplex");
- if (caps & DSP_CAP_REALTIME) GST_INFO ( "osselement: Realtime");
- if (caps & DSP_CAP_BATCH) GST_INFO ( "osselement: Batch");
- if (caps & DSP_CAP_COPROC) GST_INFO ( "osselement: Has coprocessor");
- if (caps & DSP_CAP_TRIGGER) GST_INFO ( "osselement: Trigger");
- if (caps & DSP_CAP_MMAP) GST_INFO ( "osselement: Direct access");
+ if (caps & DSP_CAP_DUPLEX)
+ GST_INFO ("osselement: Full duplex");
+ if (caps & DSP_CAP_REALTIME)
+ GST_INFO ("osselement: Realtime");
+ if (caps & DSP_CAP_BATCH)
+ GST_INFO ("osselement: Batch");
+ if (caps & DSP_CAP_COPROC)
+ GST_INFO ("osselement: Has coprocessor");
+ if (caps & DSP_CAP_TRIGGER)
+ GST_INFO ("osselement: Trigger");
+ if (caps & DSP_CAP_MMAP)
+ GST_INFO ("osselement: Direct access");
#ifdef DSP_CAP_MULTI
- if (caps & DSP_CAP_MULTI) GST_INFO ( "osselement: Multiple open");
+ if (caps & DSP_CAP_MULTI)
+ GST_INFO ("osselement: Multiple open");
#endif /* DSP_CAP_MULTI */
#ifdef DSP_CAP_BIND
- if (caps & DSP_CAP_BIND) GST_INFO ( "osselement: Channel binding");
+ if (caps & DSP_CAP_BIND)
+ GST_INFO ("osselement: Channel binding");
#endif /* DSP_CAP_BIND */
- ioctl(oss->fd, SNDCTL_DSP_GETFMTS, &caps);
-
- GST_INFO ( "osselement: Formats %08x", caps);
- if (caps & AFMT_MU_LAW) GST_INFO ( "osselement: MU_LAW");
- if (caps & AFMT_A_LAW) GST_INFO ( "osselement: A_LAW");
- if (caps & AFMT_IMA_ADPCM) GST_INFO ( "osselement: IMA_ADPCM");
- if (caps & AFMT_U8) GST_INFO ( "osselement: U8");
- if (caps & AFMT_S16_LE) GST_INFO ( "osselement: S16_LE");
- if (caps & AFMT_S16_BE) GST_INFO ( "osselement: S16_BE");
- if (caps & AFMT_S8) GST_INFO ( "osselement: S8");
- if (caps & AFMT_U16_LE) GST_INFO ( "osselement: U16_LE");
- if (caps & AFMT_U16_BE) GST_INFO ( "osselement: U16_BE");
- if (caps & AFMT_MPEG) GST_INFO ( "osselement: MPEG");
+ ioctl (oss->fd, SNDCTL_DSP_GETFMTS, &caps);
+
+ GST_INFO ("osselement: Formats %08x", caps);
+ if (caps & AFMT_MU_LAW)
+ GST_INFO ("osselement: MU_LAW");
+ if (caps & AFMT_A_LAW)
+ GST_INFO ("osselement: A_LAW");
+ if (caps & AFMT_IMA_ADPCM)
+ GST_INFO ("osselement: IMA_ADPCM");
+ if (caps & AFMT_U8)
+ GST_INFO ("osselement: U8");
+ if (caps & AFMT_S16_LE)
+ GST_INFO ("osselement: S16_LE");
+ if (caps & AFMT_S16_BE)
+ GST_INFO ("osselement: S16_BE");
+ if (caps & AFMT_S8)
+ GST_INFO ("osselement: S8");
+ if (caps & AFMT_U16_LE)
+ GST_INFO ("osselement: U16_LE");
+ if (caps & AFMT_U16_BE)
+ GST_INFO ("osselement: U16_BE");
+ if (caps & AFMT_MPEG)
+ GST_INFO ("osselement: MPEG");
#ifdef AFMT_AC3
- if (caps & AFMT_AC3) GST_INFO ( "osselement: AC3");
+ if (caps & AFMT_AC3)
+ GST_INFO ("osselement: AC3");
#endif
- GST_INFO ("osselement: opened audio (%s) with fd=%d",
- oss->device, oss->fd);
+ GST_INFO ("osselement: opened audio (%s) with fd=%d", oss->device, oss->fd);
oss->caps = caps;
@@ -809,23 +803,21 @@ do_mixer:
}
static void
-gst_osselement_close_audio (GstOssElement *oss)
+gst_osselement_close_audio (GstOssElement * oss)
{
gst_ossmixer_free_list (oss);
- if (oss->fd < 0)
+ if (oss->fd < 0)
return;
- close(oss->fd);
+ close (oss->fd);
oss->fd = -1;
}
gboolean
-gst_osselement_convert (GstOssElement *oss,
- GstFormat src_format,
- gint64 src_value,
- GstFormat *dest_format,
- gint64 *dest_value)
+gst_osselement_convert (GstOssElement * oss,
+ GstFormat src_format,
+ gint64 src_value, GstFormat * dest_format, gint64 * dest_value)
{
gboolean res = TRUE;
@@ -840,38 +832,38 @@ gst_osselement_convert (GstOssElement *oss,
switch (src_format) {
case GST_FORMAT_BYTES:
switch (*dest_format) {
- case GST_FORMAT_TIME:
+ case GST_FORMAT_TIME:
*dest_value = src_value * GST_SECOND / oss->bps;
- break;
- case GST_FORMAT_DEFAULT:
+ break;
+ case GST_FORMAT_DEFAULT:
*dest_value = src_value / (oss->width * oss->channels / 8);
- break;
- default:
- res = FALSE;
+ break;
+ default:
+ res = FALSE;
}
break;
case GST_FORMAT_TIME:
switch (*dest_format) {
- case GST_FORMAT_BYTES:
+ case GST_FORMAT_BYTES:
*dest_value = src_value * oss->bps / GST_SECOND;
- break;
- case GST_FORMAT_DEFAULT:
+ break;
+ case GST_FORMAT_DEFAULT:
*dest_value = src_value * oss->rate / GST_SECOND;
- break;
- default:
- res = FALSE;
+ break;
+ default:
+ res = FALSE;
}
break;
case GST_FORMAT_DEFAULT:
switch (*dest_format) {
- case GST_FORMAT_TIME:
+ case GST_FORMAT_TIME:
*dest_value = src_value * GST_SECOND / oss->rate;
- break;
- case GST_FORMAT_BYTES:
+ break;
+ case GST_FORMAT_BYTES:
*dest_value = src_value * oss->width * oss->channels / 8;
- break;
- default:
- res = FALSE;
+ break;
+ default:
+ res = FALSE;
}
break;
default:
@@ -881,11 +873,9 @@ gst_osselement_convert (GstOssElement *oss,
return res;
}
-static void
-gst_osselement_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+static void
+gst_osselement_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
{
GstOssElement *oss = GST_OSSELEMENT (object);
@@ -894,34 +884,34 @@ gst_osselement_set_property (GObject *object,
/* disallow changing the device while it is opened
get_property("device") should return the right one */
if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) {
- g_free (oss->device);
- oss->device = g_strdup (g_value_get_string (value));
+ g_free (oss->device);
+ oss->device = g_strdup (g_value_get_string (value));
- /* let's assume that if we have a device map for the mixer,
+ /* let's assume that if we have a device map for the mixer,
* we're allowed to do all that automagically here */
- if (GST_OSSELEMENT_GET_CLASS (oss)->device_combinations != NULL) {
- GList *list = GST_OSSELEMENT_GET_CLASS (oss)->device_combinations;
+ if (GST_OSSELEMENT_GET_CLASS (oss)->device_combinations != NULL) {
+ GList *list = GST_OSSELEMENT_GET_CLASS (oss)->device_combinations;
- while (list) {
- GstOssDeviceCombination *combi = list->data;
+ while (list) {
+ GstOssDeviceCombination *combi = list->data;
- if (!strcmp (combi->dsp, oss->device)) {
- g_free (oss->mixer_dev);
- oss->mixer_dev = g_strdup (combi->mixer);
- break;
- }
+ if (!strcmp (combi->dsp, oss->device)) {
+ g_free (oss->mixer_dev);
+ oss->mixer_dev = g_strdup (combi->mixer);
+ break;
+ }
- list = list->next;
- }
- }
+ list = list->next;
+ }
+ }
}
break;
case ARG_MIXERDEV:
/* disallow changing the device while it is opened
get_property("mixerdev") should return the right one */
if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) {
- g_free (oss->mixer_dev);
- oss->mixer_dev = g_strdup (g_value_get_string (value));
+ g_free (oss->mixer_dev);
+ oss->mixer_dev = g_strdup (g_value_get_string (value));
}
break;
default:
@@ -929,11 +919,9 @@ gst_osselement_set_property (GObject *object,
}
}
-static void
-gst_osselement_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+static void
+gst_osselement_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
{
GstOssElement *oss = GST_OSSELEMENT (object);
@@ -953,15 +941,15 @@ gst_osselement_get_property (GObject *object,
}
}
-static GstElementStateReturn
-gst_osselement_change_state (GstElement *element)
+static GstElementStateReturn
+gst_osselement_change_state (GstElement * element)
{
GstOssElement *oss = GST_OSSELEMENT (element);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
if (!gst_osselement_open_audio (oss)) {
- return GST_STATE_FAILURE;
+ return GST_STATE_FAILURE;
}
GST_INFO ("osselement: opened sound device");
break;
@@ -973,7 +961,7 @@ gst_osselement_change_state (GstElement *element)
default:
break;
}
-
+
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element);