diff options
Diffstat (limited to 'sys/oss/gstosselement.c')
-rw-r--r-- | sys/oss/gstosselement.c | 570 |
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); |