From: Ronald B. <rb...@us...> - 2003-03-30 21:19:23
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sun Mar 30 2003 13:19:21 PST Log message: * implement clocking * set clock counter back to zero on ready->paused * move open/close to ready/null instead of paused/ready. * add random typos Modified files: sys/oss : gstosssrc.c gstosssrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.27&r2=1.28 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstosssrc.c 2 Feb 2003 05:26:29 -0000 1.27 +++ gstosssrc.c 30 Mar 2003 21:19:08 -0000 1.28 @@ -31,6 +31,7 @@ #include <gstosssrc.h> #include <gstosscommon.h> +#include <gstossclock.h> /* elementfactory information */ static GstElementDetails gst_osssrc_details = { @@ -99,6 +100,10 @@ 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); @@ -160,6 +165,9 @@ gstelement_class->change_state = gst_osssrc_change_state; gstelement_class->send_event = gst_osssrc_send_event; + + gstelement_class->set_clock = gst_osssrc_set_clock; + gstelement_class->get_clock = gst_osssrc_get_clock; } static void @@ -183,6 +191,11 @@ osssrc->buffersize = 4096; osssrc->curoffset = 0; + + osssrc->provided_clock = GST_CLOCK (gst_oss_clock_new ("ossclock", + gst_osssrc_get_time, + osssrc)); + osssrc->clock = NULL; } static GstPadLinkReturn @@ -239,6 +252,41 @@ } return TRUE; } + +static GstClockTime +gst_osssrc_get_time (GstClock *clock, gpointer data) +{ + GstOssSrc *osssrc = GST_OSSSRC (data); + audio_buf_info info; + + if (!osssrc->common.bps) + return 0; + + if (ioctl(osssrc->common.fd, SNDCTL_DSP_GETISPACE, &info) < 0) + return 0; + + return (osssrc->curoffset + info.bytes) * GST_SECOND / osssrc->common.bps; +} + +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) +{ + GstOssSrc *osssrc; + + osssrc = GST_OSSSRC (element); + + osssrc->clock = clock; +} static GstBuffer * gst_osssrc_get (GstPad *pad) @@ -289,6 +337,8 @@ GST_BUFFER_SIZE (buf) = readbytes; 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 / src->common.bps; src->curoffset += readbytes; @@ -355,8 +405,6 @@ switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: - break; - case GST_STATE_READY_TO_PAUSED: if (!GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { gchar *error; if (!gst_osscommon_open_audio (&osssrc->common, GST_OSSCOMMON_READ, &error)) { @@ -367,18 +415,25 @@ GST_FLAG_SET (osssrc, GST_OSSSRC_OPEN); } break; + case GST_STATE_READY_TO_PAUSED: + osssrc->curoffset = 0; + break; case GST_STATE_PAUSED_TO_PLAYING: + gst_oss_clock_set_active (osssrc->provided_clock, TRUE); break; case GST_STATE_PLAYING_TO_PAUSED: + gst_oss_clock_set_active (osssrc->provided_clock, FALSE); break; case GST_STATE_PAUSED_TO_READY: + if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) + ioctl (osssrc->common.fd, SNDCTL_DSP_RESET, 0); + break; + case GST_STATE_READY_TO_NULL: if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { gst_osscommon_close_audio (&osssrc->common); GST_FLAG_UNSET (osssrc, GST_OSSSRC_OPEN); } gst_osscommon_init (&osssrc->common); - break; - case GST_STATE_READY_TO_NULL: break; } Index: gstosssrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstosssrc.h 7 Dec 2002 20:54:47 -0000 1.6 +++ gstosssrc.h 30 Mar 2003 21:19:08 -0000 1.7 @@ -63,6 +63,9 @@ /* blocking */ gulong curoffset; gulong buffersize; + + /* clocks */ + GstClock *provided_clock, *clock; }; struct _GstOssSrcClass { |
From: Ronald B. <rb...@us...> - 2003-04-04 21:02:32
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Fri Apr 04 2003 13:02:32 PST Log message: Fix #106709 - waiting for approval in 0.6.1 - patch thanks to Peter N Lundblad <lun...@li...> Modified files: sys/oss : gstosssrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.28&r2=1.29 ====Begin Diffs==== Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstosssrc.c 30 Mar 2003 21:19:08 -0000 1.28 +++ gstosssrc.c 4 Apr 2003 21:02:18 -0000 1.29 @@ -306,6 +306,20 @@ 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)) { + gst_buffer_unref (buf); + gst_element_error (GST_ELEMENT (src), "could not negotiate format"); + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); + } + } + if (src->common.bps == 0) { + gst_buffer_unref (buf); + gst_element_error (GST_ELEMENT (src), "no format negotiated"); + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); + } + readbytes = read (src->common.fd,GST_BUFFER_DATA (buf), src->buffersize); if (readbytes < 0) { @@ -318,20 +332,6 @@ if (readbytes == 0) { gst_buffer_unref (buf); gst_element_set_eos (GST_ELEMENT (src)); - return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); - } - - if (!GST_PAD_CAPS (pad)) { - /* nothing was negotiated, we can decide on a format */ - if (!gst_osssrc_negotiate (pad)) { - gst_buffer_unref (buf); - gst_element_error (GST_ELEMENT (src), "could not negotiate format"); - return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); - } - } - if (src->common.bps == 0) { - gst_buffer_unref (buf); - gst_element_error (GST_ELEMENT (src), "no format negotiated"); return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); } |
From: Ronald B. <rb...@us...> - 2003-04-07 16:56:23
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Mon Apr 07 2003 09:56:20 PDT Branch: BRANCH-GSTREAMER-0_6 Log message: Fixes #106709 Modified files: sys/oss : gstosssrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.25.4.1&r2=1.25.4.2 ====Begin Diffs==== Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.25.4.1 retrieving revision 1.25.4.2 diff -u -d -r1.25.4.1 -r1.25.4.2 --- gstosssrc.c 28 Jan 2003 10:50:06 -0000 1.25.4.1 +++ gstosssrc.c 7 Apr 2003 16:56:05 -0000 1.25.4.2 @@ -258,6 +258,20 @@ 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)) { + gst_buffer_unref (buf); + gst_element_error (GST_ELEMENT (src), "could not negotiate format"); + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); + } + } + if (src->common.bps == 0) { + gst_buffer_unref (buf); + gst_element_error (GST_ELEMENT (src), "no format negotiated"); + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); + } + readbytes = read (src->common.fd,GST_BUFFER_DATA (buf), src->buffersize); if (readbytes < 0) { @@ -270,20 +284,6 @@ if (readbytes == 0) { gst_buffer_unref (buf); gst_element_set_eos (GST_ELEMENT (src)); - return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); - } - - if (!GST_PAD_CAPS (pad)) { - /* nothing was negotiated, we can decide on a format */ - if (!gst_osssrc_negotiate (pad)) { - gst_buffer_unref (buf); - gst_element_error (GST_ELEMENT (src), "could not negotiate format"); - return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); - } - } - if (src->common.bps == 0) { - gst_buffer_unref (buf); - gst_element_error (GST_ELEMENT (src), "no format negotiated"); return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); } |
From: Ronald B. <rb...@us...> - 2003-07-06 20:50:27
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sun Jul 06 2003 13:50:24 PDT Log message: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs Modified files: sys/oss : gstossgst.c gstosssink.c gstosssrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossgst.c.diff?r1=1.8&r2=1.9 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.60&r2=1.61 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: gstossgst.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossgst.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstossgst.c 29 Jun 2003 19:46:11 -0000 1.8 +++ gstossgst.c 6 Jul 2003 20:49:51 -0000 1.9 @@ -79,10 +79,8 @@ GST_PAD_ALWAYS, gst_caps_new ( "ossgst_src", - "audio/raw", + "audio/x-raw-int", gst_props_new ( - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), "endianness", GST_PROPS_INT (G_BYTE_ORDER), "signed", GST_PROPS_LIST ( GST_PROPS_BOOLEAN (FALSE), @@ -99,7 +97,21 @@ "rate", GST_PROPS_INT_RANGE (8000, 48000), "channels", GST_PROPS_INT_RANGE (1, 2), NULL)), - NULL); + gst_caps_new ( + "ossgst_src", + "audio/x-mulaw", + gst_props_new ( + "rate", GST_PROPS_INT_RANGE (8000, 48000), + "channels", GST_PROPS_INT_RANGE (1, 2), + NULL)), + gst_caps_new ( + "ossgst_src", + "audio/x-alaw", + gst_props_new ( + "rate", GST_PROPS_INT_RANGE (8000, 48000), + "channels", GST_PROPS_INT_RANGE (1, 2), + NULL)), + NULL); } @@ -224,12 +236,12 @@ } if (supported) { - caps = gst_caps_new ( + switch (law) { + case 0: + caps = gst_caps_new ( "ossgst_caps", - "audio/raw", + "audio/x-raw-int", gst_props_new ( - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (law), "endianness", GST_PROPS_INT (endianness), "signed", GST_PROPS_BOOLEAN (is_signed), "width", GST_PROPS_INT (width), @@ -237,6 +249,26 @@ "rate", GST_PROPS_INT (rate), "channels", GST_PROPS_INT (stereo?2:1), NULL)); + break; + case 1: + caps = gst_caps_new ( + "ossgst_caps", + "audio/x-mulaw", + gst_props_new ( + "rate", GST_PROPS_INT (rate), + "channels", GST_PROPS_INT (stereo?2:1), + NULL)); + break; + case 2: + caps = gst_caps_new ( + "ossgst_caps", + "audio/x-alaw", + gst_props_new ( + "rate", GST_PROPS_INT (rate), + "channels", GST_PROPS_INT (stereo?2:1), + NULL)); + break; + } } else { g_warning ("gstossgst: program tried to use unsupported format %x\n", format); Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstosssink.c 3 Jul 2003 14:35:50 -0000 1.60 +++ gstosssink.c 6 Jul 2003 20:49:51 -0000 1.61 @@ -93,9 +93,7 @@ GST_PAD_ALWAYS, GST_CAPS_NEW ( "osssink_sink", - "audio/raw", - "format", GST_PROPS_STRING ("int"), /* hack */ - "law", GST_PROPS_INT (0), + "audio/x-raw-int", "endianness", GST_PROPS_INT (G_BYTE_ORDER), "signed", GST_PROPS_LIST ( GST_PROPS_BOOLEAN (FALSE), Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstosssrc.c 29 Jun 2003 19:46:11 -0000 1.32 +++ gstosssrc.c 6 Jul 2003 20:49:51 -0000 1.33 @@ -67,9 +67,7 @@ GST_PAD_ALWAYS, GST_CAPS_NEW ( "osssrc_src", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), + "audio/x-raw-int", "endianness", GST_PROPS_INT (G_BYTE_ORDER), "signed", GST_PROPS_LIST ( GST_PROPS_BOOLEAN (TRUE), @@ -265,15 +263,13 @@ if (gst_pad_try_set_caps (src->srcpad, GST_CAPS_NEW ( "oss_src", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (src->common.law), - "endianness", GST_PROPS_INT (src->common.endianness), - "signed", GST_PROPS_BOOLEAN (src->common.sign), - "width", GST_PROPS_INT (src->common.width), - "depth", GST_PROPS_INT (src->common.depth), - "rate", GST_PROPS_INT (src->common.rate), - "channels", GST_PROPS_INT (src->common.channels) + "audio/x-raw-int", + "endianness", GST_PROPS_INT (src->common.endianness), + "signed", GST_PROPS_BOOLEAN (src->common.sign), + "width", GST_PROPS_INT (src->common.width), + "depth", GST_PROPS_INT (src->common.depth), + "rate", GST_PROPS_INT (src->common.rate), + "channels", GST_PROPS_INT (src->common.channels) )) <= 0) { return FALSE; |
From: Ronald B. <rb...@us...> - 2003-09-13 01:23:15
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Fri Sep 12 2003 18:23:11 PDT Log message: Interface implementation example: OSS mixer. Also osscommon->osselement so it can be loaded without being a source/sink (for a stand-alone mixer) Modified files: sys/oss : Makefile.am gstossaudio.c gstosssink.c gstosssink.h gstosssrc.c gstosssrc.h Added files: sys/oss : gstosselement.c gstosselement.h gstossmixer.c gstossmixer.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.14&r2=1.15 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.3&r2=1.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.63&r2=1.64 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.13&r2=1.14 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.34&r2=1.35 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- Makefile.am 10 Aug 2003 00:03:38 -0000 1.14 +++ Makefile.am 13 Sep 2003 01:22:59 -0000 1.15 @@ -3,11 +3,12 @@ EXTRA_LTLIBRARIES = libgstosshelper.la -libgstossaudio_la_SOURCES = gstosssink.c \ +libgstossaudio_la_SOURCES = gstossaudio.c \ + gstosselement.c \ + gstossmixer.c \ + gstosssink.c \ gstosssrc.c \ - gstossaudio.c \ - gstossgst.c \ - gstosscommon.c + gstossgst.c libgstossaudio_la_CFLAGS = $(GST_CFLAGS) libgstossaudio_la_LIBADD = @@ -16,4 +17,9 @@ libgstosshelper_la_SOURCES = gstosshelper.c libgstosshelper_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstosssink.h gstosssrc.h gstossgst.h gstosshelper.h gstosscommon.h +noinst_HEADERS = gstosssink.h \ + gstosssrc.h \ + gstossgst.h \ + gstosshelper.h \ + gstosselement.h \ + gstossmixer.c Index: gstossaudio.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstossaudio.c 16 Jul 2003 16:08:14 -0000 1.3 +++ gstossaudio.c 13 Sep 2003 01:22:59 -0000 1.4 @@ -17,7 +17,11 @@ * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gstosselement.h" #include "gstosssink.h" #include "gstosssrc.h" #include "gstossgst.h" @@ -25,19 +29,16 @@ static gboolean plugin_init (GModule *module, GstPlugin *plugin) { - gboolean ret; - if (!gst_library_load ("gstaudio")) return FALSE; - ret = gst_osssink_factory_init (plugin); - g_return_val_if_fail (ret == TRUE, FALSE); - - ret = gst_osssrc_factory_init (plugin); - g_return_val_if_fail (ret == TRUE, FALSE); - - ret = gst_ossgst_factory_init (plugin); - g_return_val_if_fail (ret == TRUE, FALSE); + if (!gst_osselement_factory_init (plugin) || + !gst_osssrc_factory_init (plugin) || + !gst_osssink_factory_init (plugin) || + !gst_ossgst_factory_init (plugin)) { + g_warning ("Failed to register OSS elements!"); + return FALSE; + } return TRUE; } --- NEW FILE: gstosselement.c --- /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wim...@ch...> * * gstosssink.c: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <sys/soundcard.h> #include <unistd.h> #include <errno.h> #include <string.h> #include "gstosselement.h" #include "gstossmixer.h" enum { ARG_0, ARG_DEVICE, ARG_MIXERDEV, }; /* elementfactory information */ static GstElementDetails gst_osselement_details = { "Audio Element (OSS)", "Generic/Audio", "LGPL", "Generic OSS element", VERSION, "Erik Walthinsen <om...@cs...>", "(C) 1999", }; static void gst_osselement_class_init (GstOssElementClass *klass); 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) { static GType osselement_type = 0; if (!osselement_type) { static const GTypeInfo osselement_info = { sizeof(GstOssElementClass), NULL, NULL, (GClassInitFunc)gst_osselement_class_init, NULL, NULL, sizeof(GstOssElement), 0, (GInstanceInitFunc)gst_osselement_init, }; static const GInterfaceInfo ossiface_info = { (GInterfaceInitFunc) gst_oss_interface_init, NULL, NULL, }; static const GInterfaceInfo ossmixer_info = { (GInterfaceInitFunc) gst_ossmixer_interface_init, NULL, NULL, }; osselement_type = g_type_register_static (GST_TYPE_ELEMENT, "GstOssElement", &osselement_info, 0); g_type_add_interface_static (osselement_type, GST_TYPE_INTERFACE, &ossiface_info); g_type_add_interface_static (osselement_type, GST_TYPE_MIXER, &ossmixer_info); } return osselement_type; } static void gst_osselement_class_init (GstOssElementClass *klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; 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)); gobject_class->set_property = gst_osselement_set_property; gobject_class->get_property = gst_osselement_get_property; gobject_class->dispose = gst_osselement_dispose; gstelement_class->change_state = gst_osselement_change_state; } static void gst_osselement_init (GstOssElement *oss) { oss->device = g_strdup ("/dev/dsp"); oss->mixer_dev = g_strdup ("/dev/mixer"); oss->fd = -1; oss->mixer_fd = -1; oss->channellist = NULL; gst_osselement_reset (oss); } static void gst_osselement_dispose (GObject *object) { GstOssElement *oss = (GstOssElement *) object; g_free (oss->device); g_free (oss->mixer_dev); G_OBJECT_CLASS (parent_class)->dispose (object); } void gst_osselement_reset (GstOssElement *oss) { oss->law = 0; oss->endianness = G_BYTE_ORDER; oss->sign = TRUE; oss->width = 16; oss->depth = 16; oss->channels = 2; oss->rate = 44100; oss->fragment = 6; oss->bps = 0; /* AFMT_*_BE not available on all OSS includes (e.g. FBSD) */ #ifdef WORDS_BIGENDIAN oss->format = AFMT_S16_BE; #else oss->format = AFMT_S16_LE; #endif /* WORDS_BIGENDIAN */ } static gboolean gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint depth, gint *format, gint *bps) { if (width != depth) return FALSE; *bps = 1; if (law == 0) { if (width == 16) { if (sign == TRUE) { 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) { *format = AFMT_S16_BE; GST_DEBUG ( "16 bit signed BE, no law (%d)", *format); } } 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) { *format = AFMT_U16_BE; GST_DEBUG ( "16 bit unsigned BE, no law (%d)", *format); } } *bps = 2; } 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); } *bps = 1; } } else if (law == 1) { *format = AFMT_MU_LAW; GST_DEBUG ( "mu law (%d)", *format); } else if (law == 2) { *format = AFMT_A_LAW; GST_DEBUG ( "a law (%d)", *format); } else { g_critical ("unknown law"); return FALSE; } return TRUE; } gboolean gst_osselement_parse_caps (GstOssElement *oss, GstCaps *caps) { gint bps, format; gst_caps_get_int (caps, "width", &oss->width); gst_caps_get_int (caps, "depth", &oss->depth); if (oss->width != oss->depth) return FALSE; gst_caps_get_int (caps, "law", &oss->law); gst_caps_get_int (caps, "endianness", &oss->endianness); gst_caps_get_boolean (caps, "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_caps_get_int (caps, "channels", &oss->channels); gst_caps_get_int (caps, "rate", &oss->rate); oss->bps = bps * oss->channels * oss->rate; oss->format = format; return TRUE; } #define GET_FIXED_INT(caps, name, dest) \ G_STMT_START { \ if (gst_caps_has_fixed_property (caps, name)) \ gst_caps_get_int (caps, name, dest); \ } G_STMT_END #define GET_FIXED_BOOLEAN(caps, name, dest) \ G_STMT_START { \ if (gst_caps_has_fixed_property (caps, name)) \ gst_caps_get_boolean (caps, name, dest); \ } G_STMT_END gboolean gst_osselement_merge_fixed_caps (GstOssElement *oss, GstCaps *caps) { gint bps, format; /* peel off fixed stuff from the caps */ GET_FIXED_INT (caps, "law", &oss->law); GET_FIXED_INT (caps, "endianness", &oss->endianness); GET_FIXED_BOOLEAN (caps, "signed", &oss->sign); GET_FIXED_INT (caps, "width", &oss->width); GET_FIXED_INT (caps, "depth", &oss->depth); if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, oss->width, oss->depth, &format, &bps)) { return FALSE; } GET_FIXED_INT (caps, "rate", &oss->rate); GET_FIXED_INT (caps, "channels", &oss->channels); oss->bps = bps * oss->channels * oss->rate; oss->format = format; return TRUE; } gboolean gst_osselement_sync_parms (GstOssElement *oss) { audio_buf_info space; int frag; gint target_format; gint target_channels; gint target_rate; gint fragscale, frag_ln; 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); ioctl (oss->fd, SNDCTL_DSP_SETFRAGMENT, &frag); ioctl (oss->fd, SNDCTL_DSP_RESET, 0); target_format = oss->format; target_channels = oss->channels; target_rate = oss->rate; 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_GETBLKSIZE, &oss->fragment_size); if (oss->mode == GST_OSSELEMENT_WRITE) { ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &space); } else { ioctl (oss->fd, SNDCTL_DSP_GETISPACE, &space); } /* calculate new fragment using a poor man's logarithm function */ fragscale = 1; frag_ln = 0; while (fragscale < space.fragsize) { fragscale <<= 1; 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); oss->fragment_time = (GST_SECOND * oss->fragment_size) / oss->bps; 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) { g_warning ("couldn't set requested OSS parameters, enjoy the noise :)"); /* we could eventually return FALSE here, or just do some additional tests * to see that the frequencies don't differ too much etc.. */ } return TRUE; } static gboolean gst_osselement_open_audio (GstOssElement *oss) { gint caps; GstOssOpenMode mode = GST_OSSELEMENT_READ; const GList *padlist; g_return_val_if_fail (oss->fd == -1, FALSE); GST_INFO ("osselement: attempting to open sound device"); /* Ok, so how do we open the device? We assume that we have (max.) one * pad, and if this is a sinkpad, we're osssink (w). else, we're osssrc (r) */ 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; } } /* first try to open the sound card */ if (mode == GST_OSSELEMENT_WRITE) { /* open non blocking first so that it returns immediatly with an error * when we cannot get to the device */ oss->fd = open (oss->device, O_WRONLY | O_NONBLOCK); if (oss->fd >= 0) { close (oss->fd); /* re-open the sound device in blocking mode */ oss->fd = open (oss->device, O_WRONLY); } } else { oss->fd = open (oss->device, O_RDONLY); } if (oss->fd < 0) { switch (errno) { case EBUSY: gst_element_error (GST_ELEMENT (oss), "osselement: Unable to open %s (in use ?)", oss->device); break; case EISDIR: gst_element_error (GST_ELEMENT (oss), "osselement: Device %s is a directory", oss->device); break; case EACCES: case ETXTBSY: gst_element_error (GST_ELEMENT (oss), "osselement: Cannot access %s, check permissions", oss->device); break; case ENXIO: case ENODEV: case ENOENT: gst_element_error (GST_ELEMENT (oss), "osselement: Cannot access %s, does it exist ?", oss->device); break; case EROFS: gst_element_error (GST_ELEMENT (oss), "osselement: Cannot access %s, read-only filesystem ?", oss->device); default: /* FIXME: strerror is not threadsafe */ gst_element_error (GST_ELEMENT (oss), "osselement: Cannot open %s, generic error: %s", oss->device, strerror (errno)); break; } return FALSE; } oss->mode = mode; /* we have it, set the default parameters and go have fun */ /* set card state */ ioctl (oss->fd, SNDCTL_DSP_GETCAPS, &caps); 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"); #ifdef DSP_CAP_MULTI 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"); #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"); #ifdef AFMT_AC3 if (caps & AFMT_AC3) GST_INFO ( "osselement: AC3"); #endif GST_INFO ("osselement: opened audio (%s) with fd=%d", oss->device, oss->fd); oss->caps = caps; gst_ossmixer_build_list (oss); return TRUE; } static void gst_osselement_close_audio (GstOssElement *oss) { if (oss->fd < 0) return; gst_ossmixer_free_list (oss); close(oss->fd); oss->fd = -1; } gboolean gst_osselement_convert (GstOssElement *oss, GstFormat src_format, gint64 src_value, GstFormat *dest_format, gint64 *dest_value) { gboolean res = TRUE; if (src_format == *dest_format) { *dest_value = src_value; return TRUE; } if (oss->bps == 0 || oss->channels == 0 || oss->width == 0) return FALSE; switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / oss->bps; break; case GST_FORMAT_DEFAULT: *dest_value = src_value / (oss->channels * oss->width); break; default: res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: *dest_value = src_value * oss->bps / GST_SECOND; break; case GST_FORMAT_DEFAULT: *dest_value = src_value * oss->rate / GST_SECOND; break; default: res = FALSE; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / oss->rate; break; case GST_FORMAT_BYTES: *dest_value = src_value * oss->channels * oss->width; break; default: res = FALSE; } break; default: res = FALSE; } return res; } static void gst_osselement_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GstOssElement *oss = GST_OSSELEMENT (object); switch (prop_id) { case ARG_DEVICE: /* 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)); } 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)); } break; default: break; } } static void gst_osselement_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GstOssElement *oss = GST_OSSELEMENT (object); switch (prop_id) { case ARG_DEVICE: g_value_set_string (value, oss->device); break; case ARG_MIXERDEV: g_value_set_string (value, oss->mixer_dev); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } 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; } GST_INFO ("osselement: opened sound device"); break; case GST_STATE_READY_TO_NULL: gst_osselement_close_audio (oss); gst_osselement_reset (oss); GST_INFO ("osselement: closed sound device"); break; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; } gboolean gst_osselement_factory_init (GstPlugin *plugin) { GstElementFactory *factory; factory = gst_element_factory_new ("osselement", GST_TYPE_OSSELEMENT, &gst_osselement_details); g_return_val_if_fail (factory != NULL, FALSE); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); return TRUE; } --- NEW FILE: gstosselement.h --- /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wim...@ch...> * * gstosselement.h: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_OSS_ELEMENT_H__ #define __GST_OSS_ELEMENT_H__ #include <gst/gst.h> G_BEGIN_DECLS #define GST_TYPE_OSSELEMENT \ (gst_osselement_get_type()) #define GST_OSSELEMENT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSELEMENT,GstOssElement)) #define GST_OSSELEMENT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSELEMENT,GstOssElementClass)) #define GST_IS_OSSELEMENT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSELEMENT)) #define GST_IS_OSSELEMENT_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSELEMENT)) typedef struct _GstOssElement GstOssElement; typedef struct _GstOssElementClass GstOssElementClass; typedef enum { GST_OSSELEMENT_READ, GST_OSSELEMENT_WRITE, } GstOssOpenMode; struct _GstOssElement { /* yes, we're a gstelement too */ GstElement parent; gchar *device, *mixer_dev; /* device state */ int fd; int caps; /* the capabilities */ gint format; gint fragment; guint64 fragment_time; gint fragment_size; GstOssOpenMode mode; /* stats */ guint bps; /* parameters */ gint law; gint endianness; gboolean sign; gint width; gint depth; gint channels; gint rate; /* mixer stuff */ GList *channellist; guint32 stereomask, recdevs, recmask, mixcaps; gint mixer_fd; }; struct _GstOssElementClass { GstElementClass klass; }; GType gst_osselement_get_type (void); /* factory register function */ gboolean gst_osselement_factory_init (GstPlugin *plugin); /* some useful functions */ gboolean gst_osselement_parse_caps (GstOssElement *oss, 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); G_END_DECLS #endif /* __GST_OSS_ELEMENT_H__ */ --- NEW FILE: gstossmixer.c --- /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wim...@ch...> * * gstossmixer.h: mixer interface implementation for OSS * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include "gstossmixer.h" #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) static gboolean gst_ossmixer_supported (GstInterface *iface); static const GList * gst_ossmixer_list_channels (GstMixer *ossmixer); static void gst_ossmixer_set_volume (GstMixer *ossmixer, GstMixerChannel *channel, gint *volumes); static void gst_ossmixer_get_volume (GstMixer *ossmixer, GstMixerChannel *channel, gint *volumes); static void gst_ossmixer_set_record (GstMixer *ossmixer, GstMixerChannel *channel, gboolean record); static void gst_ossmixer_set_mute (GstMixer *ossmixer, GstMixerChannel *channel, gboolean mute); static const gchar *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; GstMixerChannel * gst_ossmixer_channel_new (GstOssElement *oss, gint channel_num, gint max_chans, gint flags) { GstMixerChannel *channel = (GstMixerChannel *) g_new (GstOssMixerChannel, 1); gint volumes[2]; channel->label = g_strdup (labels[channel_num]); channel->num_channels = max_chans; channel->flags = flags; channel->min_volume = 0; channel->max_volume = 100; ((GstOssMixerChannel *) channel)->channel_num = channel_num; /* volume */ gst_ossmixer_get_volume (GST_MIXER (oss), channel, volumes); if (max_chans == 1) { volumes[1] = 0; } ((GstOssMixerChannel *) channel)->lvol = volumes[0]; ((GstOssMixerChannel *) channel)->rvol = volumes[1]; return channel; } void gst_ossmixer_channel_free (GstMixerChannel *channel) { g_free (channel->label); g_free (channel); } void gst_oss_interface_init (GstInterfaceClass *klass) { /* default virtual functions */ klass->supported = gst_ossmixer_supported; } void gst_ossmixer_interface_init (GstMixerClass *klass) { /* default virtual functions */ klass->list_channels = gst_ossmixer_list_channels; klass->set_volume = gst_ossmixer_set_volume; klass->get_volume = gst_ossmixer_get_volume; klass->set_mute = gst_ossmixer_set_mute; klass->set_record = gst_ossmixer_set_record; } static gboolean gst_ossmixer_supported (GstInterface *iface) { return (GST_OSSELEMENT (iface)->mixer_fd != -1); } static const GList * gst_ossmixer_list_channels (GstMixer *mixer) { GstOssElement *oss = GST_OSSELEMENT (mixer); g_return_val_if_fail (oss->mixer_fd != -1, NULL); return (const GList *) GST_OSSELEMENT (mixer)->channellist; } static void gst_ossmixer_get_volume (GstMixer *mixer, GstMixerChannel *channel, gint *volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerChannel *osschannel = (GstOssMixerChannel *) channel; g_return_if_fail (oss->mixer_fd != -1); if (channel->flags & GST_MIXER_CHANNEL_MUTE) { volumes[0] = osschannel->lvol; if (channel->num_channels == 2) { volumes[1] = osschannel->rvol; } } else { /* get */ if (ioctl(oss->mixer_fd, MIXER_READ (osschannel->channel_num), &volume) < 0) { g_warning("Error getting recording device (%d) volume (0x%x): %s\n", osschannel->channel_num, volume, strerror(errno)); volume = 0; } osschannel->lvol = volumes[0] = (volume & 0xff); if (channel->num_channels == 2) { osschannel->rvol = volumes[1] = ((volume >> 8) & 0xff); } } } static void gst_ossmixer_set_volume (GstMixer *mixer, GstMixerChannel *channel, gint *volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerChannel *osschannel = (GstOssMixerChannel *) channel; g_return_if_fail (oss->mixer_fd != -1); /* prepare the value for ioctl() */ if (!(channel->flags & GST_MIXER_CHANNEL_MUTE)) { volume = (volumes[0] & 0xff); if (channel->num_channels == 2) { volume |= ((volumes[1] & 0xff) << 8); } /* set */ if (ioctl(oss->mixer_fd, MIXER_WRITE (osschannel->channel_num), &volume) < 0) { g_warning("Error setting recording device (%d) volume (0x%x): %s\n", osschannel->channel_num, volume, strerror(errno)); return; } } osschannel->lvol = volumes[0]; if (channel->num_channels == 2) { osschannel->rvol = volumes[1]; } } static void gst_ossmixer_set_mute (GstMixer *mixer, GstMixerChannel *channel, gboolean mute) { int volume; GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerChannel *osschannel = (GstOssMixerChannel *) channel; g_return_if_fail (oss->mixer_fd != -1); if (mute) { volume = 0; } else { volume = (osschannel->lvol & 0xff); if (MASK_BIT_IS_SET (oss->stereomask, osschannel->channel_num)) { volume |= ((osschannel->rvol & 0xff) << 8); } } if (ioctl(oss->mixer_fd, MIXER_WRITE(osschannel->channel_num), &volume) < 0) { g_warning("Error setting mixer recording device volume (0x%x): %s", volume, strerror(errno)); return; } if (mute) { channel->flags |= GST_MIXER_CHANNEL_MUTE; } else { channel->flags &= ~GST_MIXER_CHANNEL_MUTE; } } static void gst_ossmixer_set_record (GstMixer *mixer, GstMixerChannel *channel, gboolean record) { GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerChannel *osschannel = (GstOssMixerChannel *) channel; g_return_if_fail (oss->mixer_fd != -1); /* if we're exclusive, then we need to unset the current one(s) */ if (oss->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *channel; for (channel = oss->channellist; channel != NULL; channel = channel->next) { GstMixerChannel *turn = (GstMixerChannel *) channel->data; turn->flags &= ~GST_MIXER_CHANNEL_RECORD; } oss->recdevs = 0; } /* set new record bit, if needed */ if (record) { oss->recdevs |= (1 << osschannel->channel_num); } else { oss->recdevs &= ~(1 << osschannel->channel_num); } /* 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)); return; } if (record) { channel->flags |= GST_MIXER_CHANNEL_RECORD; } else { channel->flags &= ~GST_MIXER_CHANNEL_RECORD; } } void gst_ossmixer_build_list (GstOssElement *oss) { gint i, devmask; g_return_if_fail (oss->mixer_fd == -1); oss->mixer_fd = open (oss->mixer_dev, O_RDWR); if (oss->mixer_fd == -1) { g_warning ("Failed to open mixer device %s, mixing disabled: %s", oss->mixer_dev, strerror (errno)); return; } /* get masks */ ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECMASK, &oss->recmask); ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECSRC, &oss->recdevs); ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask); ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask); ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps); /* build channel list */ for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { if (devmask & (1 << i)) { GstMixerChannel *channel; gboolean input = FALSE, stereo = FALSE, record = FALSE; /* channel exists, make up capabilities */ if (MASK_BIT_IS_SET (oss->stereomask, i)) stereo = TRUE; if (MASK_BIT_IS_SET (oss->recmask, i)) input = TRUE; if (MASK_BIT_IS_SET (oss->recdevs, i)) record = TRUE; /* add channel to list */ channel = gst_ossmixer_channel_new (oss, i, stereo ? 2 : 1, (record ? GST_MIXER_CHANNEL_RECORD : 0) | (input ? GST_MIXER_CHANNEL_INPUT : GST_MIXER_CHANNEL_OUTPUT)); oss->channellist = g_list_append (oss->channellist, channel); } } } void gst_ossmixer_free_list (GstOssElement *oss) { g_return_if_fail (oss->mixer_fd != -1); g_list_foreach (oss->channellist, (GFunc) gst_ossmixer_channel_free, NULL); g_list_free (oss->channellist); oss->channellist = NULL; close (oss->mixer_fd); oss->mixer_fd = -1; } --- NEW FILE: gstossmixer.h --- /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wim...@ch...> * * gstossmixer.h: mixer interface implementation for OSS * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_OSS_MIXER_H__ #define __GST_OSS_MIXER_H__ #include <gst/gst.h> #include <gst/mixer/mixer.h> #include "gstosselement.h" G_BEGIN_DECLS typedef struct _GstOssMixerChannel { GstMixerChannel parent; gint lvol, rvol; gint channel_num; } GstOssMixerChannel; void gst_ossmixer_interface_init (GstMixerClass *klass); void gst_oss_interface_init (GstInterfaceClass *klass); void gst_ossmixer_build_list (GstOssElement *oss); void gst_ossmixer_free_list (GstOssElement *oss); G_END_DECLS #endif /* __GST_OSS_MIXER_H__ */ Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- gstosssink.c 28 Jul 2003 11:37:49 -0000 1.63 +++ gstosssink.c 13 Sep 2003 01:22:59 -0000 1.64 @@ -45,7 +45,6 @@ static void gst_osssink_class_init (GstOssSinkClass *klass); static void gst_osssink_init (GstOssSink *osssink); static void gst_osssink_dispose (GObject *object); -static void gst_osssink_finalize (GObject *object); static GstElementStateReturn gst_osssink_change_state (GstElement *element); static void gst_osssink_set_clock (GstElement *element, GstClock *clock); @@ -78,7 +77,6 @@ enum { ARG_0, - ARG_DEVICE, ARG_MUTE, ARG_FRAGMENT, ARG_BUFFER_SIZE, @@ -132,7 +130,7 @@ 0, (GInstanceInitFunc)gst_osssink_init, }; - osssink_type = g_type_register_static (GST_TYPE_ELEMENT, "GstOssSink", &osssink_info, 0); + osssink_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSink", &osssink_info, 0); } return osssink_type; @@ -163,16 +161,6 @@ } static void -gst_osssink_finalize (GObject *object) -{ - GstOssSink *osssink = (GstOssSink *) object; - - g_free (osssink->common.device); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void gst_osssink_class_init (GstOssSinkClass *klass) { GObjectClass *gobject_class; @@ -181,11 +169,8 @@ gobject_class = (GObjectClass*)klass; gstelement_class = (GstElementClass*)klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref(GST_TYPE_OSSELEMENT); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE, - g_param_spec_string ("device", "Device", "The device to use for output", - "/dev/dsp", G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUTE, g_param_spec_boolean ("mute", "Mute", "Mute the audio", FALSE, G_PARAM_READWRITE)); @@ -211,7 +196,6 @@ gobject_class->set_property = gst_osssink_set_property; gobject_class->get_property = gst_osssink_get_property; gobject_class->dispose = gst_osssink_dispose; - gobject_class->finalize = gst_osssink_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_osssink_change_state); gstelement_class->query = GST_DEBUG_FUNCPTR (gst_osssink_query); @@ -235,8 +219,6 @@ gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); - gst_osscommon_init (&osssink->common); - osssink->bufsize = 4096; osssink->chunk_size = 4096; osssink->resync = FALSE; @@ -260,10 +242,10 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_LINK_DELAYED; - if (!gst_osscommon_parse_caps (&osssink->common, caps)) + if (!gst_osselement_parse_caps (GST_OSSELEMENT (osssink), caps)) return GST_PAD_LINK_REFUSED; - if (!gst_osscommon_sync_parms (&osssink->common)) { + if (!gst_osselement_sync_parms (GST_OSSELEMENT (osssink))) { return GST_PAD_LINK_REFUSED; } @@ -275,12 +257,12 @@ { gint delay = 0; - if (osssink->common.fd == -1) + if (GST_OSSELEMENT (osssink)->fd == -1) return 0; - if (ioctl (osssink->common.fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { + if (ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { audio_buf_info info; - if (ioctl (osssink->common.fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { + if (ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { delay = 0; } else { @@ -297,7 +279,7 @@ gint delay; GstClockTime res; - if (!osssink->common.bps) + if (!GST_OSSELEMENT (osssink)->bps) return 0; delay = gst_osssink_get_delay (osssink); @@ -308,7 +290,7 @@ if (((guint64)delay) > osssink->handled) { delay = osssink->handled; } - res = (osssink->handled - delay) * GST_SECOND / osssink->common.bps; + res = (osssink->handled - delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; return res; } @@ -347,7 +329,7 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - ioctl (osssink->common.fd, SNDCTL_DSP_SYNC); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_SYNC); gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); gst_pad_event_default (pad, event); return; @@ -355,7 +337,7 @@ { gint64 value; - ioctl (osssink->common.fd, SNDCTL_DSP_RESET); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); @@ -372,7 +354,7 @@ return; } - if (!osssink->common.bps) { + if (!GST_OSSELEMENT (osssink)->bps) { gst_buffer_unref (buf); gst_element_error (GST_ELEMENT (osssink), "capsnego was never performed, unknown data type"); return; @@ -380,7 +362,7 @@ buftime = GST_BUFFER_TIMESTAMP (buf); - if (osssink->common.fd >= 0) { + if (GST_OSSELEMENT (osssink)->fd >= 0) { if (!osssink->mute) { guchar *data = GST_BUFFER_DATA (buf); gint size = GST_BUFFER_SIZE (buf); @@ -392,7 +374,7 @@ GstClockTimeDiff jitter; delay = gst_osssink_get_delay (osssink); - queued = delay * GST_SECOND / osssink->common.bps; + queued = delay * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (osssink->resync && osssink->sync) { GstClockID id = gst_clock_new_single_shot_id (osssink->clock, buftime - queued); @@ -415,7 +397,7 @@ else { audio_buf_info ospace; - ioctl (osssink->common.fd, SNDCTL_DSP_GETOSPACE, &ospace); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_GETOSPACE, &ospace); if (ospace.bytes >= size) { to_write = size; @@ -423,7 +405,7 @@ } while (to_write > 0) { - gint done = write (osssink->common.fd, data, + gint done = write (GST_OSSELEMENT (osssink)->fd, data, MIN (to_write, osssink->chunk_size)); if (done == -1) { @@ -464,8 +446,9 @@ osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - return gst_osscommon_convert (&osssink->common, src_format, src_value, - dest_format, dest_value); + return gst_osselement_convert (GST_OSSELEMENT (osssink), + src_format, src_value, + dest_format, dest_value); } static const GstQueryType* @@ -528,23 +511,13 @@ osssink = GST_OSSSINK (object); switch (prop_id) { - case ARG_DEVICE: - /* disallow changing the device while it is opened - get_property("device") should return the right one */ - if (!GST_FLAG_IS_SET (osssink, GST_OSSSINK_OPEN)) - { - g_free (osssink->common.device); - osssink->common.device = g_strdup (g_value_get_string (value)); - g_object_notify (object, "device"); - } - break; case ARG_MUTE: osssink->mute = g_value_get_boolean (value); g_object_notify (G_OBJECT (osssink), "mute"); break; case ARG_FRAGMENT: - osssink->common.fragment = g_value_get_int (value); - gst_osscommon_sync_parms (&osssink->common); + GST_OSSELEMENT (osssink)->fragment = g_value_get_int (value); + gst_osselement_sync_parms (GST_OSSELEMENT (osssink)); break; case ARG_BUFFER_SIZE: osssink->bufsize = g_value_get_uint (value); @@ -572,14 +545,11 @@ osssink = GST_OSSSINK (object); switch (prop_id) { - case ARG_DEVICE: - g_value_set_string (value, osssink->common.device); - break; case ARG_MUTE: g_value_set_boolean (value, osssink->mute); break; case ARG_FRAGMENT: - g_value_set_int (value, osssink->common.fragment); + g_value_set_int (value, GST_OSSELEMENT (osssink)->fragment); break; case ARG_BUFFER_SIZE: g_value_set_uint (value, osssink->bufsize); @@ -604,43 +574,23 @@ osssink = GST_OSSSINK (element); switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_NULL_TO_READY: - if (!GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { - gchar *error; - - if (!gst_osscommon_open_audio (&osssink->common, GST_OSSCOMMON_WRITE, &error)) { - gst_element_error (GST_ELEMENT (osssink), error); - g_free (error); - return GST_STATE_FAILURE; - } - GST_FLAG_SET (element, GST_OSSSINK_OPEN); - } - break; case GST_STATE_READY_TO_PAUSED: break; case GST_STATE_PAUSED_TO_PLAYING: osssink->resync = TRUE; break; case GST_STATE_PLAYING_TO_PAUSED: - { if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (osssink->common.fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); osssink->resync = TRUE; break; - } case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (osssink->common.fd, SNDCTL_DSP_RESET, 0); - gst_osscommon_reset (&osssink->common); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); + gst_osselement_reset (GST_OSSELEMENT (osssink)); break; - case GST_STATE_READY_TO_NULL: - if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { - gst_osscommon_close_audio (&osssink->common); - GST_FLAG_UNSET (osssink, GST_OSSSINK_OPEN); - - GST_INFO ( "osssink: closed sound device"); - } + default: break; } Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstosssink.h 16 Jul 2003 16:08:14 -0000 1.13 +++ gstosssink.h 13 Sep 2003 01:22:59 -0000 1.14 @@ -27,7 +27,7 @@ #include <gst/gst.h> -#include "gstosscommon.h" +#include "gstosselement.h" #include <gst/audio/audioclock.h> G_BEGIN_DECLS @@ -53,7 +53,7 @@ typedef struct _GstOssSinkClass GstOssSinkClass; struct _GstOssSink { - GstElement element; + GstOssElement element; GstPad *sinkpad; GstBufferPool *sinkpool; @@ -64,12 +64,9 @@ gboolean sync; guint64 handled; - GstOssCommon common; - gboolean mute; guint bufsize; guint chunk_size; - }; struct _GstOssSinkClass { Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstosssrc.c 16 Jul 2003 16:08:14 -0000 1.34 +++ gstosssrc.c 13 Sep 2003 01:22:59 -0000 1.35 @@ -33,7 +33,7 @@ #include <string.h> #include <gstosssrc.h> -#include <gstosscommon.h> +#include <gstosselement.h> #include <gst/audio/audioclock.h> /* elementfactory information */ @@ -56,7 +56,6 @@ enum { ARG_0, - ARG_DEVICE, ARG_BUFFERSIZE, ARG_FRAGMENT, }; @@ -89,7 +88,6 @@ static void gst_osssrc_class_init (GstOssSrcClass *klass); static void gst_osssrc_init (GstOssSrc *osssrc); static void gst_osssrc_dispose (GObject *object); -static void gst_osssrc_finalize (GObject *object); static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps); static const GstFormat* gst_osssrc_get_formats (GstPad *pad); @@ -136,7 +134,7 @@ 0, (GInstanceInitFunc)gst_osssrc_init, }; - osssrc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstOssSrc", &osssrc_info, 0); + osssrc_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, 0); } return osssrc_type; } @@ -150,14 +148,11 @@ gobject_class = (GObjectClass*)klass; gstelement_class = (GstElementClass*)klass; - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + 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_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_FRAGMENT, g_param_spec_int ("fragment", "Fragment", "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", @@ -166,7 +161,6 @@ gobject_class->set_property = gst_osssrc_set_property; gobject_class->get_property = gst_osssrc_get_property; gobject_class->dispose = gst_osssrc_dispose; - gobject_class->finalize = gst_osssrc_finalize; gstelement_class->change_state = gst_osssrc_change_state; gstelement_class->send_event = gst_osssrc_send_event; @@ -192,8 +186,6 @@ gst_element_add_pad (GST_ELEMENT (osssrc), osssrc->srcpad); - gst_osscommon_init (&osssrc->common); - osssrc->buffersize = 4096; osssrc->curoffset = 0; @@ -202,6 +194,7 @@ osssrc->clock = NULL; } + static void gst_osssrc_dispose (GObject *object) { @@ -211,16 +204,6 @@ G_OBJECT_CLASS (parent_class)->dispose (object); } -static void -gst_osssrc_finalize (GObject *object) -{ - GstOssSrc *osssrc = (GstOssSrc *) object; - - g_free (osssrc->common.device); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps) @@ -232,10 +215,10 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_LINK_DELAYED; - if (!gst_osscommon_parse_caps (&src->common, caps)) + if (!gst_osselement_parse_caps (GST_OSSELEMENT (src), caps)) return GST_PAD_LINK_REFUSED; - if (!gst_osscommon_sync_parms (&src->common)) + if (!gst_osselement_sync_parms (GST_OSSELEMENT (src))) return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_OK; @@ -251,10 +234,10 @@ allowed = gst_pad_get_allowed_caps (pad); - if (!gst_osscommon_merge_fixed_caps (&src->common, allowed)) + if (!gst_osselement_merge_fixed_caps (GST_OSSELEMENT (src), allowed)) return FALSE; - if (!gst_osscommon_sync_parms (&src->common)) + if (!gst_osselement_sync_parms (GST_OSSELEMENT (src))) return FALSE; /* set caps on src pad */ @@ -262,12 +245,12 @@ GST_CAPS_NEW ( "oss_src", "audio/x-raw-int", - "endianness", GST_PROPS_INT (src->common.endianness), - "signed", GST_PROPS_BOOLEAN (src->common.sign), - "width", GST_PROPS_INT (src->common.width), - "depth", GST_PROPS_INT (src->common.depth), - "rate", GST_PROPS_INT (src->common.rate), - "channels", GST_PROPS_INT (src->common.channels) + "endianness", GST_PROPS_INT (GST_OSSELEMENT (src)->endianness), + "signed", GST_PROPS_BOOLEAN (GST_OSSELEMENT (src)->sign), + "width", GST_PROPS_INT (GST_OSSELEMENT (src)->width), + "depth", GST_PROPS_INT (GST_OSSELEMENT (src)->depth), + "rate", GST_PROPS_INT (GST_OSSELEMENT (src)->rate), + "channels", GST_PROPS_INT (GST_OSSELEMENT (src)->channels) )) <= 0) { return FALSE; @@ -281,13 +264,13 @@ GstOssSrc *osssrc = GST_OSSSRC (data); audio_buf_info info; - if (!osssrc->common.bps) + if (!GST_OSSELEMENT (osssrc)->bps) return 0; - if (ioctl(osssrc->common.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 / osssrc->common.bps; + return (osssrc->curoffset + info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; } static GstClock* @@ -336,13 +319,13 @@ return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); } } - if (src->common.bps == 0) { + if (GST_OSSELEMENT (src)->bps == 0) { gst_buffer_unref (buf); gst_element_error (GST_ELEMENT (src), "no format negotiated"); return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); } - readbytes = read (src->common.fd,GST_BUFFER_DATA (buf), + readbytes = read (GST_OSSELEMENT (src)->fd,GST_BUFFER_DATA (buf), src->buffersize); if (readbytes < 0) { gst_buffer_unref (buf); @@ -361,7 +344,9 @@ 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 / src->common.bps; + 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; @@ -382,13 +367,9 @@ case ARG_BUFFERSIZE: src->buffersize = g_value_get_ulong (value); break; - case ARG_DEVICE: - g_free(src->common.device); - src->common.device = g_strdup (g_value_get_string (value)); - break; case ARG_FRAGMENT: - src->common.fragment = g_value_get_int (value); - gst_osscommon_sync_parms (&src->common); + GST_OSSELEMENT (src)->fragment = g_value_get_int (value); + gst_osselement_sync_parms (GST_OSSELEMENT (src)); break; default: break; @@ -406,11 +387,8 @@ case ARG_BUFFERSIZE: g_value_set_ulong (value, src->buffersize); break; - case ARG_DEVICE: - g_value_set_string (value, src->common.device); - break; case ARG_FRAGMENT: - g_value_set_int (value, src->common.fragment); + g_value_set_int (value, GST_OSSELEMENT (src)->fragment); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -426,17 +404,6 @@ GST_DEBUG ("osssrc: state change"); switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_NULL_TO_READY: - if (!GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { - gchar *error; - if (!gst_osscommon_open_audio (&osssrc->common, GST_OSSCOMMON_READ, &error)) { - gst_element_error (GST_ELEMENT (osssrc), error); - g_free (error); - return GST_STATE_FAILURE; - } - GST_FLAG_SET (osssrc, GST_OSSSRC_OPEN); - } - break; case GST_STATE_READY_TO_PAUSED: osssrc->curoffset = 0; break; @@ -448,14 +415,9 @@ break; case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - ioctl (osssrc->common.fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); break; - case GST_STATE_READY_TO_NULL: - if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { - gst_osscommon_close_audio (&osssrc->common); - GST_FLAG_UNSET (osssrc, GST_OSSSRC_OPEN); - } - gst_osscommon_init (&osssrc->common); + default: break; } @@ -485,7 +447,7 @@ osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); - return gst_osscommon_convert (&osssrc->common, src_format, src_value, + return gst_osselement_convert (GST_OSSELEMENT (osssrc), src_format, src_value, dest_format, dest_value); } @@ -521,10 +483,10 @@ format = GST_FORMAT_BYTES; /* convert to bytes */ - if (gst_osscommon_convert (&osssrc->common, - GST_EVENT_SIZE_FORMAT (event), - GST_EVENT_SIZE_VALUE (event), - &format, &value)) + 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"); @@ -567,9 +529,9 @@ switch (type) { case GST_QUERY_POSITION: - res = gst_osscommon_convert (&osssrc->common, - GST_FORMAT_BYTES, osssrc->curoffset, - format, value); + res = gst_osselement_convert (GST_OSSELEMENT (osssrc), + GST_FORMAT_BYTES, osssrc->curoffset, + format, value); break; default: break; Index: gstosssrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstosssrc.h 30 Mar 2003 21:19:08 -0000 1.7 +++ gstosssrc.h 13 Sep 2003 01:22:59 -0000 1.8 @@ -26,7 +26,7 @@ #include <gst/gst.h> -#include "gstosscommon.h" +#include "gstosselement.h" G_BEGIN_DECLS @@ -51,12 +51,10 @@ typedef struct _GstOssSrcClass GstOssSrcClass; struct _GstOssSrc { - GstElement element; + GstOssElement element; /* pads */ GstPad *srcpad; - - GstOssCommon common; gboolean need_eos; /* Do we need to emit an EOS? */ |
From: Ronald B. <rb...@us...> - 2003-09-13 13:38:04
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sat Sep 13 2003 06:38:01 PDT Log message: Fix missing symbol Modified files: sys/oss : Makefile.am Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.17&r2=1.18 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- Makefile.am 13 Sep 2003 11:47:13 -0000 1.17 +++ Makefile.am 13 Sep 2003 13:37:49 -0000 1.18 @@ -11,7 +11,7 @@ gstossgst.c libgstossaudio_la_CFLAGS = $(GST_CFLAGS) -libgstossaudio_la_LIBADD = +libgstossaudio_la_LIBADD = $(top_builddir)/gst-libs/gst/mixer/libgstmixer.la libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstosshelper_la_SOURCES = gstosshelper.c |
From: Ronald B. <rb...@us...> - 2003-09-13 15:48:14
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sat Sep 13 2003 08:48:11 PDT Log message: Make interface hack work with multiple interfaces per element Modified files: sys/oss : gstossmixer.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstossmixer.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstossmixer.c 13 Sep 2003 13:42:09 -0000 1.2 +++ gstossmixer.c 13 Sep 2003 15:47:59 -0000 1.3 @@ -37,7 +37,8 @@ #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) -static gboolean gst_ossmixer_supported (GstInterface *iface); +static gboolean gst_ossmixer_supported (GstInterface *iface, + GType iface_type); static const GList * gst_ossmixer_list_channels (GstMixer *ossmixer); @@ -111,8 +112,11 @@ } static gboolean -gst_ossmixer_supported (GstInterface *iface) +gst_ossmixer_supported (GstInterface *iface, + GType iface_type) { + g_assert (iface_type == GST_TYPE_MIXER); + return (GST_OSSELEMENT (iface)->mixer_fd != -1); } |
From: Ronald B. <rb...@us...> - 2003-09-29 12:46:49
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Mon Sep 29 2003 05:01:54 PDT Log message: I thought I removed these two... Removed files: sys/oss : gstosscommon.c gstosscommon.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.h ====Begin Diffs==== --- gstosscommon.c DELETED --- --- gstosscommon.h DELETED --- |
From: Ronald B. <rb...@us...> - 2003-10-14 10:09:43
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Oct 14 2003 03:09:41 PDT Log message: Typo fix Modified files: sys/oss : gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstosselement.c 10 Oct 2003 12:24:20 -0000 1.5 +++ gstosselement.c 14 Oct 2003 10:09:29 -0000 1.6 @@ -131,7 +131,7 @@ 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_MIXERDEV, + 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)); |
From: Ronald B. <rb...@us...> - 2003-10-14 10:11:28
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Oct 14 2003 03:11:26 PDT Log message: Set labels on mixer manually. This allows clearer names and - in the future - i18n Modified files: sys/oss : gstossmixer.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstossmixer.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstossmixer.c 10 Oct 2003 12:24:20 -0000 1.5 +++ gstossmixer.c 14 Oct 2003 10:11:14 -0000 1.6 @@ -59,9 +59,71 @@ GstMixerTrack *track, gboolean mute); -static const gchar *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; +static const gchar **labels = NULL; static GstMixerTrackClass *parent_class = NULL; +/* three functions: firstly, OSS has the nasty habit of inserting + * spaces in the labels, we want to get rid of them. Secondly, + * i18n is impossible with OSS' way of providing us with mixer + * labels, so we make a 'given' list of i18n'ed labels. Since + * i18n doesn't actually work, we fake it (FIXME). Thirdly, I + * personally don't like the "1337" names that OSS gives to their + * labels ("Vol", "Mic", "Rec"), I'd rather see full names. */ +#define _(s) s + +static void +fill_labels (void) +{ + gint i, pos; + gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; + 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 } + }; + + labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); + + 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; + } + } + if (cases[pos].given == NULL) + labels[i] = g_strdup (origs[i]); + } +} GType gst_ossmixer_track_get_type (void) @@ -112,7 +174,10 @@ { GstOssMixerTrack *osstrack; GstMixerTrack *track; - gint volumes[2]; + gint volume; + + if (!labels) + fill_labels (); osstrack = g_object_new (GST_TYPE_OSSMIXER_TRACK, NULL); track = GST_MIXER_TRACK (osstrack); @@ -124,10 +189,15 @@ osstrack->track_num = track_num; /* volume */ - gst_ossmixer_get_volume (GST_MIXER (oss), track, volumes); - osstrack->lvol = volumes[0]; - if (max_chans == 2) - osstrack->rvol = volumes[1]; + 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); + if (track->num_channels == 2) { + osstrack->rvol = ((volume >> 8) & 0xff); + } return track; } @@ -199,8 +269,8 @@ } else { /* get */ if (ioctl(oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning("Error getting recording device (%d) volume (0x%x): %s\n", - osstrack->track_num, volume, strerror(errno)); + g_warning("Error getting recording device (%d) volume: %s", + osstrack->track_num, strerror(errno)); volume = 0; } @@ -233,7 +303,7 @@ /* set */ if (ioctl(oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { - g_warning("Error setting recording device (%d) volume (0x%x): %s\n", + g_warning("Error setting recording device (%d) volume (0x%x): %s", osstrack->track_num, volume, strerror(errno)); return; } |
From: Ronald B. <rb...@us...> - 2003-10-26 12:19:49
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sun Oct 26 2003 04:16:55 PST Log message: Rename osselement to ossmixer and only open audio device if we have at least one pad. This makes ossmixer *only* open the mixer, which means we can open multiple mixer sessions. Modified files: sys/oss : gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstosselement.c 14 Oct 2003 10:09:29 -0000 1.6 +++ gstosselement.c 26 Oct 2003 12:16:43 -0000 1.7 @@ -412,6 +412,8 @@ if (GST_PAD_IS_SINK (firstpad)) { mode = GST_OSSELEMENT_WRITE; } + } else { + goto do_mixer; } /* first try to open the sound card */ @@ -515,6 +517,7 @@ oss->caps = caps; +do_mixer: gst_ossmixer_build_list (oss); return TRUE; @@ -523,10 +526,11 @@ static void gst_osselement_close_audio (GstOssElement *oss) { + gst_ossmixer_free_list (oss); + if (oss->fd < 0) return; - gst_ossmixer_free_list (oss); close(oss->fd); oss->fd = -1; } @@ -678,7 +682,7 @@ { GstElementFactory *factory; - factory = gst_element_factory_new ("osselement", + factory = gst_element_factory_new ("ossmixer", GST_TYPE_OSSELEMENT, &gst_osselement_details); g_return_val_if_fail (factory != NULL, FALSE); |
From: Ronald B. <rb...@us...> - 2003-10-28 20:21:34
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Oct 28 2003 12:19:25 PST Log message: oops... I broke device settings in OSS Modified files: sys/oss : gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstosselement.c 26 Oct 2003 12:16:43 -0000 1.7 +++ gstosselement.c 28 Oct 2003 20:19:13 -0000 1.8 @@ -608,7 +608,7 @@ case ARG_DEVICE: /* 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) { + if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) { g_free (oss->device); oss->device = g_strdup (g_value_get_string (value)); } @@ -616,7 +616,7 @@ 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) { + 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)); } |
From: Ronald B. <rb...@us...> - 2003-11-05 12:21:02
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Wed Nov 05 2003 04:20:56 PST Log message: Re-add mixer element, gst-mixer doesn't work without it Modified files: sys/oss : gstossaudio.c gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: gstossaudio.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstossaudio.c 31 Oct 2003 20:03:29 -0000 1.5 +++ gstossaudio.c 5 Nov 2003 12:20:43 -0000 1.6 @@ -50,9 +50,14 @@ __gst_oss_plugin_dir = g_strjoinv (G_DIR_SEPARATOR_S, path); g_strfreev (path); - if (!gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, GST_TYPE_OSSSRC) || - !gst_element_register (plugin, "osssink", GST_RANK_PRIMARY, GST_TYPE_OSSSINK) || - !gst_element_register (plugin, "ossgst", GST_RANK_MARGINAL, GST_TYPE_OSSGST)) { + if (!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, + GST_TYPE_OSSELEMENT) || + !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, + GST_TYPE_OSSSRC) || + !gst_element_register (plugin, "osssink", GST_RANK_PRIMARY, + GST_TYPE_OSSSINK) || + !gst_element_register (plugin, "ossgst", GST_RANK_MARGINAL, + GST_TYPE_OSSGST)) { return FALSE; } Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstosselement.c 31 Oct 2003 20:03:29 -0000 1.9 +++ gstosselement.c 5 Nov 2003 12:20:43 -0000 1.10 @@ -43,6 +43,15 @@ ARG_DEVICE_NAME, }; +/* elementfactory information */ +static GstElementDetails gst_osselement_details = GST_ELEMENT_DETAILS ( + "Audio Mixer (OSS)", + "Generic/Audio", + "OSS-based mixer element", + "Ronald Bultje <rb...@ro...>" +); + +static void gst_osselement_base_init (GstOssElementClass *klass); static void gst_osselement_class_init (GstOssElementClass *klass); static void gst_osselement_init (GstOssElement *oss); static void gst_osselement_dispose (GObject *object); @@ -68,7 +77,7 @@ if (!osselement_type) { static const GTypeInfo osselement_info = { sizeof(GstOssElementClass), - NULL, + (GBaseInitFunc)gst_osselement_base_init, NULL, (GClassInitFunc)gst_osselement_class_init, NULL, @@ -100,6 +109,14 @@ } return osselement_type; +} + +static void +gst_osselement_base_init (GstOssElementClass *klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details (element_class, &gst_osselement_details); } static void |
From: Ronald B. <rb...@us...> - 2003-11-06 09:55:38
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Thu Nov 06 2003 01:55:36 PST Log message: Add device autodetection Modified files: sys/oss : gstosselement.c gstosselement.h gstosssink.h gstosssrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.h.diff?r1=1.4&r2=1.5 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.15&r2=1.16 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstosselement.c 5 Nov 2003 12:20:43 -0000 1.10 +++ gstosselement.c 6 Nov 2003 09:55:24 -0000 1.11 @@ -33,6 +33,8 @@ #include <errno.h> #include <string.h> +#include <gst/propertyprobe/propertyprobe.h> + #include "gstosselement.h" #include "gstossmixer.h" @@ -53,6 +55,8 @@ 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); @@ -96,6 +100,11 @@ NULL, NULL, }; + static const GInterfaceInfo ossprobe_info = { + (GInterfaceInitFunc) gst_ossprobe_interface_init, + NULL, + NULL, + }; osselement_type = g_type_register_static (GST_TYPE_ELEMENT, "GstOssElement", @@ -106,6 +115,9 @@ g_type_add_interface_static (osselement_type, GST_TYPE_MIXER, &ossmixer_info); + g_type_add_interface_static (osselement_type, + GST_TYPE_PROPERTY_PROBE, + &ossprobe_info); } return osselement_type; @@ -148,6 +160,197 @@ gstelement_class->change_state = gst_osselement_change_state; } +static const GList * +gst_ossprobe_get_properties (GstPropertyProbe *probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; + + if (!list) { + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); + } + + return list; +} + +static void +gst_osselement_probe (gchar *device_base, + gint device_num, + gchar **put) +{ + gchar *device; + struct stat s; + + /* only if yet unfilled */ + if (*put != NULL) + return; + + if (device_num == 0) + device = g_strdup (device_base); + else + device = g_strdup_printf ("%s%d", device_base, device_num); + + if (lstat (device, &s) || !S_ISCHR (s.st_mode)) + goto end; + + *put = device; + return; + +end: + g_free (device); +} + +static gboolean +gst_osselement_class_probe_devices (GstOssElementClass *klass, + gboolean check) +{ + static gboolean init = FALSE; + + if (!init && !check) { + gchar *dsp_base[] = { "/dev/dsp", "/dev/sound/dsp", NULL }; + gchar *mixer_base[] = { "/dev/mixer", "/dev/sound/mixer", NULL }; + GstOssDeviceCombination devices[16]; + gint n; + + klass->device_combinations = NULL; + + /* probe for all /dev entries */ + memset (devices, 0, sizeof (devices)); + + /* OSS (without devfs) allows at max. 16 devices */ + for (n = 0; n < 16; n++) { + gint base; + + for (base = 0; dsp_base[base] != NULL; base++) + gst_osselement_probe (dsp_base[base], n, &devices[n].dsp); + + for (base = 0; mixer_base[base] != NULL; base++) + gst_osselement_probe (mixer_base[base], n, &devices[n].mixer); + } + + /* does the device exist (can we open them)? */ + for (n = 0; n < 16; n++) { + gint fd; + + if (!devices[n].dsp) + continue; + + /* we just check the dsp. we assume the mixer always works. + * we don't need a mixer anyway (says OSS)... */ + if ((fd = open (devices[n].dsp, O_RDONLY)) > 0 || errno == EBUSY) { + GstOssDeviceCombination *combi; + + if (fd > 0) + close (fd); + + /* yay! \o/ */ + combi = g_new0 (GstOssDeviceCombination, 1); + combi->dsp = devices[n].dsp; + combi->mixer = devices[n].mixer; + devices[n].dsp = devices[n].mixer = NULL; + + klass->device_combinations = + g_list_append (klass->device_combinations, combi); + } + } + + /* free */ + for (n = 0; n < 16; n++) { + if (devices[n].dsp) + g_free (devices[n].dsp); + + if (devices[n].mixer) + g_free (devices[n].mixer); + } + + init = TRUE; + } + + return init; +} + +static GValueArray * +gst_osselement_class_list_devices (GstOssElementClass *klass) +{ + GValueArray *array; + GValue value = { 0 }; + GList *item; + + if (!klass->device_combinations) + return NULL; + + array = g_value_array_new (g_list_length (klass->device_combinations)); + item = klass->device_combinations; + g_value_init (&value, G_TYPE_STRING); + while (item) { + GstOssDeviceCombination *combi = item->data; + + g_value_set_string (&value, combi->dsp); + g_value_array_append (array, &value); + + item = item->next; + } + g_value_unset (&value); + + return array; +} + +static void +gst_ossprobe_probe_property (GstPropertyProbe *probe, + guint prop_id, + const GParamSpec *pspec) +{ + GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); + + switch (prop_id) { + case ARG_DEVICE: + gst_osselement_class_probe_devices (klass, FALSE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } +} + +static gboolean +gst_ossprobe_needs_probe (GstPropertyProbe *probe, + guint prop_id, + const GParamSpec *pspec) +{ + GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); + + return !gst_osselement_class_probe_devices (klass, TRUE); +} + +static GValueArray * +gst_ossprobe_get_values (GstPropertyProbe *probe, + guint prop_id, + const GParamSpec *pspec) +{ + GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case ARG_DEVICE: + array = gst_osselement_class_list_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return array; +} + +static void +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; +} + static void gst_osselement_init (GstOssElement *oss) { @@ -617,6 +820,24 @@ if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) { 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, + * 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; + + 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; + } + + list = list->next; + } + } } break; case ARG_MIXERDEV: Index: gstosselement.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstosselement.h 31 Oct 2003 20:03:29 -0000 1.4 +++ gstosselement.h 6 Nov 2003 09:55:24 -0000 1.5 @@ -37,6 +37,8 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSELEMENT)) #define GST_IS_OSSELEMENT_CLASS(obj) \ (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; @@ -46,6 +48,10 @@ GST_OSSELEMENT_WRITE, } GstOssOpenMode; +typedef struct _GstOssDeviceCombination { + gchar *dsp, *mixer; +} GstOssDeviceCombination; + struct _GstOssElement { /* yes, we're a gstelement too */ @@ -87,6 +93,8 @@ struct _GstOssElementClass { GstElementClass klass; + + GList *device_combinations; }; GType gst_osselement_get_type (void); Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstosssink.h 31 Oct 2003 20:03:29 -0000 1.15 +++ gstosssink.h 6 Nov 2003 09:55:24 -0000 1.16 @@ -70,7 +70,7 @@ }; struct _GstOssSinkClass { - GstElementClass parent_class; + GstOssElementClass parent_class; /* signals */ void (*handoff) (GstElement *element,GstPad *pad); Index: gstosssrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstosssrc.h 31 Oct 2003 20:03:30 -0000 1.9 +++ gstosssrc.h 6 Nov 2003 09:55:24 -0000 1.10 @@ -67,7 +67,7 @@ }; struct _GstOssSrcClass { - GstElementClass parent_class; + GstOssElementClass parent_class; }; GType gst_osssrc_get_type(void); |
From: Ronald B. <rb...@us...> - 2003-11-06 10:15:36
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Thu Nov 06 2003 02:15:35 PST Log message: Add proper switch to needs_probe() Modified files: sys/oss : gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.11&r2=1.12 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstosselement.c 6 Nov 2003 09:55:24 -0000 1.11 +++ gstosselement.c 6 Nov 2003 10:15:22 -0000 1.12 @@ -318,8 +318,18 @@ const GParamSpec *pspec) { GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); + gboolean ret = FALSE; - return !gst_osselement_class_probe_devices (klass, TRUE); + switch (prop_id) { + case ARG_DEVICE: + ret = !gst_osselement_class_probe_devices (klass, TRUE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return ret; } static GValueArray * |
From: Ronald B. <rb...@us...> - 2003-11-06 10:21:28
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Thu Nov 06 2003 02:21:26 PST Log message: And proper memory cleanup of cached devices Modified files: sys/oss : gstosselement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: gstosselement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosselement.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstosselement.c 6 Nov 2003 10:15:22 -0000 1.12 +++ gstosselement.c 6 Nov 2003 10:21:14 -0000 1.13 @@ -128,6 +128,8 @@ { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + klass->device_combinations = NULL; + gst_element_class_set_details (element_class, &gst_osselement_details); } @@ -212,7 +214,17 @@ GstOssDeviceCombination devices[16]; gint n; - klass->device_combinations = NULL; + while (klass->device_combinations) { + GList *item = klass->device_combinations; + GstOssDeviceCombination *combi = item->data; + + klass->device_combinations = + g_list_remove (klass->device_combinations, item); + + g_free (combi->dsp); + g_free (combi->mixer); + g_free (combi); + } /* probe for all /dev entries */ memset (devices, 0, sizeof (devices)); |
From: Ronald B. <rb...@us...> - 2003-11-09 10:51:39
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sun Nov 09 2003 02:51:38 PST Log message: Don't change mixer if there's nothing to change. This caused a bug if the soundcard only supports one input and I call this function with rec=TRUE twice. Modified files: sys/oss : gstossmixer.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstossmixer.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstossmixer.c 14 Oct 2003 10:11:14 -0000 1.6 +++ gstossmixer.c 9 Nov 2003 10:51:26 -0000 1.7 @@ -362,6 +362,11 @@ g_return_if_fail (oss->mixer_fd != -1); g_return_if_fail (gst_ossmixer_contains_track (oss, osstrack)); + /* if there's nothing to do... */ + if ((record && GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) || + (!record && !GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD))) + return; + /* if we're exclusive, then we need to unset the current one(s) */ if (oss->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *track; |
From: Ronald B. <rb...@us...> - 2003-11-13 08:39:58
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Thu Nov 13 2003 00:39:57 PST Log message: Fix for if SOUND_MIXER_INFO is not available (fBSD and others) Modified files: sys/oss : gstossmixer.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gstossmixer.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstossmixer.c 9 Nov 2003 10:51:26 -0000 1.7 +++ gstossmixer.c 13 Nov 2003 08:39:45 -0000 1.8 @@ -404,7 +404,9 @@ gint i, devmask; 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 g_return_if_fail (oss->mixer_fd == -1); @@ -433,9 +435,13 @@ } /* get name */ +#ifdef SOUND_MIXER_INFO if (ioctl (oss->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) { oss->device_name = g_strdup (minfo.name); } +#else + oss->device_name = g_strdup ("Unknown"); +#endif /* build track list */ for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { |
From: Ronald B. <rb...@us...> - 2003-12-14 22:48:31
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Sun Dec 14 2003 14:48:30 PST Log message: Remove ossgst... It's a crude hack (beyond ugly), it's broken and it failed to load during the last few months. If anyone wants to revive it, have fun finding it back in the CVS history Modified files: sys/oss : Makefile.am gstossaudio.c Removed files: sys/oss : gstossgst.c gstossgst.h gstosshelper.c gstosshelper.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.19&r2=1.20 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossgst.c http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossgst.h http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosshelper.c http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosshelper.h ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- Makefile.am 6 Nov 2003 15:24:40 -0000 1.19 +++ Makefile.am 14 Dec 2003 22:48:18 -0000 1.20 @@ -1,25 +1,16 @@ - plugin_LTLIBRARIES = libgstossaudio.la -EXTRA_LTLIBRARIES = libgstosshelper.la - libgstossaudio_la_SOURCES = gstossaudio.c \ gstosselement.c \ gstossmixer.c \ gstosssink.c \ - gstosssrc.c \ - gstossgst.c + gstosssrc.c libgstossaudio_la_CFLAGS = $(GST_CFLAGS) libgstossaudio_la_LIBADD = $(top_builddir)/gst-libs/gst/libgstinterfaces-@GST_MAJORMINOR@.la libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstosshelper_la_SOURCES = gstosshelper.c -libgstosshelper_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - noinst_HEADERS = gstosssink.h \ gstosssrc.h \ - gstossgst.h \ - gstosshelper.h \ gstosselement.h\ gstossmixer.h Index: gstossaudio.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstossaudio.c 4 Dec 2003 10:37:36 -0000 1.7 +++ gstossaudio.c 14 Dec 2003 22:48:18 -0000 1.8 @@ -24,40 +24,21 @@ #include "gstosselement.h" #include "gstosssink.h" #include "gstosssrc.h" -#include "gstossgst.h" extern gchar *__gst_oss_plugin_dir; static gboolean plugin_init (GstPlugin *plugin) { - guint i = 0; - gchar **path; - if (!gst_library_load ("gstaudio")) return FALSE; - /* get the path of this plugin, we assume the helper progam lives in the */ - /* same directory. */ - path = g_strsplit (plugin->filename, G_DIR_SEPARATOR_S, 0); - while (path[i]) { - i++; - if (path[i] == NULL) { - g_free (path[i-1]); - path[i-1] = NULL; - } - } - __gst_oss_plugin_dir = g_strjoinv (G_DIR_SEPARATOR_S, path); - g_strfreev (path); - if (!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, GST_TYPE_OSSELEMENT) || !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, GST_TYPE_OSSSRC) || !gst_element_register (plugin, "osssink", GST_RANK_PRIMARY, - GST_TYPE_OSSSINK) || - !gst_element_register (plugin, "ossgst", GST_RANK_MARGINAL, - GST_TYPE_OSSGST)) { + GST_TYPE_OSSSINK)) { return FALSE; } --- gstossgst.c DELETED --- --- gstossgst.h DELETED --- --- gstosshelper.c DELETED --- --- gstosshelper.h DELETED --- |
From: Ronald B. <rb...@us...> - 2003-12-16 21:30:54
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Dec 16 2003 13:30:53 PST Log message: Er, right, this is a typo Modified files: sys/oss : gstossmixer.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: gstossmixer.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstossmixer.c 7 Dec 2003 12:11:28 -0000 1.9 +++ gstossmixer.c 16 Dec 2003 21:30:41 -0000 1.10 @@ -459,7 +459,7 @@ /* do we want this in our list? */ if ((dir == GST_PAD_SRC && input == FALSE) || - (dir == GST_PAD_SINK && i == SOUND_MIXER_PCM)) + (dir == GST_PAD_SINK && i != SOUND_MIXER_PCM)) continue; /* add track to list */ |
From: Ronald B. <rb...@us...> - 2003-12-16 21:47:53
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Dec 16 2003 13:47:52 PST Log message: Fix some clocking issue in OSS. The issue is that if we seek forward (note: specifically forward-only), then we call handle_discont() before re-setting the clock to active. However, gstclock.c tells us that handle_discont only succeeds if allow_discont=TRUE, which is set in... set_active(TRUE). So, we first need to re-activate the clock and *then* call handle_discont(). More importantly, though, we should **NEVER EVER EVER EVER EVER** **NEVER EVER EVER EVER EVER** call clock_wait() after a forward discont without first having called handle_discont(). I don't know who added that code, but it's beyond fundamentally broken. clock_wait() **WAITS** until we're at the new given buftime, so if we do that on a forward-seek buffer, we... yes! we wait the amount of time that we seeked forward. Anyway, Apparently this code has been in here for quite a long time so I don't get how this can ever have worked... Modified files: sys/oss : gstosssink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.68&r2=1.69 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- gstosssink.c 31 Oct 2003 20:03:29 -0000 1.68 +++ gstosssink.c 16 Dec 2003 21:47:40 -0000 1.69 @@ -327,7 +327,7 @@ GstBuffer *buf = GST_BUFFER (_data); GstOssSink *osssink; GstClockTime buftime; - +g_print ("OSS data\n"); /* this has to be an audio buffer */ osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -343,7 +343,7 @@ case GST_EVENT_DISCONTINUOUS: { gint64 value; - +g_print ("OSS reset\n"); ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) @@ -351,6 +351,7 @@ osssink->handled = 0; } osssink->resync = TRUE; +g_print ("OSS reset done\n"); break; } default: @@ -378,23 +379,15 @@ if (osssink->clock) { gint delay = 0; gint64 queued; - GstClockTimeDiff jitter; delay = gst_osssink_get_delay (osssink); queued = delay * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (osssink->resync && osssink->sync) { - GstClockID id = gst_clock_new_single_shot_id (osssink->clock, buftime - queued); - - gst_element_clock_wait (GST_ELEMENT (osssink), id, &jitter); - gst_clock_id_free (id); - - if (jitter >= 0) { - gst_clock_handle_discont (osssink->clock, buftime - queued + jitter); - to_write = size; - gst_audio_clock_set_active ((GstAudioClock*)osssink->provided_clock, TRUE); - osssink->resync = FALSE; - } + gst_audio_clock_set_active ((GstAudioClock*)osssink->provided_clock, TRUE); + gst_clock_handle_discont (osssink->clock, buftime - queued); + to_write = size; + osssink->resync = FALSE; } else { to_write = size; @@ -427,7 +420,7 @@ } } } - +g_print ("OSS data done\n"); gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, buftime); gst_buffer_unref (buf); |
From: Ronald B. <rb...@us...> - 2003-12-16 22:00:34
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Dec 16 2003 14:00:33 PST Log message: Remove debugging statements Modified files: sys/oss : gstosssink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.69&r2=1.70 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -d -r1.69 -r1.70 --- gstosssink.c 16 Dec 2003 21:47:40 -0000 1.69 +++ gstosssink.c 16 Dec 2003 22:00:21 -0000 1.70 @@ -327,7 +327,7 @@ GstBuffer *buf = GST_BUFFER (_data); GstOssSink *osssink; GstClockTime buftime; -g_print ("OSS data\n"); + /* this has to be an audio buffer */ osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -343,7 +343,7 @@ case GST_EVENT_DISCONTINUOUS: { gint64 value; -g_print ("OSS reset\n"); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) @@ -351,7 +351,7 @@ osssink->handled = 0; } osssink->resync = TRUE; -g_print ("OSS reset done\n"); + break; } default: @@ -420,7 +420,7 @@ } } } -g_print ("OSS data done\n"); + gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, buftime); gst_buffer_unref (buf); |
From: Ronald B. <rb...@us...> - 2003-12-17 22:36:34
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: rbultje Date: Wed Dec 17 2003 14:36:32 PST Log message: Go back to old code, it works good enough... Modified files: sys/oss : gstosssink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.70&r2=1.71 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.70 retrieving revision 1.71 diff -u -d -r1.70 -r1.71 --- gstosssink.c 16 Dec 2003 22:00:21 -0000 1.70 +++ gstosssink.c 17 Dec 2003 22:36:20 -0000 1.71 @@ -347,10 +347,10 @@ ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); osssink->handled = 0; } - osssink->resync = TRUE; + osssink->resync = TRUE; break; } @@ -379,15 +379,23 @@ if (osssink->clock) { gint delay = 0; gint64 queued; + GstClockTimeDiff jitter; delay = gst_osssink_get_delay (osssink); queued = delay * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (osssink->resync && osssink->sync) { - gst_audio_clock_set_active ((GstAudioClock*)osssink->provided_clock, TRUE); - gst_clock_handle_discont (osssink->clock, buftime - queued); - to_write = size; - osssink->resync = FALSE; + GstClockID id = gst_clock_new_single_shot_id (osssink->clock, buftime - queued); + + gst_element_clock_wait (GST_ELEMENT (osssink), id, &jitter); + gst_clock_id_free (id); + + if (jitter >= 0) { + gst_clock_handle_discont (osssink->clock, buftime - queued + jitter); + to_write = size; + gst_audio_clock_set_active ((GstAudioClock*)osssink->provided_clock, TRUE); + osssink->resync = FALSE; + } } else { to_write = size; |