diff options
author | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
---|---|---|
committer | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
commit | 5d25c00e4b613b9cdf2c04fa3a68dffa03834a68 (patch) | |
tree | 74a5b1eaf3a324b520e64e87404fd0b3018a7829 /sys/oss | |
parent | 1e83b097f7b732ae49e294a5a398bdc3e88854a8 (diff) |
gst-indent
Original commit message from CVS:
gst-indent
Diffstat (limited to 'sys/oss')
-rw-r--r-- | sys/oss/gstossaudio.c | 24 | ||||
-rw-r--r-- | sys/oss/gstosselement.c | 570 | ||||
-rw-r--r-- | sys/oss/gstosselement.h | 82 | ||||
-rw-r--r-- | sys/oss/gstossmixer.c | 207 | ||||
-rw-r--r-- | sys/oss/gstossmixer.h | 23 | ||||
-rw-r--r-- | sys/oss/gstosssink.c | 397 | ||||
-rw-r--r-- | sys/oss/gstosssink.h | 40 | ||||
-rw-r--r-- | sys/oss/gstosssrc.c | 332 | ||||
-rw-r--r-- | sys/oss/gstosssrc.h | 30 |
9 files changed, 853 insertions, 852 deletions
diff --git a/sys/oss/gstossaudio.c b/sys/oss/gstossaudio.c index 4387eb07..ecbbd9bc 100644 --- a/sys/oss/gstossaudio.c +++ b/sys/oss/gstossaudio.c @@ -32,17 +32,17 @@ extern gchar *__gst_oss_plugin_dir; GST_DEBUG_CATEGORY (oss_debug); static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstaudio")) return FALSE; if (!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, - GST_TYPE_OSSELEMENT) || + GST_TYPE_OSSELEMENT) || !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, - GST_TYPE_OSSSRC) || + GST_TYPE_OSSSRC) || !gst_element_register (plugin, "osssink", GST_RANK_PRIMARY, - GST_TYPE_OSSSINK)) { + GST_TYPE_OSSSINK)) { return FALSE; } @@ -56,14 +56,8 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "ossaudio", - "OSS (Open Sound System) support for GStreamer", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "ossaudio", + "OSS (Open Sound System) support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) 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); diff --git a/sys/oss/gstosselement.h b/sys/oss/gstosselement.h index 3ce84a2c..1b73ec49 100644 --- a/sys/oss/gstosselement.h +++ b/sys/oss/gstosselement.h @@ -30,7 +30,6 @@ GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug G_BEGIN_DECLS - #define GST_TYPE_OSSELEMENT \ (gst_osselement_get_type()) #define GST_OSSELEMENT(obj) \ @@ -43,16 +42,17 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSELEMENT)) #define GST_OSSELEMENT_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OSSELEMENT, GstOssElementClass)) - typedef struct _GstOssElement GstOssElement; typedef struct _GstOssElementClass GstOssElementClass; -typedef enum { +typedef enum +{ GST_OSSELEMENT_READ, GST_OSSELEMENT_WRITE, } GstOssOpenMode; -typedef struct _GstOssDeviceCombination { +typedef struct _GstOssDeviceCombination +{ gchar *dsp, *mixer; dev_t dev; } GstOssDeviceCombination; @@ -60,65 +60,57 @@ typedef struct _GstOssDeviceCombination { struct _GstOssElement { /* yes, we're a gstelement too */ - GstElement parent; + GstElement parent; - gchar *device, - *mixer_dev; + gchar *device, *mixer_dev; /* device state */ - int fd; - int caps; /* the capabilities */ - gint format; - gint fragment; - guint64 fragment_time; - gint fragment_size; + int fd; + int caps; /* the capabilities */ + gint format; + gint fragment; + guint64 fragment_time; + gint fragment_size; GstOssOpenMode mode; /* stats bytes per *second* */ - guint bps; + guint bps; /* parameters */ - gint law; - gint endianness; - gboolean sign; - gint width; - gint depth; - gint channels; - gint rate; + gint law; + gint endianness; + gboolean sign; + gint width; + gint depth; + gint channels; + gint rate; /* mixer stuff */ - GList *tracklist; - guint32 stereomask, - recdevs, - recmask, - mixcaps; - gint mixer_fd; - gchar *device_name; + GList *tracklist; + guint32 stereomask, recdevs, recmask, mixcaps; + gint mixer_fd; + gchar *device_name; }; -struct _GstOssElementClass { +struct _GstOssElementClass +{ GstElementClass klass; - GList *device_combinations; + GList *device_combinations; }; -GType gst_osselement_get_type (void); +GType gst_osselement_get_type (void); /* some useful functions */ -gboolean gst_osselement_parse_caps (GstOssElement *oss, - const GstCaps *caps); -gboolean gst_osselement_merge_fixed_caps (GstOssElement *oss, - GstCaps *caps); - -gboolean gst_osselement_sync_parms (GstOssElement *oss); -void gst_osselement_reset (GstOssElement *oss); - -gboolean gst_osselement_convert (GstOssElement *oss, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); +gboolean gst_osselement_parse_caps (GstOssElement * oss, const GstCaps * caps); +gboolean gst_osselement_merge_fixed_caps (GstOssElement * oss, GstCaps * caps); -G_END_DECLS +gboolean gst_osselement_sync_parms (GstOssElement * oss); +void gst_osselement_reset (GstOssElement * oss); +gboolean gst_osselement_convert (GstOssElement * oss, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); + +G_END_DECLS #endif /* __GST_OSS_ELEMENT_H__ */ diff --git a/sys/oss/gstossmixer.c b/sys/oss/gstossmixer.c index 6bc89ccd..a9e7222c 100644 --- a/sys/oss/gstossmixer.c +++ b/sys/oss/gstossmixer.c @@ -37,27 +37,22 @@ #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) -static void gst_ossmixer_track_class_init (GstOssMixerTrackClass *klass); -static void gst_ossmixer_track_init (GstOssMixerTrack *track); +static void gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass); +static void gst_ossmixer_track_init (GstOssMixerTrack * track); -static gboolean gst_ossmixer_supported (GstImplementsInterface *iface, - GType iface_type); -static const GList * - gst_ossmixer_list_tracks (GstMixer *ossmixer); - -static void gst_ossmixer_set_volume (GstMixer *ossmixer, - GstMixerTrack *track, - gint *volumes); -static void gst_ossmixer_get_volume (GstMixer *ossmixer, - GstMixerTrack *track, - gint *volumes); - -static void gst_ossmixer_set_record (GstMixer *ossmixer, - GstMixerTrack *track, - gboolean record); -static void gst_ossmixer_set_mute (GstMixer *ossmixer, - GstMixerTrack *track, - gboolean mute); +static gboolean gst_ossmixer_supported (GstImplementsInterface * iface, + GType iface_type); +static const GList *gst_ossmixer_list_tracks (GstMixer * ossmixer); + +static void gst_ossmixer_set_volume (GstMixer * ossmixer, + GstMixerTrack * track, gint * volumes); +static void gst_ossmixer_get_volume (GstMixer * ossmixer, + GstMixerTrack * track, gint * volumes); + +static void gst_ossmixer_set_record (GstMixer * ossmixer, + GstMixerTrack * track, gboolean record); +static void gst_ossmixer_set_mute (GstMixer * ossmixer, + GstMixerTrack * track, gboolean mute); static const gchar **labels = NULL; static GstMixerTrackClass *parent_class = NULL; @@ -76,39 +71,41 @@ fill_labels (void) { gint i, pos; gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; - struct { + struct + { gchar *given, *wanted; } cases[] = { /* Note: this list is simply ripped from soundcard.h. For * some people, some values might be missing (3D surround, * etc.) - feel free to add them. That's the reason why * I'm doing this in such a horribly complicated way. */ - { "Vol ", _("Volume") }, - { "Bass ", _("Bass") }, - { "Trebl", _("Treble") }, - { "Synth", _("Synth") }, - { "Pcm ", _("PCM") }, - { "Spkr ", _("Speaker") }, - { "Line ", _("Line-in") }, - { "Mic ", _("Microphone") }, - { "CD ", _("CD") }, - { "Mix ", _("Mixer") }, - { "Pcm2 ", _("PCM-2") }, - { "Rec ", _("Record") }, - { "IGain", _("In-gain") }, - { "OGain", _("Out-gain") }, - { "Line1", _("Line-1") }, - { "Line2", _("Line-2") }, - { "Line3", _("Line-3") }, - { "Digital1", _("Digital-1") }, - { "Digital2", _("Digital-2") }, - { "Digital3", _("Digital-3") }, - { "PhoneIn", _("Phone-in") }, - { "PhoneOut", _("Phone-out") }, - { "Video", _("Video") }, - { "Radio", _("Radio") }, - { "Monitor", _("Monitor") }, - { NULL, NULL } + { + "Vol ", _("Volume")}, { + "Bass ", _("Bass")}, { + "Trebl", _("Treble")}, { + "Synth", _("Synth")}, { + "Pcm ", _("PCM")}, { + "Spkr ", _("Speaker")}, { + "Line ", _("Line-in")}, { + "Mic ", _("Microphone")}, { + "CD ", _("CD")}, { + "Mix ", _("Mixer")}, { + "Pcm2 ", _("PCM-2")}, { + "Rec ", _("Record")}, { + "IGain", _("In-gain")}, { + "OGain", _("Out-gain")}, { + "Line1", _("Line-1")}, { + "Line2", _("Line-2")}, { + "Line3", _("Line-3")}, { + "Digital1", _("Digital-1")}, { + "Digital2", _("Digital-2")}, { + "Digital3", _("Digital-3")}, { + "PhoneIn", _("Phone-in")}, { + "PhoneOut", _("Phone-out")}, { + "Video", _("Video")}, { + "Radio", _("Radio")}, { + "Monitor", _("Monitor")}, { + NULL, NULL} }; labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); @@ -116,8 +113,8 @@ fill_labels (void) for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { for (pos = 0; cases[pos].given != NULL; pos++) { if (!strcmp (cases[pos].given, origs[i])) { - labels[i] = g_strdup (cases[pos].wanted); - break; + labels[i] = g_strdup (cases[pos].wanted); + break; } } if (cases[pos].given == NULL) @@ -146,31 +143,28 @@ gst_ossmixer_track_get_type (void) gst_ossmixer_track_type = g_type_register_static (GST_TYPE_MIXER_TRACK, - "GstOssMixerTrack", - &ossmixer_track_info, 0); + "GstOssMixerTrack", &ossmixer_track_info, 0); } return gst_ossmixer_track_type; } static void -gst_ossmixer_track_class_init (GstOssMixerTrackClass *klass) +gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) { parent_class = g_type_class_ref (GST_TYPE_MIXER_TRACK); } static void -gst_ossmixer_track_init (GstOssMixerTrack *track) +gst_ossmixer_track_init (GstOssMixerTrack * track) { track->lvol = track->rvol = 0; track->track_num = 0; } GstMixerTrack * -gst_ossmixer_track_new (GstOssElement *oss, - gint track_num, - gint max_chans, - gint flags) +gst_ossmixer_track_new (GstOssElement * oss, + gint track_num, gint max_chans, gint flags) { GstOssMixerTrack *osstrack; GstMixerTrack *track; @@ -189,9 +183,9 @@ gst_ossmixer_track_new (GstOssElement *oss, osstrack->track_num = track_num; /* volume */ - if (ioctl(oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning("Error getting device (%d) volume: %s", - osstrack->track_num, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting device (%d) volume: %s", + osstrack->track_num, strerror (errno)); volume = 0; } osstrack->lvol = (volume & 0xff); @@ -203,17 +197,17 @@ gst_ossmixer_track_new (GstOssElement *oss, } void -gst_oss_interface_init (GstImplementsInterfaceClass *klass) +gst_oss_interface_init (GstImplementsInterfaceClass * klass) { /* default virtual functions */ klass->supported = gst_ossmixer_supported; } void -gst_ossmixer_interface_init (GstMixerClass *klass) +gst_ossmixer_interface_init (GstMixerClass * klass) { GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; - + /* default virtual functions */ klass->list_tracks = gst_ossmixer_list_tracks; klass->set_volume = gst_ossmixer_set_volume; @@ -223,8 +217,7 @@ gst_ossmixer_interface_init (GstMixerClass *klass) } static gboolean -gst_ossmixer_supported (GstImplementsInterface *iface, - GType iface_type) +gst_ossmixer_supported (GstImplementsInterface * iface, GType iface_type) { g_assert (iface_type == GST_TYPE_MIXER); @@ -232,8 +225,7 @@ gst_ossmixer_supported (GstImplementsInterface *iface, } static gboolean -gst_ossmixer_contains_track (GstOssElement *oss, - GstOssMixerTrack *osstrack) +gst_ossmixer_contains_track (GstOssElement * oss, GstOssMixerTrack * osstrack) { const GList *item; @@ -245,15 +237,14 @@ gst_ossmixer_contains_track (GstOssElement *oss, } static const GList * -gst_ossmixer_list_tracks (GstMixer *mixer) +gst_ossmixer_list_tracks (GstMixer * mixer) { return (const GList *) GST_OSSELEMENT (mixer)->tracklist; } static void -gst_ossmixer_get_volume (GstMixer *mixer, - GstMixerTrack *track, - gint *volumes) +gst_ossmixer_get_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -270,9 +261,9 @@ gst_ossmixer_get_volume (GstMixer *mixer, } } else { /* get */ - if (ioctl(oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning("Error getting recording device (%d) volume: %s", - osstrack->track_num, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting recording device (%d) volume: %s", + osstrack->track_num, strerror (errno)); volume = 0; } @@ -284,9 +275,8 @@ gst_ossmixer_get_volume (GstMixer *mixer, } static void -gst_ossmixer_set_volume (GstMixer *mixer, - GstMixerTrack *track, - gint *volumes) +gst_ossmixer_set_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -304,9 +294,9 @@ gst_ossmixer_set_volume (GstMixer *mixer, } /* set */ - if (ioctl(oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { - g_warning("Error setting recording device (%d) volume (0x%x): %s", - osstrack->track_num, volume, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting recording device (%d) volume (0x%x): %s", + osstrack->track_num, volume, strerror (errno)); return; } } @@ -318,9 +308,7 @@ gst_ossmixer_set_volume (GstMixer *mixer, } static void -gst_ossmixer_set_mute (GstMixer *mixer, - GstMixerTrack *track, - gboolean mute) +gst_ossmixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) { int volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -339,9 +327,9 @@ gst_ossmixer_set_mute (GstMixer *mixer, } } - if (ioctl(oss->mixer_fd, MIXER_WRITE(osstrack->track_num), &volume) < 0) { - g_warning("Error setting mixer recording device volume (0x%x): %s", - volume, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting mixer recording device volume (0x%x): %s", + volume, strerror (errno)); return; } @@ -353,9 +341,8 @@ gst_ossmixer_set_mute (GstMixer *mixer, } static void -gst_ossmixer_set_record (GstMixer *mixer, - GstMixerTrack *track, - gboolean record) +gst_ossmixer_set_record (GstMixer * mixer, + GstMixerTrack * track, gboolean record) { GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); @@ -372,8 +359,10 @@ gst_ossmixer_set_record (GstMixer *mixer, /* if we're exclusive, then we need to unset the current one(s) */ if (oss->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *track; + for (track = oss->tracklist; track != NULL; track = track->next) { GstMixerTrack *turn = (GstMixerTrack *) track->data; + turn->flags &= ~GST_MIXER_TRACK_RECORD; } oss->recdevs = 0; @@ -387,9 +376,9 @@ gst_ossmixer_set_record (GstMixer *mixer, } /* set it to the device */ - if (ioctl(oss->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &oss->recdevs) < 0) { - g_warning("Error setting mixer recording devices (0x%x): %s", - oss->recdevs, strerror(errno)); + if (ioctl (oss->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &oss->recdevs) < 0) { + g_warning ("Error setting mixer recording devices (0x%x): %s", + oss->recdevs, strerror (errno)); return; } @@ -401,11 +390,12 @@ gst_ossmixer_set_record (GstMixer *mixer, } void -gst_ossmixer_build_list (GstOssElement *oss) +gst_ossmixer_build_list (GstOssElement * oss) { gint i, devmask, master = -1; const GList *pads = gst_element_get_pad_list (GST_ELEMENT (oss)); GstPadDirection dir = GST_PAD_UNKNOWN; + #ifdef SOUND_MIXER_INFO struct mixer_info minfo; #endif @@ -416,7 +406,7 @@ gst_ossmixer_build_list (GstOssElement *oss) if (oss->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", - oss->mixer_dev, strerror (errno)); + oss->mixer_dev, strerror (errno)); return; } @@ -427,9 +417,9 @@ gst_ossmixer_build_list (GstOssElement *oss) /* get masks */ if (ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECMASK, &oss->recmask) < 0 || ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECSRC, &oss->recdevs) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps) < 0) { + ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask) < 0 + || ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0 + || ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps) < 0) { GST_DEBUG ("Failed to get device masks - disabling mixer"); close (oss->mixer_fd); oss->mixer_fd = -1; @@ -451,7 +441,7 @@ gst_ossmixer_build_list (GstOssElement *oss) else if (devmask & SOUND_MASK_PCM) master = SOUND_MIXER_PCM; else if (devmask & SOUND_MASK_SPEAKER) - master = SOUND_MIXER_SPEAKER; /* doubtful... */ + master = SOUND_MIXER_SPEAKER; /* doubtful... */ /* else: no master, so we won't set any */ /* build track list */ @@ -462,31 +452,30 @@ gst_ossmixer_build_list (GstOssElement *oss) /* track exists, make up capabilities */ if (MASK_BIT_IS_SET (oss->stereomask, i)) - stereo = TRUE; + stereo = TRUE; if (MASK_BIT_IS_SET (oss->recmask, i)) - input = TRUE; + input = TRUE; if (MASK_BIT_IS_SET (oss->recdevs, i)) - record = TRUE; + record = TRUE; /* do we want this in our list? */ if ((dir == GST_PAD_SRC && input == FALSE) || - (dir == GST_PAD_SINK && i != SOUND_MIXER_PCM)) - continue; + (dir == GST_PAD_SINK && i != SOUND_MIXER_PCM)) + continue; /* add track to list */ track = gst_ossmixer_track_new (oss, i, stereo ? 2 : 1, - (record ? GST_MIXER_TRACK_RECORD : 0) | - (input ? GST_MIXER_TRACK_INPUT : - GST_MIXER_TRACK_OUTPUT) | - ((master != i) ? 0 : - GST_MIXER_TRACK_MASTER)); + (record ? GST_MIXER_TRACK_RECORD : 0) | + (input ? GST_MIXER_TRACK_INPUT : + GST_MIXER_TRACK_OUTPUT) | + ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); oss->tracklist = g_list_append (oss->tracklist, track); } } } void -gst_ossmixer_free_list (GstOssElement *oss) +gst_ossmixer_free_list (GstOssElement * oss) { if (oss->mixer_fd == -1) return; diff --git a/sys/oss/gstossmixer.h b/sys/oss/gstossmixer.h index dd2fb4fc..100d6afd 100644 --- a/sys/oss/gstossmixer.h +++ b/sys/oss/gstossmixer.h @@ -27,7 +27,6 @@ #include "gstosselement.h" G_BEGIN_DECLS - #define GST_TYPE_OSSMIXER_TRACK \ (gst_ossmixer_track_get_type ()) #define GST_OSSMIXER_TRACK(obj) \ @@ -40,25 +39,25 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) #define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) - -typedef struct _GstOssMixerTrack { + typedef struct _GstOssMixerTrack +{ GstMixerTrack parent; - gint lvol, rvol; - gint track_num; + gint lvol, rvol; + gint track_num; } GstOssMixerTrack; -typedef struct _GstOssMixerTrackClass { +typedef struct _GstOssMixerTrackClass +{ GstMixerTrackClass parent; } GstOssMixerTrackClass; -GType gst_ossmixer_track_get_type (void); +GType gst_ossmixer_track_get_type (void); -void gst_ossmixer_interface_init (GstMixerClass *klass); -void gst_oss_interface_init (GstImplementsInterfaceClass *klass); -void gst_ossmixer_build_list (GstOssElement *oss); -void gst_ossmixer_free_list (GstOssElement *oss); +void gst_ossmixer_interface_init (GstMixerClass * klass); +void gst_oss_interface_init (GstImplementsInterfaceClass * klass); +void gst_ossmixer_build_list (GstOssElement * oss); +void gst_ossmixer_free_list (GstOssElement * oss); G_END_DECLS - #endif /* __GST_OSS_MIXER_H__ */ diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index ab56274a..053eba46 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -32,50 +32,52 @@ #include "gstosssink.h" /* elementfactory information */ -static GstElementDetails gst_osssink_details = GST_ELEMENT_DETAILS ( - "Audio Sink (OSS)", - "Sink/Audio", - "Output to a sound card via OSS", - "Erik Walthinsen <omega@cse.ogi.edu>, " - "Wim Taymans <wim.taymans@chello.be>" -); - -static void gst_osssink_base_init (gpointer g_class); -static void gst_osssink_class_init (GstOssSinkClass *klass); -static void gst_osssink_init (GstOssSink *osssink); -static void gst_osssink_dispose (GObject *object); - -static GstElementStateReturn gst_osssink_change_state (GstElement *element); -static void gst_osssink_set_clock (GstElement *element, GstClock *clock); -static GstClock* gst_osssink_get_clock (GstElement *element); -static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data); - -static const GstFormat* gst_osssink_get_formats (GstPad *pad); -static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); -static const GstQueryType* gst_osssink_get_query_types (GstPad *pad); -static gboolean gst_osssink_query (GstElement *element, GstQueryType type, - GstFormat *format, gint64 *value); -static gboolean gst_osssink_sink_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); - -static GstCaps * gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps); -static GstPadLinkReturn gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps); - -static void gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, - GParamSpec *pspec); -static void gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, - GParamSpec *pspec); - -static void gst_osssink_chain (GstPad *pad,GstData *_data); +static GstElementDetails gst_osssink_details = +GST_ELEMENT_DETAILS ("Audio Sink (OSS)", + "Sink/Audio", + "Output to a sound card via OSS", + "Erik Walthinsen <omega@cse.ogi.edu>, " + "Wim Taymans <wim.taymans@chello.be>"); + +static void gst_osssink_base_init (gpointer g_class); +static void gst_osssink_class_init (GstOssSinkClass * klass); +static void gst_osssink_init (GstOssSink * osssink); +static void gst_osssink_dispose (GObject * object); + +static GstElementStateReturn gst_osssink_change_state (GstElement * element); +static void gst_osssink_set_clock (GstElement * element, GstClock * clock); +static GstClock *gst_osssink_get_clock (GstElement * element); +static GstClockTime gst_osssink_get_time (GstClock * clock, gpointer data); + +static const GstFormat *gst_osssink_get_formats (GstPad * pad); +static gboolean gst_osssink_convert (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static const GstQueryType *gst_osssink_get_query_types (GstPad * pad); +static gboolean gst_osssink_query (GstElement * element, GstQueryType type, + GstFormat * format, gint64 * value); +static gboolean gst_osssink_sink_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); + +static GstCaps *gst_osssink_sink_fixate (GstPad * pad, const GstCaps * caps); +static GstPadLinkReturn gst_osssink_sinkconnect (GstPad * pad, + const GstCaps * caps); + +static void gst_osssink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osssink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_osssink_chain (GstPad * pad, GstData * _data); /* OssSink signals and args */ -enum { +enum +{ SIGNAL_HANDOFF, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_MUTE, ARG_FRAGMENT, @@ -86,19 +88,16 @@ enum { }; static GstStaticPadTemplate osssink_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstElementClass *parent_class = NULL; static guint gst_osssink_signals[LAST_SIGNAL] = { 0 }; @@ -110,24 +109,26 @@ gst_osssink_get_type (void) if (!osssink_type) { static const GTypeInfo osssink_info = { - sizeof(GstOssSinkClass), + sizeof (GstOssSinkClass), gst_osssink_base_init, NULL, - (GClassInitFunc)gst_osssink_class_init, + (GClassInitFunc) gst_osssink_class_init, NULL, NULL, - sizeof(GstOssSink), + sizeof (GstOssSink), 0, - (GInstanceInitFunc)gst_osssink_init, + (GInstanceInitFunc) gst_osssink_init, }; - osssink_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSink", &osssink_info, 0); + osssink_type = + g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSink", + &osssink_info, 0); } return osssink_type; } static void -gst_osssink_dispose (GObject *object) +gst_osssink_dispose (GObject * object) { GstOssSink *osssink = (GstOssSink *) object; @@ -140,65 +141,71 @@ static void gst_osssink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_osssink_details); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssink_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&osssink_sink_factory)); } static void -gst_osssink_class_init (GstOssSinkClass *klass) +gst_osssink_class_init (GstOssSinkClass * 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_OSSELEMENT); + parent_class = g_type_class_ref (GST_TYPE_OSSELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUTE, - g_param_spec_boolean ("mute", "Mute", "Mute the audio", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("mute", "Mute", "Mute the audio", + FALSE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, - g_param_spec_boolean ("sync", "Sync", "If syncing on timestamps should be enabled", - TRUE, G_PARAM_READWRITE)); + g_param_spec_boolean ("sync", "Sync", + "If syncing on timestamps should be enabled", TRUE, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, - g_param_spec_int ("fragment", "Fragment", - "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", - 0, G_MAXINT, 6, G_PARAM_READWRITE)); + g_param_spec_int ("fragment", "Fragment", + "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_SIZE, - g_param_spec_uint ("buffer_size", "Buffer size", "Size of buffers in osssink's bufferpool (bytes)", - 0, G_MAXINT, 4096, G_PARAM_READWRITE)); + g_param_spec_uint ("buffer_size", "Buffer size", + "Size of buffers in osssink's bufferpool (bytes)", 0, G_MAXINT, 4096, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHUNK_SIZE, - g_param_spec_uint ("chunk_size", "Chunk size", "Write data in chunk sized buffers", - 0, G_MAXUINT, 4096, G_PARAM_READWRITE)); + g_param_spec_uint ("chunk_size", "Chunk size", + "Write data in chunk sized buffers", 0, G_MAXUINT, 4096, + G_PARAM_READWRITE)); gst_osssink_signals[SIGNAL_HANDOFF] = - g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstOssSinkClass, handoff), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - + g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstOssSinkClass, handoff), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + gobject_class->set_property = gst_osssink_set_property; gobject_class->get_property = gst_osssink_get_property; - gobject_class->dispose = gst_osssink_dispose; - + gobject_class->dispose = gst_osssink_dispose; + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_osssink_change_state); - gstelement_class->query = GST_DEBUG_FUNCPTR (gst_osssink_query); - gstelement_class->set_clock = gst_osssink_set_clock; - gstelement_class->get_clock = gst_osssink_get_clock; - + gstelement_class->query = GST_DEBUG_FUNCPTR (gst_osssink_query); + gstelement_class->set_clock = gst_osssink_set_clock; + gstelement_class->get_clock = gst_osssink_get_clock; + } -static void -gst_osssink_init (GstOssSink *osssink) +static void +gst_osssink_init (GstOssSink * osssink) { - osssink->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&osssink_sink_factory), "sink"); + osssink->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&osssink_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (osssink), osssink->sinkpad); gst_pad_set_link_function (osssink->sinkpad, gst_osssink_sinkconnect); gst_pad_set_fixate_function (osssink->sinkpad, gst_osssink_sink_fixate); gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query); - gst_pad_set_query_type_function (osssink->sinkpad, gst_osssink_get_query_types); + gst_pad_set_query_type_function (osssink->sinkpad, + gst_osssink_get_query_types); gst_pad_set_formats_function (osssink->sinkpad, gst_osssink_get_formats); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -209,8 +216,10 @@ gst_osssink_init (GstOssSink *osssink) osssink->mute = FALSE; osssink->sync = TRUE; osssink->resync = TRUE; - osssink->provided_clock = gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); - gst_object_set_parent (GST_OBJECT (osssink->provided_clock), GST_OBJECT (osssink)); + osssink->provided_clock = + gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); + gst_object_set_parent (GST_OBJECT (osssink->provided_clock), + GST_OBJECT (osssink)); osssink->handled = 0; GST_FLAG_SET (osssink, GST_ELEMENT_THREAD_SUGGESTED); @@ -218,12 +227,14 @@ gst_osssink_init (GstOssSink *osssink) } static GstCaps * -gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps) +gst_osssink_sink_fixate (GstPad * pad, const GstCaps * caps) { GstCaps *newcaps; GstStructure *structure; - newcaps = gst_caps_new_full (gst_structure_copy(gst_caps_get_structure (caps, 0)), NULL); + newcaps = + gst_caps_new_full (gst_structure_copy (gst_caps_get_structure (caps, 0)), + NULL); structure = gst_caps_get_structure (newcaps, 0); if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", 44100)) { @@ -244,8 +255,8 @@ gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps) return NULL; } -static GstPadLinkReturn -gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps) +static GstPadLinkReturn +gst_osssink_sinkconnect (GstPad * pad, const GstCaps * caps) { GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -260,7 +271,7 @@ gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps) } static inline gint -gst_osssink_get_delay (GstOssSink *osssink) +gst_osssink_get_delay (GstOssSink * osssink) { gint delay = 0; gint ret; @@ -275,19 +286,19 @@ gst_osssink_get_delay (GstOssSink *osssink) #endif if (ret < 0) { audio_buf_info info; + if (ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { delay = 0; - } - else { - delay = (info.fragstotal * info.fragsize) - info.bytes; + } else { + delay = (info.fragstotal * info.fragsize) - info.bytes; } } return delay; } -static GstClockTime -gst_osssink_get_time (GstClock *clock, gpointer data) +static GstClockTime +gst_osssink_get_time (GstClock * clock, gpointer data) { GstOssSink *osssink = GST_OSSSINK (data); gint delay; @@ -305,39 +316,41 @@ gst_osssink_get_time (GstClock *clock, gpointer data) * happen anymore, so remove the second code path after april 2004 */ if (delay > (gint64) osssink->handled) { /*g_warning ("Delay %d > osssink->handled %" G_GUINT64_FORMAT - ", setting to osssink->handled", - delay, osssink->handled);*/ + ", setting to osssink->handled", + delay, osssink->handled); */ delay = osssink->handled; } - res = ((gint64) osssink->handled - delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; + res = + ((gint64) osssink->handled - + delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (res < 0) res = 0; return res; } -static GstClock* -gst_osssink_get_clock (GstElement *element) +static GstClock * +gst_osssink_get_clock (GstElement * element) { GstOssSink *osssink; - + osssink = GST_OSSSINK (element); return GST_CLOCK (osssink->provided_clock); } static void -gst_osssink_set_clock (GstElement *element, GstClock *clock) +gst_osssink_set_clock (GstElement * element, GstClock * clock) { GstOssSink *osssink; - + osssink = GST_OSSSINK (element); - osssink->clock = clock; + osssink->clock = clock; } -static void -gst_osssink_chain (GstPad *pad, GstData *_data) +static void +gst_osssink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstOssSink *osssink; @@ -354,23 +367,25 @@ gst_osssink_chain (GstPad *pad, GstData *_data) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_SYNC, 0); - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_SYNC, 0); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + FALSE); gst_pad_event_default (pad, event); - return; + return; case GST_EVENT_DISCONTINUOUS: - osssink->resync = TRUE; - /* pass-through */ + osssink->resync = TRUE; + /* pass-through */ default: gst_pad_event_default (pad, event); - return; + return; } g_assert_not_reached (); } if (!GST_OSSELEMENT (osssink)->bps) { gst_buffer_unref (buf); - GST_ELEMENT_ERROR (osssink, CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before chain function")); + GST_ELEMENT_ERROR (osssink, CORE, NEGOTIATION, (NULL), + ("format wasn't negotiated before chain function")); return; } @@ -388,11 +403,13 @@ gst_osssink_chain (GstPad *pad, GstData *_data) } else { buftime = soundtime; } - GST_LOG_OBJECT (osssink, "time: real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, - soundtime, buftime); + GST_LOG_OBJECT (osssink, + "time: real %" G_GUINT64_FORMAT ", buffer: %" G_GUINT64_FORMAT, soundtime, + buftime); if (MAX (buftime, soundtime) - MIN (buftime, soundtime) > (GST_SECOND / 10)) { /* we need to adjust to the buffers here */ - GST_INFO_OBJECT (osssink, "need sync: real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, + GST_INFO_OBJECT (osssink, + "need sync: real %" G_GUINT64_FORMAT ", buffer: %" G_GUINT64_FORMAT, soundtime, buftime); if (soundtime > buftime) { /* do *not* throw frames out. It's useless. The next frame will come in @@ -400,29 +417,35 @@ gst_osssink_chain (GstPad *pad, GstData *_data) * This is a placeholder for what - some day - should become QoS, i.e. * sending events upstream to drop buffers. */ } else { - guint64 to_handle = (((buftime - soundtime) * GST_OSSELEMENT(osssink)->bps / GST_SECOND) / - ((GST_OSSELEMENT (osssink)->width / 8) * GST_OSSELEMENT (osssink)->channels)) * - (GST_OSSELEMENT (osssink)->width / 8) * GST_OSSELEMENT (osssink)->channels; + guint64 to_handle = + (((buftime - + soundtime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND) / + ((GST_OSSELEMENT (osssink)->width / 8) * + GST_OSSELEMENT (osssink)->channels)) * + (GST_OSSELEMENT (osssink)->width / 8) * + GST_OSSELEMENT (osssink)->channels; if (!osssink->resync) { - guint8 *buf = g_new (guint8, to_handle); - - memset (buf, (GST_OSSELEMENT (osssink)->width == 8) ? 0 : 128, to_handle); - while (to_handle > 0) { - gint done = write (GST_OSSELEMENT (osssink)->fd, buf, - MIN (to_handle, osssink->chunk_size)); - if (done == -1 && errno != EINTR) { - break; - } else { - to_handle -= done; - osssink->handled += done; - } - } - g_free(buf); + guint8 *buf = g_new (guint8, to_handle); + + memset (buf, (GST_OSSELEMENT (osssink)->width == 8) ? 0 : 128, + to_handle); + while (to_handle > 0) { + gint done = write (GST_OSSELEMENT (osssink)->fd, buf, + MIN (to_handle, osssink->chunk_size)); + + if (done == -1 && errno != EINTR) { + break; + } else { + to_handle -= done; + osssink->handled += done; + } + } + g_free (buf); } else { - /* Timestamps at start-of-stream (MPEG) or after seek (hey, - * again MPEG!) can be borken, therefore this hacklet. */ - osssink->handled += to_handle; + /* Timestamps at start-of-stream (MPEG) or after seek (hey, + * again MPEG!) can be borken, therefore this hacklet. */ + osssink->handled += to_handle; } } } @@ -431,13 +454,13 @@ gst_osssink_chain (GstPad *pad, GstData *_data) if (!osssink->mute) { while (to_write > 0) { - gint done = write (GST_OSSELEMENT (osssink)->fd, data, - MIN (to_write, osssink->chunk_size)); - if (done == -1) { - if (errno != EINTR) + gint done = write (GST_OSSELEMENT (osssink)->fd, data, + MIN (to_write, osssink->chunk_size)); + + if (done == -1) { + if (errno != EINTR) break; - } - else { + } else { to_write -= done; data += done; osssink->handled += done; @@ -448,13 +471,14 @@ gst_osssink_chain (GstPad *pad, GstData *_data) } } - gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, gst_osssink_get_time (osssink->provided_clock, osssink)); + gst_audio_clock_update_time ((GstAudioClock *) osssink->provided_clock, + gst_osssink_get_time (osssink->provided_clock, osssink)); gst_buffer_unref (buf); } -static const GstFormat* -gst_osssink_get_formats (GstPad *pad) +static const GstFormat * +gst_osssink_get_formats (GstPad * pad) { static const GstFormat formats[] = { GST_FORMAT_TIME, @@ -466,20 +490,19 @@ gst_osssink_get_formats (GstPad *pad) } static gboolean -gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_osssink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { GstOssSink *osssink; osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - + return gst_osselement_convert (GST_OSSELEMENT (osssink), - src_format, src_value, - dest_format, dest_value); + src_format, src_value, dest_format, dest_value); } -static const GstQueryType* -gst_osssink_get_query_types (GstPad *pad) +static const GstQueryType * +gst_osssink_get_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_LATENCY, @@ -490,32 +513,33 @@ gst_osssink_get_query_types (GstPad *pad) } static gboolean -gst_osssink_sink_query (GstPad *pad, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssink_sink_query (GstPad * pad, GstQueryType type, GstFormat * format, + gint64 * value) { gboolean res = TRUE; GstOssSink *osssink; osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - + switch (type) { case GST_QUERY_LATENCY: - if (!gst_osssink_convert (pad, - GST_FORMAT_BYTES, gst_osssink_get_delay (osssink), - format, value)) - { - res = FALSE; + if (!gst_osssink_convert (pad, + GST_FORMAT_BYTES, gst_osssink_get_delay (osssink), + format, value)) { + res = FALSE; } break; case GST_QUERY_POSITION: - if (!gst_osssink_convert (pad, - GST_FORMAT_TIME, gst_element_get_time (GST_ELEMENT (osssink)), - format, value)) - { - res = FALSE; + if (!gst_osssink_convert (pad, + GST_FORMAT_TIME, gst_element_get_time (GST_ELEMENT (osssink)), + format, value)) { + res = FALSE; } break; default: - res = gst_pad_query (gst_pad_get_peer (osssink->sinkpad), type, format, value); + res = + gst_pad_query (gst_pad_get_peer (osssink->sinkpad), type, format, + value); break; } @@ -523,15 +547,17 @@ gst_osssink_sink_query (GstPad *pad, GstQueryType type, GstFormat *format, gint6 } static gboolean -gst_osssink_query (GstElement *element, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssink_query (GstElement * element, GstQueryType type, GstFormat * format, + gint64 * value) { GstOssSink *osssink = GST_OSSSINK (element); return gst_osssink_sink_query (osssink->sinkpad, type, format, value); } -static void -gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_osssink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstOssSink *osssink; @@ -563,8 +589,9 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G } } -static void -gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_osssink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstOssSink *osssink; @@ -592,8 +619,8 @@ gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamS } } -static GstElementStateReturn -gst_osssink_change_state (GstElement *element) +static GstElementStateReturn +gst_osssink_change_state (GstElement * element) { GstOssSink *osssink; @@ -603,16 +630,18 @@ gst_osssink_change_state (GstElement *element) case GST_STATE_READY_TO_PAUSED: break; case GST_STATE_PAUSED_TO_PLAYING: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), TRUE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + TRUE); break; case GST_STATE_PLAYING_TO_PAUSED: - if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); + if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + FALSE); break; case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); gst_osselement_reset (GST_OSSELEMENT (osssink)); osssink->handled = 0; osssink->resync = TRUE; @@ -620,7 +649,7 @@ gst_osssink_change_state (GstElement *element) default: break; } - + if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); diff --git a/sys/oss/gstosssink.h b/sys/oss/gstosssink.h index f484007b..e633ac52 100644 --- a/sys/oss/gstosssink.h +++ b/sys/oss/gstosssink.h @@ -31,7 +31,6 @@ #include <gst/audio/audioclock.h> G_BEGIN_DECLS - #define GST_TYPE_OSSSINK \ (gst_osssink_get_type()) #define GST_OSSSINK(obj) \ @@ -42,41 +41,42 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSINK)) #define GST_IS_OSSSINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSINK)) + typedef enum +{ + GST_OSSSINK_OPEN = GST_ELEMENT_FLAG_LAST, -typedef enum { - GST_OSSSINK_OPEN = GST_ELEMENT_FLAG_LAST, - - GST_OSSSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, + GST_OSSSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, } GstOssSinkFlags; typedef struct _GstOssSink GstOssSink; typedef struct _GstOssSinkClass GstOssSinkClass; -struct _GstOssSink { - GstOssElement element; +struct _GstOssSink +{ + GstOssElement element; - GstPad *sinkpad; + GstPad *sinkpad; - GstClock *provided_clock; - GstClock *clock; - gboolean resync; - gboolean sync; - guint64 handled; + GstClock *provided_clock; + GstClock *clock; + gboolean resync; + gboolean sync; + guint64 handled; - gboolean mute; - guint bufsize; - guint chunk_size; + gboolean mute; + guint bufsize; + guint chunk_size; }; -struct _GstOssSinkClass { +struct _GstOssSinkClass +{ GstOssElementClass parent_class; /* signals */ - void (*handoff) (GstElement *element,GstPad *pad); + void (*handoff) (GstElement * element, GstPad * pad); }; -GType gst_osssink_get_type(void); +GType gst_osssink_get_type (void); G_END_DECLS - #endif /* __GST_OSSSINK_H__ */ diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c index 4bdcb0d2..5803865e 100644 --- a/sys/oss/gstosssrc.c +++ b/sys/oss/gstosssrc.c @@ -37,92 +37,93 @@ #include <gst/audio/audioclock.h> /* elementfactory information */ -static GstElementDetails gst_osssrc_details = GST_ELEMENT_DETAILS ( - "Audio Source (OSS)", - "Source/Audio", - "Read from the sound card", - "Erik Walthinsen <omega@cse.ogi.edu>" -); +static GstElementDetails gst_osssrc_details = +GST_ELEMENT_DETAILS ("Audio Source (OSS)", + "Source/Audio", + "Read from the sound card", + "Erik Walthinsen <omega@cse.ogi.edu>"); /* OssSrc signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BUFFERSIZE, ARG_FRAGMENT, }; -static GstStaticPadTemplate osssrc_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); - -static void gst_osssrc_base_init (gpointer g_class); -static void gst_osssrc_class_init (GstOssSrcClass *klass); -static void gst_osssrc_init (GstOssSrc *osssrc); -static void gst_osssrc_dispose (GObject *object); - -static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps); -static const GstFormat* gst_osssrc_get_formats (GstPad *pad); -static gboolean gst_osssrc_convert (GstPad *pad, - GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); - -static void gst_osssrc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_osssrc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static GstElementStateReturn gst_osssrc_change_state (GstElement *element); - -static void gst_osssrc_set_clock (GstElement *element, GstClock *clock); -static GstClock* gst_osssrc_get_clock (GstElement *element); -static GstClockTime gst_osssrc_get_time (GstClock *clock, gpointer data); - -static const GstEventMask* gst_osssrc_get_event_masks (GstPad *pad); -static gboolean gst_osssrc_src_event (GstPad *pad, GstEvent *event); -static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event); -static const GstQueryType* gst_osssrc_get_query_types (GstPad *pad); -static gboolean gst_osssrc_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); - -static GstData * gst_osssrc_get (GstPad *pad); +static GstStaticPadTemplate osssrc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); + +static void gst_osssrc_base_init (gpointer g_class); +static void gst_osssrc_class_init (GstOssSrcClass * klass); +static void gst_osssrc_init (GstOssSrc * osssrc); +static void gst_osssrc_dispose (GObject * object); + +static GstPadLinkReturn gst_osssrc_srcconnect (GstPad * pad, + const GstCaps * caps); +static const GstFormat *gst_osssrc_get_formats (GstPad * pad); +static gboolean gst_osssrc_convert (GstPad * pad, + GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value); + +static void gst_osssrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osssrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_osssrc_change_state (GstElement * element); + +static void gst_osssrc_set_clock (GstElement * element, GstClock * clock); +static GstClock *gst_osssrc_get_clock (GstElement * element); +static GstClockTime gst_osssrc_get_time (GstClock * clock, gpointer data); + +static const GstEventMask *gst_osssrc_get_event_masks (GstPad * pad); +static gboolean gst_osssrc_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_osssrc_send_event (GstElement * element, GstEvent * event); +static const GstQueryType *gst_osssrc_get_query_types (GstPad * pad); +static gboolean gst_osssrc_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); + +static GstData *gst_osssrc_get (GstPad * pad); static GstElementClass *parent_class = NULL; + /*static guint gst_osssrc_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_osssrc_get_type (void) +gst_osssrc_get_type (void) { static GType osssrc_type = 0; if (!osssrc_type) { static const GTypeInfo osssrc_info = { - sizeof(GstOssSrcClass), + sizeof (GstOssSrcClass), gst_osssrc_base_init, NULL, - (GClassInitFunc)gst_osssrc_class_init, + (GClassInitFunc) gst_osssrc_class_init, NULL, NULL, - sizeof(GstOssSrc), + sizeof (GstOssSrc), 0, - (GInstanceInitFunc)gst_osssrc_init, + (GInstanceInitFunc) gst_osssrc_init, }; - osssrc_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, 0); + osssrc_type = + g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, + 0); } return osssrc_type; } @@ -131,32 +132,34 @@ static void gst_osssrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_osssrc_details); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssrc_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&osssrc_src_factory)); } static void -gst_osssrc_class_init (GstOssSrcClass *klass) +gst_osssrc_class_init (GstOssSrcClass * 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_OSSELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFERSIZE, - g_param_spec_ulong ("buffersize","Buffer Size","The size of the buffers with samples", - 0, G_MAXULONG, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFERSIZE, + g_param_spec_ulong ("buffersize", "Buffer Size", + "The size of the buffers with samples", 0, G_MAXULONG, 0, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, - g_param_spec_int ("fragment", "Fragment", - "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", - 0, G_MAXINT, 6, G_PARAM_READWRITE)); - + g_param_spec_int ("fragment", "Fragment", + "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); + gobject_class->set_property = gst_osssrc_set_property; gobject_class->get_property = gst_osssrc_get_property; - gobject_class->dispose = gst_osssrc_dispose; + gobject_class->dispose = gst_osssrc_dispose; gstelement_class->change_state = gst_osssrc_change_state; gstelement_class->send_event = gst_osssrc_send_event; @@ -165,11 +168,12 @@ gst_osssrc_class_init (GstOssSrcClass *klass) gstelement_class->get_clock = gst_osssrc_get_clock; } -static void -gst_osssrc_init (GstOssSrc *osssrc) +static void +gst_osssrc_init (GstOssSrc * osssrc) { - osssrc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&osssrc_src_factory), "src"); + osssrc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&osssrc_src_factory), "src"); gst_pad_set_get_function (osssrc->srcpad, gst_osssrc_get); gst_pad_set_link_function (osssrc->srcpad, gst_osssrc_srcconnect); gst_pad_set_convert_function (osssrc->srcpad, gst_osssrc_convert); @@ -185,14 +189,16 @@ gst_osssrc_init (GstOssSrc *osssrc) osssrc->buffersize = 4096; osssrc->curoffset = 0; - osssrc->provided_clock = gst_audio_clock_new ("ossclock", gst_osssrc_get_time, osssrc); - gst_object_set_parent (GST_OBJECT (osssrc->provided_clock), GST_OBJECT (osssrc)); - + osssrc->provided_clock = + gst_audio_clock_new ("ossclock", gst_osssrc_get_time, osssrc); + gst_object_set_parent (GST_OBJECT (osssrc->provided_clock), + GST_OBJECT (osssrc)); + osssrc->clock = NULL; } static void -gst_osssrc_dispose (GObject *object) +gst_osssrc_dispose (GObject * object) { GstOssSrc *osssrc = (GstOssSrc *) object; @@ -201,12 +207,12 @@ gst_osssrc_dispose (GObject *object) G_OBJECT_CLASS (parent_class)->dispose (object); } -static GstPadLinkReturn -gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps) +static GstPadLinkReturn +gst_osssrc_srcconnect (GstPad * pad, const GstCaps * caps) { GstOssSrc *src; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); if (!gst_osselement_parse_caps (GST_OSSELEMENT (src), caps)) return GST_PAD_LINK_REFUSED; @@ -218,12 +224,12 @@ gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps) } static gboolean -gst_osssrc_negotiate (GstPad *pad) +gst_osssrc_negotiate (GstPad * pad) { GstOssSrc *src; GstCaps *allowed; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); allowed = gst_pad_get_allowed_caps (pad); @@ -232,24 +238,24 @@ gst_osssrc_negotiate (GstPad *pad) if (!gst_osselement_sync_parms (GST_OSSELEMENT (src))) return FALSE; - + /* set caps on src pad */ - if (gst_pad_try_set_caps (src->srcpad, - gst_caps_new_simple("audio/x-raw-int", - "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, - "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, - "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, - "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, - "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, - "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, - NULL)) <= 0) { + if (gst_pad_try_set_caps (src->srcpad, + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, + "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, + "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, + "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, + "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, + "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, + NULL)) <= 0) { return FALSE; } return TRUE; } -static GstClockTime -gst_osssrc_get_time (GstClock *clock, gpointer data) +static GstClockTime +gst_osssrc_get_time (GstClock * clock, gpointer data) { GstOssSrc *osssrc = GST_OSSSRC (data); audio_buf_info info; @@ -257,40 +263,41 @@ gst_osssrc_get_time (GstClock *clock, gpointer data) if (!GST_OSSELEMENT (osssrc)->bps) return 0; - if (ioctl(GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_GETISPACE, &info) < 0) + if (ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_GETISPACE, &info) < 0) return 0; - return (osssrc->curoffset + info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; + return (osssrc->curoffset + + info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; } -static GstClock* -gst_osssrc_get_clock (GstElement *element) +static GstClock * +gst_osssrc_get_clock (GstElement * element) { GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (element); return GST_CLOCK (osssrc->provided_clock); } static void -gst_osssrc_set_clock (GstElement *element, GstClock *clock) +gst_osssrc_set_clock (GstElement * element, GstClock * clock) { GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (element); osssrc->clock = clock; } - + static GstData * -gst_osssrc_get (GstPad *pad) +gst_osssrc_get (GstPad * pad) { GstOssSrc *src; GstBuffer *buf; glong readbytes; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); GST_DEBUG ("attempting to read something from the soundcard"); @@ -298,9 +305,9 @@ gst_osssrc_get (GstPad *pad) src->need_eos = FALSE; return GST_DATA (gst_event_new (GST_EVENT_EOS)); } - + buf = gst_buffer_new_and_alloc (src->buffersize); - + if (!GST_PAD_CAPS (pad)) { /* nothing was negotiated, we can decide on a format */ if (!gst_osssrc_negotiate (pad)) { @@ -312,12 +319,12 @@ gst_osssrc_get (GstPad *pad) if (GST_OSSELEMENT (src)->bps == 0) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + ("format wasn't negotiated before chain function")); return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT)); } - readbytes = read (GST_OSSELEMENT (src)->fd,GST_BUFFER_DATA (buf), - src->buffersize); + readbytes = read (GST_OSSELEMENT (src)->fd, GST_BUFFER_DATA (buf), + src->buffersize); if (readbytes < 0) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); @@ -334,20 +341,23 @@ gst_osssrc_get (GstPad *pad) GST_BUFFER_OFFSET (buf) = src->curoffset; /* FIXME: we are falsely assuming that we are the master clock here */ - GST_BUFFER_TIMESTAMP (buf) = src->curoffset * GST_SECOND / GST_OSSELEMENT (src)->bps; - GST_BUFFER_DURATION (buf) = (GST_SECOND * GST_BUFFER_SIZE (buf)) / - (GST_OSSELEMENT (src)->bps * GST_OSSELEMENT (src)->rate); + GST_BUFFER_TIMESTAMP (buf) = + src->curoffset * GST_SECOND / GST_OSSELEMENT (src)->bps; + GST_BUFFER_DURATION (buf) = + (GST_SECOND * GST_BUFFER_SIZE (buf)) / (GST_OSSELEMENT (src)->bps * + GST_OSSELEMENT (src)->rate); src->curoffset += readbytes; - GST_DEBUG ("pushed buffer from soundcard of %ld bytes, timestamp %" G_GINT64_FORMAT, - readbytes, GST_BUFFER_TIMESTAMP (buf)); + GST_DEBUG ("pushed buffer from soundcard of %ld bytes, timestamp %" + G_GINT64_FORMAT, readbytes, GST_BUFFER_TIMESTAMP (buf)); return GST_DATA (buf); } -static void -gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_osssrc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstOssSrc *src; @@ -360,14 +370,15 @@ gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GP case ARG_FRAGMENT: GST_OSSELEMENT (src)->fragment = g_value_get_int (value); gst_osselement_sync_parms (GST_OSSELEMENT (src)); - break; + break; default: break; } } -static void -gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_osssrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstOssSrc *src; @@ -386,11 +397,11 @@ gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } } -static GstElementStateReturn -gst_osssrc_change_state (GstElement *element) +static GstElementStateReturn +gst_osssrc_change_state (GstElement * element) { GstOssSrc *osssrc = GST_OSSSRC (element); - + GST_DEBUG ("osssrc: state change"); switch (GST_STATE_TRANSITION (element)) { @@ -398,14 +409,16 @@ gst_osssrc_change_state (GstElement *element) osssrc->curoffset = 0; break; case GST_STATE_PAUSED_TO_PLAYING: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), TRUE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), + TRUE); break; case GST_STATE_PLAYING_TO_PAUSED: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), FALSE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), + FALSE); break; case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); break; default: break; @@ -413,12 +426,12 @@ gst_osssrc_change_state (GstElement *element) if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); - + return GST_STATE_SUCCESS; } -static const GstFormat* -gst_osssrc_get_formats (GstPad *pad) +static const GstFormat * +gst_osssrc_get_formats (GstPad * pad) { static const GstFormat formats[] = { GST_FORMAT_TIME, @@ -430,30 +443,30 @@ gst_osssrc_get_formats (GstPad *pad) } static gboolean -gst_osssrc_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_osssrc_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { GstOssSrc *osssrc; osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); return gst_osselement_convert (GST_OSSELEMENT (osssrc), src_format, src_value, - dest_format, dest_value); + dest_format, dest_value); } -static const GstEventMask* -gst_osssrc_get_event_masks (GstPad *pad) +static const GstEventMask * +gst_osssrc_get_event_masks (GstPad * pad) { static const GstEventMask gst_osssrc_src_event_masks[] = { - { GST_EVENT_EOS, 0 }, - { GST_EVENT_SIZE, 0 }, - { 0, } + {GST_EVENT_EOS, 0}, + {GST_EVENT_SIZE, 0}, + {0,} }; return gst_osssrc_src_event_masks; -} +} static gboolean -gst_osssrc_src_event (GstPad *pad, GstEvent *event) +gst_osssrc_src_event (GstPad * pad, GstEvent * event) { GstOssSrc *osssrc; gboolean retval = FALSE; @@ -471,16 +484,14 @@ gst_osssrc_src_event (GstPad *pad, GstEvent *event) gint64 value; format = GST_FORMAT_BYTES; - + /* convert to bytes */ - if (gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_EVENT_SIZE_FORMAT (event), - GST_EVENT_SIZE_VALUE (event), - &format, &value)) - { - osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); - g_object_notify (G_OBJECT (osssrc), "buffersize"); - retval = TRUE; + if (gst_osselement_convert (GST_OSSELEMENT (osssrc), + GST_EVENT_SIZE_FORMAT (event), + GST_EVENT_SIZE_VALUE (event), &format, &value)) { + osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); + g_object_notify (G_OBJECT (osssrc), "buffersize"); + retval = TRUE; } } default: @@ -491,40 +502,39 @@ gst_osssrc_src_event (GstPad *pad, GstEvent *event) } static gboolean -gst_osssrc_send_event (GstElement *element, - GstEvent *event) +gst_osssrc_send_event (GstElement * element, GstEvent * event) { GstOssSrc *osssrc = GST_OSSSRC (element); return gst_osssrc_src_event (osssrc->srcpad, event); } -static const GstQueryType* -gst_osssrc_get_query_types (GstPad *pad) +static const GstQueryType * +gst_osssrc_get_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_POSITION, 0, }; return query_types; -} +} static gboolean -gst_osssrc_src_query (GstPad *pad, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssrc_src_query (GstPad * pad, GstQueryType type, GstFormat * format, + gint64 * value) { gboolean res = FALSE; GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); - + switch (type) { case GST_QUERY_POSITION: - res = gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_FORMAT_BYTES, osssrc->curoffset, - format, value); + res = gst_osselement_convert (GST_OSSELEMENT (osssrc), + GST_FORMAT_BYTES, osssrc->curoffset, format, value); break; default: break; } return res; -} +} diff --git a/sys/oss/gstosssrc.h b/sys/oss/gstosssrc.h index 2bc6204f..e74db748 100644 --- a/sys/oss/gstosssrc.h +++ b/sys/oss/gstosssrc.h @@ -29,7 +29,6 @@ #include "gstosselement.h" G_BEGIN_DECLS - #define GST_TYPE_OSSSRC \ (gst_osssrc_get_type()) #define GST_OSSSRC(obj) \ @@ -40,38 +39,39 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSRC)) #define GST_IS_OSSSRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSRC)) + typedef enum +{ + GST_OSSSRC_OPEN = GST_ELEMENT_FLAG_LAST, -typedef enum { - GST_OSSSRC_OPEN = GST_ELEMENT_FLAG_LAST, - - GST_OSSSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, + GST_OSSSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, } GstOssSrcFlags; typedef struct _GstOssSrc GstOssSrc; typedef struct _GstOssSrcClass GstOssSrcClass; -struct _GstOssSrc { - GstOssElement element; +struct _GstOssSrc +{ + GstOssElement element; /* pads */ - GstPad *srcpad; + GstPad *srcpad; + + gboolean need_eos; /* Do we need to emit an EOS? */ - gboolean need_eos; /* Do we need to emit an EOS? */ - /* blocking */ - gulong curoffset; - gulong buffersize; + gulong curoffset; + gulong buffersize; /* clocks */ GstClock *provided_clock, *clock; }; -struct _GstOssSrcClass { +struct _GstOssSrcClass +{ GstOssElementClass parent_class; }; -GType gst_osssrc_get_type(void); +GType gst_osssrc_get_type (void); G_END_DECLS - #endif /* __GST_OSSSRC_H__ */ |