From: Wim T. <wt...@us...> - 2002-04-28 19:44:37
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Apr 28 2002 07:33:21 PDT Log message: Fix clocking. Modified files: sys/oss : gstosssink.c gstosssink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.16&r2=1.17 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstosssink.c 28 Apr 2002 13:25:08 -0000 1.16 +++ gstosssink.c 28 Apr 2002 14:33:09 -0000 1.17 @@ -222,19 +222,28 @@ { GstOssSink *osssink = GST_OSSSINK (data); gint delay; - gint offset = 0; + GstClockTime res; if (!osssink->bps) return 0; - /* if we have a start time, use offset */ - if (osssink->offset >= 0LL) { - offset = osssink->offset; + ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay); + + /* sometimes delay is bigger than the number of bytes sent to the device, which screws + * up this calculation, we assume that everything is still in the device then */ + if (delay > osssink->handled) { + res = osssink->offset; + } + else { + res = osssink->offset + (osssink->handled - delay) * 1000000LL / osssink->bps; } - ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay); + /* + g_print ("from osssink: %lld %lld %d %lld %d\n", res, osssink->offset, delay, osssink->handled, + osssink->bps); + */ - return offset + (osssink->handled - delay) * 1000000LL / osssink->bps; + return res; } static void @@ -261,7 +270,8 @@ #endif /* WORDS_BIGENDIAN */ /* gst_clock_register (osssink->clock, GST_OBJECT (osssink)); */ osssink->bufsize = 4096; - osssink->offset = -1LL; + osssink->bps = 0; + osssink->offset = 0LL; osssink->handled = 0LL; /* 6 buffers per chunk by default */ osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); @@ -472,12 +482,13 @@ if (osssink->clock) { /* FIXME, NEW_MEDIA/DISCONT?. Try to get our start point */ - if (osssink->offset == -1LL && buftime != -1LL) { + if (!osssink->have_offset && buftime != -1LL) { GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: clock at offset: %lld, new offset %lld at time %lld\n", osssink->offset, buftime, gst_clock_get_time (osssink->clock)); osssink->offset = buftime; + osssink->have_offset = TRUE; osssink->handled = 0; gst_element_clock_wait (GST_ELEMENT (osssink), osssink->clock, buftime); } @@ -697,7 +708,8 @@ } break; case GST_STATE_READY_TO_PAUSED: - osssink->offset = -1LL; + osssink->offset = 0LL; + osssink->have_offset = FALSE; break; case GST_STATE_PAUSED_TO_PLAYING: /* gst_clock_adjust (osssink->clock, osssink->offset - gst_clock_get_time (osssink->clock)); */ Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstosssink.h 30 Mar 2002 17:06:26 -0000 1.3 +++ gstosssink.h 28 Apr 2002 14:33:09 -0000 1.4 @@ -77,6 +77,7 @@ gboolean mute; guint bufsize; guint bps; + gboolean have_offset; guint64 offset; guint64 handled; |
From: Wim T. <wt...@us...> - 2002-04-28 22:23:36
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Apr 28 2002 06:25:20 PDT Log message: More intelligent clock offset and sync. Modified files: sys/oss : gstossclock.c gstosssink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossclock.c.diff?r1=1.3&r2=1.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: gstossclock.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossclock.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstossclock.c 30 Mar 2002 17:06:26 -0000 1.3 +++ gstossclock.c 28 Apr 2002 13:25:08 -0000 1.4 @@ -117,7 +117,11 @@ oss_clock->adjust -= diff2 - diff1; } - //g_print ("diff %lld %lld %lld %lld %lld %lld\n", diff1, diff2, time1, time2, diff2 - diff1, oss_clock->adjust); + /* + g_print ("diff %lld %lld %lld %lld %lld %lld\n", + diff1, diff2, time1, time2, diff2 - diff1, oss_clock->adjust); + */ + return time2 + oss_clock->adjust; } Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstosssink.c 15 Apr 2002 09:27:03 -0000 1.15 +++ gstosssink.c 28 Apr 2002 13:25:08 -0000 1.16 @@ -222,13 +222,19 @@ { GstOssSink *osssink = GST_OSSSINK (data); gint delay; + gint offset = 0; if (!osssink->bps) return 0; + /* if we have a start time, use offset */ + if (osssink->offset >= 0LL) { + offset = osssink->offset; + } + ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay); - return osssink->offset + (osssink->handled - delay) * 1000000LL / osssink->bps; + return offset + (osssink->handled - delay) * 1000000LL / osssink->bps; } static void @@ -467,7 +473,10 @@ if (osssink->clock) { /* FIXME, NEW_MEDIA/DISCONT?. Try to get our start point */ if (osssink->offset == -1LL && buftime != -1LL) { - /* g_print ("%lld %lld %lld\n", osssink->offset, buftime, gst_clock_get_time (osssink->clock)); */ + GST_INFO (GST_CAT_PLUGIN_INFO, + "osssink: clock at offset: %lld, new offset %lld at time %lld\n", + osssink->offset, buftime, gst_clock_get_time (osssink->clock)); + osssink->offset = buftime; osssink->handled = 0; gst_element_clock_wait (GST_ELEMENT (osssink), osssink->clock, buftime); @@ -483,6 +492,7 @@ osssink->handled += tosend; } */ write (osssink->fd, data, size); + osssink->handled += size; } /* no clock, try to be as fast as possible */ else { |
From: Wim T. <wt...@us...> - 2002-05-04 18:52:50
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat May 04 2002 11:52:44 PDT Log message: Reset the handled number of samples when going to PAUSED Some cleanups Modified files: sys/oss : gstossclock.c gstosssink.c gstosssink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossclock.c.diff?r1=1.4&r2=1.5 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.17&r2=1.18 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstossclock.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossclock.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstossclock.c 28 Apr 2002 13:25:08 -0000 1.4 +++ gstossclock.c 4 May 2002 18:52:32 -0000 1.5 @@ -116,13 +116,10 @@ if (diff1) { oss_clock->adjust -= diff2 - diff1; } - /* g_print ("diff %lld %lld %lld %lld %lld %lld\n", diff1, diff2, time1, time2, diff2 - diff1, oss_clock->adjust); */ - - return time2 + oss_clock->adjust; } Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstosssink.c 28 Apr 2002 14:33:09 -0000 1.17 +++ gstosssink.c 4 May 2002 18:52:32 -0000 1.18 @@ -710,31 +710,14 @@ case GST_STATE_READY_TO_PAUSED: osssink->offset = 0LL; osssink->have_offset = FALSE; + osssink->handled = 0LL; break; case GST_STATE_PAUSED_TO_PLAYING: - /* gst_clock_adjust (osssink->clock, osssink->offset - gst_clock_get_time (osssink->clock)); */ break; case GST_STATE_PLAYING_TO_PAUSED: { - if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { - if (osssink->bps) { - GstClockTime time; - audio_buf_info ospace; - gint queued; - - ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &ospace); - ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); - - queued = (ospace.fragstotal * ospace.fragsize) - ospace.bytes; - time = osssink->offset + (osssink->handled - queued) * 1000000LL / osssink->bps; - - //gst_clock_adjust (osssink->clock, time - gst_clock_get_time (osssink->clock)); - } - else { - ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); - } - } - + if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) + ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); break; } case GST_STATE_PAUSED_TO_READY: Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstosssink.h 28 Apr 2002 14:33:09 -0000 1.4 +++ gstosssink.h 4 May 2002 18:52:32 -0000 1.5 @@ -56,32 +56,32 @@ typedef struct _GstOssSinkClass GstOssSinkClass; struct _GstOssSink { - GstElement element; + GstElement element; - GstPad *sinkpad; + GstPad *sinkpad; GstBufferPool *sinkpool; - GstClock *provided_clock; - GstClock *clock; + GstClock *provided_clock; + GstClock *clock; /* device */ - gchar *device; + gchar *device; /* soundcard state */ - int fd; - int caps; /* the capabilities */ - gint format; - gint channels; - gint frequency; - gint fragment; - gboolean mute; - guint bufsize; - guint bps; - gboolean have_offset; - guint64 offset; - guint64 handled; + int fd; + int caps; /* the capabilities */ + gint format; + gint channels; + gint frequency; + gint fragment; + gboolean mute; + guint bufsize; + guint bps; + gboolean have_offset; + guint64 offset; + guint64 handled; - guint64 fragment_time; + guint64 fragment_time; }; struct _GstOssSinkClass { |
From: Wim T. <wt...@us...> - 2002-05-26 23:01:30
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun May 26 2002 16:01:29 PDT Log message: Added sync option to disable syncing to the clock. Modified files: sys/oss : gstosssink.c gstosssink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.19&r2=1.20 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstosssink.c 26 May 2002 21:59:22 -0000 1.19 +++ gstosssink.c 26 May 2002 23:01:16 -0000 1.20 @@ -75,7 +75,8 @@ ARG_CHANNELS, ARG_FREQUENCY, ARG_FRAGMENT, - ARG_BUFFER_SIZE + ARG_BUFFER_SIZE, + ARG_SYNC /* FILL ME */ }; @@ -186,6 +187,9 @@ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MUTE, g_param_spec_boolean("mute","mute","mute", TRUE,G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_SYNC, + g_param_spec_boolean("sync","Sync","If syncing on timestamps should be anabled", + TRUE, G_PARAM_READWRITE)); /* it would be nice to show format in symbolic form, oh well */ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, @@ -242,6 +246,7 @@ osssink->bufsize = 4096; osssink->bps = 0; osssink->resync = FALSE; + osssink->sync = TRUE; /* 6 buffers per chunk by default */ osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); @@ -462,7 +467,7 @@ ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay); queued = delay * GST_SECOND / osssink->bps; - if (osssink->resync) { + if (osssink->resync && osssink->sync) { gst_element_clock_wait (GST_ELEMENT (osssink), osssink->clock, buftime - queued, &jitter); @@ -537,6 +542,9 @@ osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); g_object_notify (object, "buffer_size"); break; + case ARG_SYNC: + osssink->sync = g_value_get_boolean (value); + g_object_notify (G_OBJECT (osssink), "sync"); default: break; } @@ -573,6 +581,9 @@ break; case ARG_BUFFER_SIZE: g_value_set_int (value, osssink->bufsize); + break; + case ARG_SYNC: + g_value_set_boolean (value, osssink->sync); break; default: break; Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstosssink.h 26 May 2002 21:59:22 -0000 1.6 +++ gstosssink.h 26 May 2002 23:01:16 -0000 1.7 @@ -64,6 +64,7 @@ GstClock *provided_clock; GstClock *clock; gboolean resync; + gboolean sync; /* device */ gchar *device; |
From: Wim T. <wt...@us...> - 2002-05-27 23:16:09
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Mon May 27 2002 16:16:08 PDT Log message: Use alternative method for getting delay 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.21&r2=1.22 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstosssink.c 27 May 2002 23:02:02 -0000 1.21 +++ gstosssink.c 27 May 2002 23:15:56 -0000 1.22 @@ -464,7 +464,15 @@ gint64 queued; GstClockTimeDiff jitter; - ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay); + if (ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { + audio_buf_info info; + if (ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { + delay = 0; + } + else { + delay = (info.fragstotal * info.fragsize) - info.bytes; + } + } queued = delay * GST_SECOND / osssink->bps; if (osssink->resync && osssink->sync) { |
From: Wim T. <wt...@us...> - 2002-05-28 22:53:05
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Tue May 28 2002 15:53:04 PDT Log message: Resurect ossclock with a simple algorithm Modified files: sys/oss : gstossclock.c gstossclock.h gstosssink.c gstosssink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossclock.c.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossclock.h.diff?r1=1.2&r2=1.3 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.23&r2=1.24 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gstossclock.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossclock.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstossclock.c 4 May 2002 18:52:32 -0000 1.5 +++ gstossclock.c 28 May 2002 22:52:52 -0000 1.6 @@ -92,34 +92,48 @@ return oss_clock; } +void +gst_oss_clock_set_active (GstClock *clock, gboolean active) +{ + GstOssClock *oss_clock = GST_OSS_CLOCK (clock); + GTimeVal timeval; + GstClockTime time; + GstClockTime osstime; + + g_get_current_time (&timeval); + time = GST_TIMEVAL_TO_TIME (timeval); + osstime = oss_clock->func (clock, oss_clock->user_data); + + if (active) { + oss_clock->adjust = time - osstime; + } + else { + oss_clock->adjust = osstime - time; + } + + oss_clock->active = active; +} + static GstClockTime gst_oss_clock_get_internal_time (GstClock *clock) { - GTimeVal timeval; - GstClockTime time1; - GstClockTime time2; - GstClockTimeDiff diff1, diff2; GstOssClock *oss_clock = GST_OSS_CLOCK (clock); - g_get_current_time (&timeval); - time1 = oss_clock->func (clock, oss_clock->user_data); - time2 = GST_TIMEVAL_TO_TIME (timeval); - if (!oss_clock->prev1) { - oss_clock->prev1 = time1; - } - diff1 = time1 - oss_clock->prev1; - diff2 = time2 - oss_clock->prev2; + if (oss_clock->active) { + GstClockTime osstime; + + osstime = oss_clock->func (clock, oss_clock->user_data) + oss_clock->adjust; - oss_clock->prev1 = time1; - oss_clock->prev2 = time2; + return osstime; + } + else { + GstClockTime time; + GTimeVal timeval; + + g_get_current_time (&timeval); + time = GST_TIMEVAL_TO_TIME (timeval); - if (diff1) { - oss_clock->adjust -= diff2 - diff1; + return time; } - /* - g_print ("diff %lld %lld %lld %lld %lld %lld\n", - diff1, diff2, time1, time2, diff2 - diff1, oss_clock->adjust); - */ - return time2 + oss_clock->adjust; } Index: gstossclock.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstossclock.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstossclock.h 30 Mar 2002 17:06:26 -0000 1.2 +++ gstossclock.h 28 May 2002 22:52:52 -0000 1.3 @@ -56,6 +56,8 @@ GstClockTime prev1, prev2; GstClockTimeDiff adjust; + + gboolean active; }; struct _GstOssClockClass { @@ -65,6 +67,7 @@ GType gst_oss_clock_get_type (void); GstOssClock* gst_oss_clock_new (gchar *name, GstOssClockGetTimeFunc func, gpointer user_data); +void gst_oss_clock_set_active (GstClock *clock, gboolean active); #ifdef __cplusplus } Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstosssink.c 28 May 2002 09:02:17 -0000 1.23 +++ gstosssink.c 28 May 2002 22:52:52 -0000 1.24 @@ -50,7 +50,8 @@ static gboolean gst_osssink_sync_parms (GstOssSink *osssink); static GstElementStateReturn gst_osssink_change_state (GstElement *element); static void gst_osssink_set_clock (GstElement *element, GstClock *clock); -//static GstClock* gst_osssink_get_clock (GstElement *element); +static GstClock* gst_osssink_get_clock (GstElement *element); +static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data); static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps); @@ -249,13 +250,17 @@ osssink->sync = TRUE; /* 6 buffers per chunk by default */ osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); + osssink->provided_clock = GST_CLOCK (gst_oss_clock_new ("ossclock", gst_osssink_get_time, osssink)); + osssink->handled = 0; GST_ELEMENT (osssink)->setclockfunc = gst_osssink_set_clock; + GST_ELEMENT (osssink)->getclockfunc = gst_osssink_get_clock; GST_FLAG_SET (osssink, GST_ELEMENT_THREAD_SUGGESTED); GST_FLAG_SET (osssink, GST_ELEMENT_EVENT_AWARE); } + static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) { @@ -397,6 +402,59 @@ return TRUE; } +static inline gint64 +gst_osssink_get_delay (GstOssSink *osssink) +{ + gint delay = 0; + + if (ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { + audio_buf_info info; + if (ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { + delay = 0; + } + else { + delay = (info.fragstotal * info.fragsize) - info.bytes; + } + } + return delay; +} + +static GstClockTime +gst_osssink_get_time (GstClock *clock, gpointer data) +{ + GstOssSink *osssink = GST_OSSSINK (data); + gint delay; + GstClockTime res; + + if (!osssink->bps) + return 0; + + delay = gst_osssink_get_delay (osssink); + + /* sometimes delay is bigger than the number of bytes sent to the device, which screws + * up this calculation, we assume that everything is still in the device then */ + if (((guint64)delay) > osssink->handled) { + delay = osssink->handled; + } + res = (osssink->handled - delay) * GST_SECOND / osssink->bps; + + /* + g_print ("from osssink: %lld %d %lld %d\n", res, delay, osssink->handled, osssink->bps); + */ + + return res; +} + +static GstClock* +gst_osssink_get_clock (GstElement *element) +{ + GstOssSink *osssink; + + osssink = GST_OSSSINK (element); + + return GST_CLOCK (osssink->provided_clock); +} + static void gst_osssink_set_clock (GstElement *element, GstClock *clock) { @@ -418,11 +476,11 @@ if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); - //gint64 offset; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: ioctl (osssink->fd, SNDCTL_DSP_SYNC); + gst_oss_clock_set_active (osssink->clock, FALSE); gst_pad_event_default (pad, event); return; case GST_EVENT_NEW_MEDIA: @@ -434,7 +492,7 @@ ioctl (osssink->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { - gst_clock_handle_discont (osssink->clock, value); + osssink->handled = 0; } osssink->resync = TRUE; return; @@ -464,15 +522,7 @@ gint64 queued; GstClockTimeDiff jitter; - if (ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { - audio_buf_info info; - if (ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { - delay = 0; - } - else { - delay = (info.fragstotal * info.fragsize) - info.bytes; - } - } + delay = gst_osssink_get_delay (osssink); queued = delay * GST_SECOND / osssink->bps; if (osssink->resync && osssink->sync) { @@ -480,12 +530,16 @@ buftime - queued, &jitter); if (jitter > 0) { + gst_clock_handle_discont (osssink->clock, buftime - queued + jitter); write (osssink->fd, data, size); + gst_oss_clock_set_active (osssink->provided_clock, TRUE); osssink->resync = FALSE; + osssink->handled += size; } } else { write (osssink->fd, data, size); + osssink->handled += size; } } /* no clock, try to be as fast as possible */ @@ -703,6 +757,8 @@ { if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); + gst_oss_clock_set_active (osssink->provided_clock, FALSE); + osssink->resync = TRUE; break; } case GST_STATE_PAUSED_TO_READY: Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstosssink.h 26 May 2002 23:01:16 -0000 1.7 +++ gstosssink.h 28 May 2002 22:52:52 -0000 1.8 @@ -65,6 +65,7 @@ GstClock *clock; gboolean resync; gboolean sync; + guint64 handled; /* device */ gchar *device; |
From: Wim T. <wt...@us...> - 2002-05-30 19:10:45
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Thu May 30 2002 12:10:44 PDT Log message: Slightly better sync if we could not resync the clock. 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.24&r2=1.25 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstosssink.c 28 May 2002 22:52:52 -0000 1.24 +++ gstosssink.c 30 May 2002 19:10:31 -0000 1.25 @@ -492,6 +492,8 @@ ioctl (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_oss_clock_set_active (osssink->provided_clock, FALSE); osssink->handled = 0; } osssink->resync = TRUE; |
From: Wim T. <wt...@us...> - 2002-05-31 17:53:03
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Fri May 31 2002 10:53:02 PDT Log message: Don't call oss_clock methods on the clock 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.25&r2=1.26 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstosssink.c 30 May 2002 19:10:31 -0000 1.25 +++ gstosssink.c 31 May 2002 17:52:50 -0000 1.26 @@ -480,7 +480,7 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: ioctl (osssink->fd, SNDCTL_DSP_SYNC); - gst_oss_clock_set_active (osssink->clock, FALSE); + gst_oss_clock_set_active (osssink->provided_clock, FALSE); gst_pad_event_default (pad, event); return; case GST_EVENT_NEW_MEDIA: |
From: Wim T. <wt...@us...> - 2002-06-01 11:00:41
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat Jun 01 2002 04:00:40 PDT Log message: Some query and convert functions. Modified files: sys/oss : gstosssink.c gstosssink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.26&r2=1.27 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstosssink.c 31 May 2002 17:52:50 -0000 1.26 +++ gstosssink.c 1 Jun 2002 11:00:27 -0000 1.27 @@ -53,6 +53,11 @@ static GstClock* gst_osssink_get_clock (GstElement *element); static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data); +static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value); +static gboolean gst_osssink_query (GstPad *pad, GstPadQueryType type, + GstFormat *format, gint64 *value); + static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps); static void gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, @@ -230,6 +235,8 @@ gst_element_add_pad (GST_ELEMENT (osssink), osssink->sinkpad); gst_pad_set_connect_function (osssink->sinkpad, gst_osssink_sinkconnect); gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool); + gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); + gst_pad_set_query_function (osssink->sinkpad, gst_osssink_query); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -264,7 +271,7 @@ static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) { - gint law, endianness, width, depth; + gint law, endianness, depth; gboolean sign; gint format = -1; GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -272,10 +279,10 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_CONNECT_DELAYED; - gst_caps_get_int (caps, "width", &width); + gst_caps_get_int (caps, "width", &osssink->width); gst_caps_get_int (caps, "depth", &depth); - if (width != depth) + if (osssink->width != depth) return GST_PAD_CONNECT_REFUSED; /* laws 1 and 2 are 1 bps anyway */ @@ -286,7 +293,7 @@ gst_caps_get_boolean (caps, "signed", &sign); if (law == 0) { - if (width == 16) { + if (osssink->width == 16) { if (sign == TRUE) { if (endianness == G_LITTLE_ENDIAN) format = AFMT_S16_LE; @@ -301,7 +308,7 @@ } osssink->bps = 2; } - else if (width == 8) { + else if (osssink->width == 8) { if (sign == TRUE) { format = AFMT_S8; } @@ -407,6 +414,9 @@ { gint delay = 0; + if (osssink->fd == -1) + return 0; + if (ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { audio_buf_info info; if (ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { @@ -557,6 +567,99 @@ } } gst_buffer_unref (buf); +} + +static gboolean +gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value) +{ + gboolean res = TRUE; + + GstOssSink *osssink; + + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + + osssink = GST_OSSSINK (gst_pad_get_parent (pad)); + + if (osssink->bps == 0 || osssink->channels == 0 || osssink->width == 0) + return FALSE; + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_TIME; + case GST_FORMAT_TIME: + *dest_value = src_value * GST_SECOND / osssink->bps; + break; + case GST_FORMAT_SAMPLES: + *dest_value = src_value / (osssink->channels * osssink->width); + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_BYTES; + case GST_FORMAT_BYTES: + *dest_value = src_value * osssink->bps / GST_SECOND; + break; + case GST_FORMAT_SAMPLES: + *dest_value = osssink->frequency; + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_SAMPLES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_TIME; + case GST_FORMAT_TIME: + *dest_value = src_value * GST_SECOND / osssink->frequency; + break; + case GST_FORMAT_BYTES: + *dest_value = src_value * osssink->channels * osssink->width; + break; + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + + return res; +} + +static gboolean +gst_osssink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) +{ + gboolean res = TRUE; + GstOssSink *osssink; + + osssink = GST_OSSSINK (gst_pad_get_parent (pad)); + + switch (type) { + case GST_PAD_QUERY_LATENCY: + if (!gst_osssink_convert (pad, + GST_FORMAT_BYTES, gst_osssink_get_delay (osssink), + format, value)) + { + res = FALSE; + } + break; + default: + res = FALSE; + break; + } + + return res; } static void Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstosssink.h 28 May 2002 22:52:52 -0000 1.8 +++ gstosssink.h 1 Jun 2002 11:00:27 -0000 1.9 @@ -74,6 +74,7 @@ int fd; int caps; /* the capabilities */ gint format; + gint width; gint channels; gint frequency; gint fragment; |
From: Wim T. <wt...@us...> - 2002-06-02 14:28:17
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Jun 02 2002 07:28:16 PDT Log message: Reenable oss clock 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.29&r2=1.30 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstosssink.c 2 Jun 2002 13:25:39 -0000 1.29 +++ gstosssink.c 2 Jun 2002 14:28:04 -0000 1.30 @@ -462,7 +462,6 @@ osssink = GST_OSSSINK (element); - return NULL; return GST_CLOCK (osssink->provided_clock); } |
From: Wim T. <wt...@us...> - 2002-06-08 23:45:25
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat Jun 08 2002 16:45:24 PDT Log message: Implement element query fix convert bug 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.31&r2=1.32 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstosssink.c 2 Jun 2002 15:57:30 -0000 1.31 +++ gstosssink.c 8 Jun 2002 23:45:12 -0000 1.32 @@ -55,7 +55,9 @@ static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, GstFormat *dest_format, gint64 *dest_value); -static gboolean gst_osssink_query (GstPad *pad, GstPadQueryType type, +static gboolean gst_osssink_query (GstElement *element, GstPadQueryType type, + GstFormat *format, gint64 *value); +static gboolean gst_osssink_sink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value); static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps); @@ -225,6 +227,7 @@ 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); } static void @@ -236,7 +239,7 @@ gst_pad_set_connect_function (osssink->sinkpad, gst_osssink_sinkconnect); gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool); gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); - gst_pad_set_query_function (osssink->sinkpad, gst_osssink_query); + gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -610,7 +613,7 @@ *dest_value = src_value * osssink->bps / GST_SECOND; break; case GST_FORMAT_UNITS: - *dest_value = osssink->frequency; + *dest_value = src_value * osssink->frequency / GST_SECOND; break; default: res = FALSE; @@ -638,7 +641,7 @@ } static gboolean -gst_osssink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) +gst_osssink_sink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) { gboolean res = TRUE; GstOssSink *osssink; @@ -654,12 +657,28 @@ res = FALSE; } break; + case GST_PAD_QUERY_POSITION: + if (!gst_osssink_convert (pad, + GST_FORMAT_TIME, gst_clock_get_time (osssink->provided_clock), + format, value)) + { + res = FALSE; + } + break; default: - res = FALSE; + res = gst_pad_query (gst_pad_get_peer (osssink->sinkpad), type, format, value); break; } return res; +} + +static gboolean +gst_osssink_query (GstElement *element, GstPadQueryType type, GstFormat *format, gint64 *value) +{ + GstOssSink *osssink = GST_OSSSINK (element); + + return gst_osssink_sink_query (osssink->sinkpad, type, format, value); } static void |
From: Wim T. <wt...@us...> - 2002-06-16 21:58:52
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Jun 16 2002 14:58:51 PDT Log message: Small fix for event cleanup 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.32&r2=1.33 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstosssink.c 8 Jun 2002 23:45:12 -0000 1.32 +++ gstosssink.c 16 Jun 2002 21:58:39 -0000 1.33 @@ -502,7 +502,7 @@ case GST_EVENT_DISCONTINUOUS: { gint64 value; - + ioctl (osssink->fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) @@ -510,13 +510,14 @@ osssink->handled = 0; } osssink->resync = TRUE; - return; + break; } default: gst_pad_event_default (pad, event); return; } gst_event_free (event); + return; } if (!osssink->bps) { |
From: Wim T. <wt...@us...> - 2002-07-08 19:44:41
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Mon Jul 08 2002 12:44:40 PDT Log message: unref events 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.33&r2=1.34 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstosssink.c 16 Jun 2002 21:58:39 -0000 1.33 +++ gstosssink.c 8 Jul 2002 19:44:28 -0000 1.34 @@ -498,7 +498,7 @@ return; case GST_EVENT_NEW_MEDIA: g_print ("new media\n"); - return; + break; case GST_EVENT_DISCONTINUOUS: { gint64 value; @@ -516,7 +516,7 @@ gst_pad_event_default (pad, event); return; } - gst_event_free (event); + gst_event_unref (event); return; } |
From: Wim T. <wt...@us...> - 2002-07-24 21:46:16
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Wed Jul 24 2002 14:46:15 PDT Log message: - eventmask/query/format functions - expose oss format as an enum - moved default_pool allocation to where it is needed. 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.35&r2=1.36 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstosssink.c 10 Jul 2002 21:14:13 -0000 1.35 +++ gstosssink.c 24 Jul 2002 21:46:03 -0000 1.36 @@ -53,8 +53,10 @@ static GstClock* gst_osssink_get_clock (GstElement *element); static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data); +static const GstFormat* gst_osssink_get_formats (GstPad *pad); static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, GstFormat *dest_format, gint64 *dest_value); +static const GstPadQueryType* gst_osssink_get_query_types (GstPad *pad); static gboolean gst_osssink_query (GstElement *element, GstPadQueryType type, GstFormat *format, gint64 *value); static gboolean gst_osssink_sink_query (GstPad *pad, GstPadQueryType type, @@ -131,6 +133,29 @@ return osssink_channels_type; } +#define GST_TYPE_OSSSINK_FORMAT (gst_osssink_format_get_type()) +static GType +gst_osssink_format_get_type(void) { + static GType osssink_format_type = 0; + static GEnumValue osssink_format[] = { + {AFMT_MU_LAW, G_STRINGIFY(AFMT_MU_LAW), "mulaw"}, + {AFMT_A_LAW, G_STRINGIFY(AFMT_A_LAW), "alaw"}, + {AFMT_IMA_ADPCM, G_STRINGIFY(AFMT_IMA_ADPCM), "IMA ADPCM"}, + {AFMT_U8, G_STRINGIFY(AFMT_U8), "Unsigned 8 bits"}, + {AFMT_S16_LE, G_STRINGIFY(AFMT_S16_LE), "Signed 16 bits little endian"}, + {AFMT_S16_BE, G_STRINGIFY(AFMT_S16_BE), "Signed 16 bits big endian"}, + {AFMT_S8, G_STRINGIFY(AFMT_S8), "Signed 8 bits"}, + {AFMT_U16_LE, G_STRINGIFY(AFMT_U16_LE), "Unsigned 16 bits little endian"}, + {AFMT_U16_BE, G_STRINGIFY(AFMT_U16_BE), "Unsigned 16 bits big endian"}, + {AFMT_MPEG, G_STRINGIFY(AFMT_MPEG), "MPEG"}, + {AFMT_AC3, G_STRINGIFY(AFMT_AC3), "AC3"}, + {0, NULL, NULL}, + }; + if (!osssink_format_type) { + osssink_format_type = g_enum_register_static("GstAudiosinkFormat", osssink_format); + } + return osssink_format_type; +} static GstElementClass *parent_class = NULL; static guint gst_osssink_signals[LAST_SIGNAL] = { 0 }; @@ -165,6 +190,10 @@ oss = GST_OSSSINK (gst_pad_get_parent(pad)); + /* 6 buffers per chunk by default */ + if (!oss->sinkpool) + oss->sinkpool = gst_buffer_pool_get_default (oss->bufsize, 6); + return oss->sinkpool; } @@ -199,10 +228,9 @@ g_param_spec_boolean("sync","Sync","If syncing on timestamps should be enabled", TRUE, G_PARAM_READWRITE)); - /* it would be nice to show format in symbolic form, oh well */ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, - g_param_spec_int ("format","format","format", - 0, G_MAXINT, AFMT_S16_LE, G_PARAM_READWRITE)); + g_param_spec_enum ("format","format","format", + GST_TYPE_OSSSINK_FORMAT, AFMT_S16_LE, G_PARAM_READWRITE)); g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CHANNELS, g_param_spec_enum("channels","channels","channels", @@ -240,6 +268,8 @@ gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool); gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query); + gst_pad_set_query_type_function (osssink->sinkpad, gst_osssink_get_query_types); + gst_pad_set_formats_function (osssink->sinkpad, gst_osssink_get_formats); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -258,8 +288,7 @@ osssink->bps = 0; osssink->resync = FALSE; osssink->sync = TRUE; - /* 6 buffers per chunk by default */ - osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); + osssink->sinkpool = NULL; osssink->provided_clock = GST_CLOCK (gst_oss_clock_new ("ossclock", gst_osssink_get_time, osssink)); osssink->handled = 0; @@ -573,6 +602,18 @@ gst_buffer_unref (buf); } +static const GstFormat* +gst_osssink_get_formats (GstPad *pad) +{ + static const GstFormat formats[] = { + GST_FORMAT_TIME, + GST_FORMAT_UNITS, + GST_FORMAT_BYTES, + 0 + }; + return formats; +} + static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, GstFormat *dest_format, gint64 *dest_value) @@ -641,6 +682,17 @@ return res; } +static const GstPadQueryType* +gst_osssink_get_query_types (GstPad *pad) +{ + static const GstPadQueryType query_types[] = { + GST_PAD_QUERY_LATENCY, + GST_PAD_QUERY_POSITION, + 0, + }; + return query_types; +} + static gboolean gst_osssink_sink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) { @@ -708,7 +760,7 @@ g_object_notify (G_OBJECT (osssink), "mute"); break; case ARG_FORMAT: - osssink->format = g_value_get_int (value); + osssink->format = g_value_get_enum (value); gst_osssink_sync_parms (osssink); break; case ARG_CHANNELS: @@ -755,7 +807,7 @@ g_value_set_boolean (value, osssink->mute); break; case ARG_FORMAT: - g_value_set_int (value, osssink->format); + g_value_set_enum (value, osssink->format); break; case ARG_CHANNELS: g_value_set_enum (value, osssink->channels); |
From: Wim T. <wt...@us...> - 2002-07-28 18:13:41
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Jul 28 2002 11:13:38 PDT Log message: small sync fix 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.36&r2=1.37 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- gstosssink.c 24 Jul 2002 21:46:03 -0000 1.36 +++ gstosssink.c 28 Jul 2002 18:13:26 -0000 1.37 @@ -482,7 +482,7 @@ /* g_print ("from osssink: %lld %d %lld %d\n", res, delay, osssink->handled, osssink->bps); - */ + */ return res; } @@ -574,7 +574,7 @@ gst_element_clock_wait (GST_ELEMENT (osssink), osssink->clock, buftime - queued, &jitter); - if (jitter > 0) { + if (jitter >= 0) { gst_clock_handle_discont (osssink->clock, buftime - queued + jitter); write (osssink->fd, data, size); gst_oss_clock_set_active (osssink->provided_clock, TRUE); |
From: Wim T. <wt...@us...> - 2002-09-02 19:22:48
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Mon Sep 02 2002 12:22:47 PDT Log message: - Don't misuse fragment property for storing the fragment size - Better property descriptions - correctly calculate fragment_time 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.37&r2=1.38 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- gstosssink.c 28 Jul 2002 18:13:26 -0000 1.37 +++ gstosssink.c 2 Sep 2002 19:22:35 -0000 1.38 @@ -218,37 +218,36 @@ 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","device", - "/dev/dsp",G_PARAM_READWRITE)); /* CHECKME! */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MUTE, - g_param_spec_boolean("mute","mute","mute", - TRUE,G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_SYNC, - g_param_spec_boolean("sync","Sync","If syncing on timestamps should be enabled", - TRUE, G_PARAM_READWRITE)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, - g_param_spec_enum ("format","format","format", - GST_TYPE_OSSSINK_FORMAT, AFMT_S16_LE, G_PARAM_READWRITE)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CHANNELS, - g_param_spec_enum("channels","channels","channels", - GST_TYPE_OSSSINK_CHANNELS,2,G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FREQUENCY, - g_param_spec_int("frequency","frequency","frequency", - 0,G_MAXINT,44100,G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FRAGMENT, - g_param_spec_int("fragment","fragment","fragment", - 0,G_MAXINT,6,G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFER_SIZE, - g_param_spec_int("buffer_size","buffer_size","buffer_size", - 0,G_MAXINT,4096,G_PARAM_READWRITE)); + 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)); /* CHECKME! */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUTE, + g_param_spec_boolean ("mute", "Mute", "Mute the audio", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, + g_param_spec_boolean ("sync", "Sync", "If syncing on timestamps should be enabled", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FORMAT, + g_param_spec_enum ("format", "Format", "The format the device is configured for", + GST_TYPE_OSSSINK_FORMAT, AFMT_S16_LE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHANNELS, + g_param_spec_enum ("channels", "Channels", "The number of channels used for playback", + GST_TYPE_OSSSINK_CHANNELS, 2, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, + g_param_spec_int ("frequency", "Frequency", "The frequency of the device", + 0, 48000, 44100, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, + g_param_spec_int ("fragment", "Fragment", + "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_SIZE, + g_param_spec_int ("buffer_size", "Buffer size", "The buffer size", + 0, G_MAXINT, 4096, G_PARAM_READWRITE)); gst_osssink_signals[SIGNAL_HANDOFF] = - g_signal_new("handoff",G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstOssSinkClass,handoff), NULL, NULL, - g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0); + g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstOssSinkClass, handoff), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gobject_class->set_property = gst_osssink_set_property; gobject_class->get_property = gst_osssink_get_property; @@ -384,6 +383,7 @@ gint target_channels; gint target_frequency; GObject *object; + gint fragscale, frag_ln; g_return_val_if_fail (osssink != NULL, FALSE); g_return_val_if_fail (GST_IS_OSSSINK (osssink), FALSE); @@ -412,9 +412,18 @@ ioctl (osssink->fd, SNDCTL_DSP_CHANNELS, &osssink->channels); ioctl (osssink->fd, SNDCTL_DSP_SPEED, &osssink->frequency); - ioctl (osssink->fd, SNDCTL_DSP_GETBLKSIZE, &osssink->fragment); + ioctl (osssink->fd, SNDCTL_DSP_GETBLKSIZE, &osssink->fragment_size); ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &ospace); + /* calculate new fragment using a poor man's logarithm function */ + fragscale = 1; + frag_ln = 0; + while (fragscale < ospace.fragsize) { + fragscale <<= 1; + frag_ln++; + } + osssink->fragment = ospace.fragstotal << 16 | frag_ln; + GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: set sound card to %dHz %d bit %s (%d bytes buffer, %08x fragment)", osssink->frequency, osssink->format, (osssink->channels == 2) ? "stereo" : "mono", ospace.bytes, osssink->fragment); @@ -427,7 +436,7 @@ g_object_notify (object, "format"); g_object_thaw_notify (object); - osssink->fragment_time = (1000000 * osssink->fragment) / osssink->bps; + osssink->fragment_time = (GST_SECOND * osssink->fragment_size) / osssink->bps; GST_INFO (GST_CAT_PLUGIN_INFO, "fragment time %u %llu\n", osssink->bps, osssink->fragment_time); if (target_format != osssink->format || @@ -480,10 +489,6 @@ } res = (osssink->handled - delay) * GST_SECOND / osssink->bps; - /* - g_print ("from osssink: %lld %d %lld %d\n", res, delay, osssink->handled, osssink->bps); - */ - return res; } @@ -928,6 +933,7 @@ } break; case GST_STATE_READY_TO_PAUSED: + break; case GST_STATE_PAUSED_TO_PLAYING: osssink->resync = TRUE; break; |
From: Wim T. <wt...@us...> - 2002-09-12 18:47:52
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Thu Sep 12 2002 11:47:52 PDT Log message: Some cleanups 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.38&r2=1.39 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- gstosssink.c 2 Sep 2002 19:22:35 -0000 1.38 +++ gstosssink.c 12 Sep 2002 18:47:39 -0000 1.39 @@ -789,7 +789,9 @@ case ARG_SYNC: osssink->sync = g_value_get_boolean (value); g_object_notify (G_OBJECT (osssink), "sync"); + break; default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } @@ -830,6 +832,7 @@ g_value_set_boolean (value, osssink->sync); break; default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } |
From: Wim T. <wt...@us...> - 2002-11-02 13:42:14
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat Nov 02 2002 05:42:13 PST Log message: Remove properties that can easily be found on the caps. 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.41&r2=1.42 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- gstosssink.c 23 Sep 2002 09:09:41 -0000 1.41 +++ gstosssink.c 2 Nov 2002 13:42:01 -0000 1.42 @@ -83,9 +83,6 @@ ARG_0, ARG_DEVICE, ARG_MUTE, - ARG_FORMAT, - ARG_CHANNELS, - ARG_FREQUENCY, ARG_FRAGMENT, ARG_BUFFER_SIZE, ARG_SYNC @@ -119,46 +116,6 @@ ) ); -#define GST_TYPE_OSSSINK_CHANNELS (gst_osssink_channels_get_type()) -static GType -gst_osssink_channels_get_type(void) { - static GType osssink_channels_type = 0; - static GEnumValue osssink_channels[] = { - {0, "0", "Silence"}, - {1, "1", "Mono"}, - {2, "2", "Stereo"}, - {0, NULL, NULL}, - }; - if (!osssink_channels_type) { - osssink_channels_type = g_enum_register_static("GstAudiosinkChannels", osssink_channels); - } - return osssink_channels_type; -} - -#define GST_TYPE_OSSSINK_FORMAT (gst_osssink_format_get_type()) -static GType -gst_osssink_format_get_type(void) { - static GType osssink_format_type = 0; - static GEnumValue osssink_format[] = { - {AFMT_MU_LAW, G_STRINGIFY(AFMT_MU_LAW), "mulaw"}, - {AFMT_A_LAW, G_STRINGIFY(AFMT_A_LAW), "alaw"}, - {AFMT_IMA_ADPCM, G_STRINGIFY(AFMT_IMA_ADPCM), "IMA ADPCM"}, - {AFMT_U8, G_STRINGIFY(AFMT_U8), "Unsigned 8 bits"}, - {AFMT_S16_LE, G_STRINGIFY(AFMT_S16_LE), "Signed 16 bits little endian"}, - {AFMT_S16_BE, G_STRINGIFY(AFMT_S16_BE), "Signed 16 bits big endian"}, - {AFMT_S8, G_STRINGIFY(AFMT_S8), "Signed 8 bits"}, - {AFMT_U16_LE, G_STRINGIFY(AFMT_U16_LE), "Unsigned 16 bits little endian"}, - {AFMT_U16_BE, G_STRINGIFY(AFMT_U16_BE), "Unsigned 16 bits big endian"}, - {AFMT_MPEG, G_STRINGIFY(AFMT_MPEG), "MPEG"}, - {AFMT_AC3, G_STRINGIFY(AFMT_AC3), "AC3"}, - {0, NULL, NULL}, - }; - if (!osssink_format_type) { - osssink_format_type = g_enum_register_static("GstAudiosinkFormat", osssink_format); - } - return osssink_format_type; -} - static GstElementClass *parent_class = NULL; static guint gst_osssink_signals[LAST_SIGNAL] = { 0 }; @@ -229,15 +186,6 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, g_param_spec_boolean ("sync", "Sync", "If syncing on timestamps should be enabled", TRUE, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FORMAT, - g_param_spec_enum ("format", "Format", "The format the device is configured for", - GST_TYPE_OSSSINK_FORMAT, AFMT_S16_LE, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHANNELS, - g_param_spec_enum ("channels", "Channels", "The number of channels used for playback", - GST_TYPE_OSSSINK_CHANNELS, 2, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "Frequency", "The frequency of the device", - 0, 48000, 44100, 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)", @@ -468,10 +416,7 @@ object = G_OBJECT (osssink); g_object_freeze_notify (object); - g_object_notify (object, "channels"); - g_object_notify (object, "frequency"); g_object_notify (object, "fragment"); - g_object_notify (object, "format"); g_object_thaw_notify (object); osssink->fragment_time = (GST_SECOND * osssink->fragment_size) / osssink->bps; @@ -804,18 +749,6 @@ osssink->mute = g_value_get_boolean (value); g_object_notify (G_OBJECT (osssink), "mute"); break; - case ARG_FORMAT: - osssink->format = g_value_get_enum (value); - gst_osssink_sync_parms (osssink); - break; - case ARG_CHANNELS: - osssink->channels = g_value_get_enum (value); - gst_osssink_sync_parms (osssink); - break; - case ARG_FREQUENCY: - osssink->frequency = g_value_get_int (value); - gst_osssink_sync_parms (osssink); - break; case ARG_FRAGMENT: osssink->fragment = g_value_get_int (value); gst_osssink_sync_parms (osssink); @@ -852,15 +785,6 @@ break; case ARG_MUTE: g_value_set_boolean (value, osssink->mute); - break; - case ARG_FORMAT: - g_value_set_enum (value, osssink->format); - break; - case ARG_CHANNELS: - g_value_set_enum (value, osssink->channels); - break; - case ARG_FREQUENCY: - g_value_set_int (value, osssink->frequency); break; case ARG_FRAGMENT: g_value_set_int (value, osssink->fragment); |
From: Wim T. <wt...@us...> - 2002-12-07 14:25:32
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat Dec 07 2002 06:25:31 PST Log message: Some cleanups and refactoring make ossrc do good negotiation Modified files: sys/oss : Makefile.am gstosssink.c gstosssrc.c gstosssrc.h Added files: sys/oss : gstosscommon.c gstosscommon.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.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.45&r2=1.46 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.20&r2=1.21 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- Makefile.am 20 May 2002 22:44:14 -0000 1.10 +++ Makefile.am 7 Dec 2002 14:25:18 -0000 1.11 @@ -4,7 +4,13 @@ EXTRA_LTLIBRARIES = libgstosshelper.la -libgstossaudio_la_SOURCES = gstosssink.c gstosssrc.c gstossaudio.c gstossgst.c gstossclock.c +libgstossaudio_la_SOURCES = gstosssink.c \ + gstosssrc.c \ + gstossaudio.c \ + gstossgst.c \ + gstossclock.c \ + gstosscommon.c + libgstossaudio_la_CFLAGS = $(GST_CFLAGS) libgstossaudio_la_LIBADD = libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) @@ -12,4 +18,4 @@ libgstosshelper_la_SOURCES = gstosshelper.c libgstosshelper_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstosssink.h gstosssrc.h gstossgst.h gstossclock.h gstosshelper.h +noinst_HEADERS = gstosssink.h gstosssrc.h gstossgst.h gstossclock.h gstosshelper.h gstosscommon.h --- NEW FILE: gstosscommon.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. */ #include "gstosscommon.h" #include <sys/soundcard.h> 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 (GST_CAT_PLUGIN_INFO, "16 bit signed LE, no law (%d)", *format); } else if (endianness == G_BIG_ENDIAN) { *format = AFMT_S16_BE; GST_DEBUG (GST_CAT_PLUGIN_INFO, "16 bit signed BE, no law (%d)", *format); } } else { if (endianness == G_LITTLE_ENDIAN) { *format = AFMT_U16_LE; GST_DEBUG (GST_CAT_PLUGIN_INFO, "16 bit unsigned LE, no law (%d)", *format); } else if (endianness == G_BIG_ENDIAN) { *format = AFMT_U16_BE; GST_DEBUG (GST_CAT_PLUGIN_INFO, "16 bit unsigned BE, no law (%d)", *format); } } *bps = 2; } else if (width == 8) { if (sign == TRUE) { *format = AFMT_S8; GST_DEBUG (GST_CAT_PLUGIN_INFO, "8 bit signed, no law (%d)", *format); } else { *format = AFMT_U8; GST_DEBUG (GST_CAT_PLUGIN_INFO, "8 bit unsigned, no law (%d)", *format); } *bps = 1; } } else if (law == 1) { *format = AFMT_MU_LAW; GST_DEBUG (GST_CAT_PLUGIN_INFO, "mu law (%d)", *format); } else if (law == 2) { *format = AFMT_A_LAW; GST_DEBUG (GST_CAT_PLUGIN_INFO, "a law (%d)", *format); } else { g_critical ("unknown law"); return FALSE; } return TRUE; } --- NEW FILE: gstosscommon.h --- /* 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. */ #ifndef __GST_OSSFORMAT_H__ #define __GST_OSSFORMAT_H__ #include <gst/gst.h> gboolean gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint depth, gint *format, gint *bps); #endif /* __GST_OSSFORMAT_H__ */ Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- gstosssink.c 3 Dec 2002 09:39:52 -0000 1.45 +++ gstosssink.c 7 Dec 2002 14:25:18 -0000 1.46 @@ -31,6 +31,7 @@ #include <string.h> #include <gstosssink.h> +#include <gstosscommon.h> /* elementfactory information */ static GstElementDetails gst_osssink_details = { @@ -253,7 +254,7 @@ static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) { - gint law, endianness, depth; + gint law, endianness, width, depth, bps; gboolean sign; gint format = -1; GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -261,12 +262,14 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_CONNECT_DELAYED; - gst_caps_get_int (caps, "width", &osssink->width); + gst_caps_get_int (caps, "width", &width); gst_caps_get_int (caps, "depth", &depth); - if (osssink->width != depth) + if (width != depth) return GST_PAD_CONNECT_REFUSED; + osssink->width = width; + /* laws 1 and 2 are 1 bps anyway */ osssink->bps = 1; @@ -274,76 +277,16 @@ gst_caps_get_int (caps, "endianness", &endianness); gst_caps_get_boolean (caps, "signed", &sign); - if (law == 0) { - if (osssink->width == 16) { - if (sign == TRUE) { - if (endianness == G_LITTLE_ENDIAN) - { - format = AFMT_S16_LE; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 16 bit signed LE, no law (%d)", - format); - } - else if (endianness == G_BIG_ENDIAN) - { - format = AFMT_S16_BE; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 16 bit signed BE, no law (%d)", - format); - } - } - else { - if (endianness == G_LITTLE_ENDIAN) - { - format = AFMT_U16_LE; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 16 bit unsigned LE, no law (%d)", - format); - } - else if (endianness == G_BIG_ENDIAN) - { - format = AFMT_U16_BE; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 16 bit unsigned BE, no law (%d)", - format); - } - } - osssink->bps = 2; - } - else if (osssink->width == 8) { - if (sign == TRUE) { - format = AFMT_S8; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 8 bit signed, no law (%d)", - format); - } - else { - format = AFMT_U8; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: 8 bit unsigned, no law (%d)", - format); - } - osssink->bps = 1; - } - } else if (law == 1) { - format = AFMT_MU_LAW; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: mu law (%d)", - format); - } else if (law == 2) { - format = AFMT_A_LAW; - GST_DEBUG (GST_CAT_PLUGIN_INFO, - "gst_osssink_sinkconnect: a law (%d)", - format); - } else { - g_critical ("unknown law"); + if (!gst_ossformat_get (law, endianness, sign, + width, depth, &format, &bps)) + { + GST_DEBUG (GST_CAT_PLUGIN_INFO, "could not get format"); return GST_PAD_CONNECT_REFUSED; } - if (format == -1) - return GST_PAD_CONNECT_REFUSED; - + osssink->bps = bps; osssink->format = format; + gst_caps_get_int (caps, "channels", &osssink->channels); gst_caps_get_int (caps, "rate", &osssink->frequency); Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstosssrc.c 6 Dec 2002 01:23:40 -0000 1.20 +++ gstosssrc.c 7 Dec 2002 14:25:18 -0000 1.21 @@ -28,6 +28,7 @@ #include <unistd.h> #include <gstosssrc.h> +#include <gstosscommon.h> /* elementfactory information */ static GstElementDetails gst_osssrc_details = { @@ -51,10 +52,6 @@ ARG_0, ARG_DEVICE, ARG_BYTESPERREAD, - ARG_CUROFFSET, - ARG_FORMAT, - ARG_CHANNELS, - ARG_FREQUENCY }; GST_PAD_TEMPLATE_FACTORY (osssrc_src_factory, @@ -87,15 +84,17 @@ static void gst_osssrc_class_init (GstOssSrcClass *klass); static void gst_osssrc_init (GstOssSrc *osssrc); -static void gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static GstPadConnectReturn gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps); +static void gst_osssrc_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec); +static void gst_osssrc_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec); static GstElementStateReturn gst_osssrc_change_state (GstElement *element); -static GstPadConnectReturn gst_osssrc_connect (GstPad *pad, GstCaps *caps); static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event); static void gst_osssrc_close_audio (GstOssSrc *src); static gboolean gst_osssrc_open_audio (GstOssSrc *src); -static void gst_osssrc_sync_parms (GstOssSrc *osssrc); +static gboolean gst_osssrc_sync_parms (GstOssSrc *osssrc); static GstBuffer * gst_osssrc_get (GstPad *pad); @@ -138,18 +137,6 @@ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BYTESPERREAD, g_param_spec_ulong("bytes_per_read","bytes_per_read","bytes_per_read", 0,G_MAXULONG,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CUROFFSET, - g_param_spec_ulong("curoffset","curoffset","curoffset", - 0,G_MAXULONG,0,G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, - g_param_spec_int("format","format","format", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CHANNELS, - g_param_spec_int("channels","channels","channels", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FREQUENCY, - g_param_spec_int("frequency","frequency","frequency", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ 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)); @@ -166,20 +153,22 @@ { osssrc->srcpad = gst_pad_new_from_template ( GST_PAD_TEMPLATE_GET (osssrc_src_factory), "src"); - gst_pad_set_get_function(osssrc->srcpad,gst_osssrc_get); - gst_pad_set_connect_function (osssrc->srcpad, gst_osssrc_connect); + gst_pad_set_get_function (osssrc->srcpad, gst_osssrc_get); + gst_pad_set_connect_function (osssrc->srcpad, gst_osssrc_srcconnect); gst_element_add_pad (GST_ELEMENT (osssrc), osssrc->srcpad); osssrc->device = g_strdup ("/dev/dsp"); osssrc->fd = -1; /* adding some default values */ - osssrc->format = AFMT_S16_LE; + osssrc->law = 0; + osssrc->endianness = G_BYTE_ORDER; + osssrc->sign = TRUE; + osssrc->depth = 16; + osssrc->width = 16; osssrc->channels = 2; - osssrc->frequency = 44100; - + osssrc->rate = 44100; osssrc->need_eos = FALSE; - osssrc->need_sync = FALSE; osssrc->bytes_per_read = 4096; osssrc->curoffset = 0; @@ -187,6 +176,82 @@ osssrc->samples_since_basetime = 0; } +static GstPadConnectReturn +gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps) +{ + GstOssSrc *src; + + src = GST_OSSSRC(gst_pad_get_parent (pad)); + + if (!GST_CAPS_IS_FIXED (caps)) + return GST_PAD_CONNECT_DELAYED; + + gst_caps_get_int (caps, "law", &src->law); + gst_caps_get_int (caps, "endianness", &src->endianness); + gst_caps_get_boolean (caps, "signed", &src->sign); + gst_caps_get_int (caps, "width", &src->width); + gst_caps_get_int (caps, "depth", &src->depth); + gst_caps_get_int (caps, "rate", &src->rate); + gst_caps_get_int (caps, "channels", &src->channels); + + if (!gst_osssrc_sync_parms (src)) + return GST_PAD_CONNECT_REFUSED; + + return GST_PAD_CONNECT_OK; +} +#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 + +static gboolean +gst_osssrc_negotiate (GstPad *pad) +{ + GstOssSrc *src; + GstCaps *allowed; + + src = GST_OSSSRC(gst_pad_get_parent (pad)); + + allowed = gst_pad_get_allowed_caps (pad); + + /* peel off fixed stuff from the allowed caps */ + GET_FIXED_INT (allowed, "law", &src->law); + GET_FIXED_INT (allowed, "endianness", &src->endianness); + GET_FIXED_BOOLEAN (allowed, "signed", &src->sign); + GET_FIXED_INT (allowed, "width", &src->width); + GET_FIXED_INT (allowed, "depth", &src->depth); + GET_FIXED_INT (allowed, "rate", &src->rate); + GET_FIXED_INT (allowed, "channels", &src->channels); + + if (!gst_osssrc_sync_parms (src)) + return FALSE; + + /* set caps on src pad */ + 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->law), + "endianness", GST_PROPS_INT (src->endianness), + "signed", GST_PROPS_BOOLEAN (src->sign), + "width", GST_PROPS_INT (src->width), + "depth", GST_PROPS_INT (src->depth), + "rate", GST_PROPS_INT (src->rate), + "channels", GST_PROPS_INT (src->channels) + )) <= 0) + { + return FALSE; + } + return TRUE; +} + static GstBuffer * gst_osssrc_get (GstPad *pad) { @@ -195,22 +260,17 @@ glong readbytes; glong readsamples; - g_return_val_if_fail (pad != NULL, NULL); src = GST_OSSSRC(gst_pad_get_parent (pad)); GST_DEBUG (GST_CAT_PLUGIN_INFO, "attempting to read something from the soundcard"); if (src->need_eos) { -/* gst_element_set_eos (GST_ELEMENT (src)); */ src->need_eos = FALSE; return GST_BUFFER (gst_event_new (GST_EVENT_EOS)); } - buf = gst_buffer_new (); - g_return_val_if_fail (buf, NULL); + buf = gst_buffer_new_and_alloc (src->bytes_per_read); - GST_BUFFER_DATA (buf) = (gpointer)g_malloc (src->bytes_per_read); - readbytes = read (src->fd,GST_BUFFER_DATA (buf), src->bytes_per_read); @@ -218,43 +278,28 @@ gst_element_set_eos (GST_ELEMENT (src)); return NULL; } + if (!GST_PAD_CAPS (pad)) { - /* set caps on src pad */ - if (gst_pad_try_set_caps (src->srcpad, - GST_CAPS_NEW ( - "oss_src", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), /*FIXME */ - "endianness", GST_PROPS_INT (G_BYTE_ORDER), /*FIXME */ - "signed", GST_PROPS_BOOLEAN (TRUE), /*FIXME */ - "width", GST_PROPS_INT (src->format), - "depth", GST_PROPS_INT (src->format), - "rate", GST_PROPS_INT (src->frequency), - "channels", GST_PROPS_INT (src->channels) - )) <= 0) - { - gst_element_error (GST_ELEMENT (src), "could not set caps"); + /* nothing was negotiated, we can decide on a format */ + if (!gst_osssrc_negotiate (pad)) { + gst_element_error (GST_ELEMENT (src), "could not negotiate format"); return NULL; } } - else - { - /* where did they come from ? */ - gst_caps_debug (gst_pad_get_caps (src->srcpad), "caps were already set on oss"); - } GST_BUFFER_SIZE (buf) = readbytes; GST_BUFFER_OFFSET (buf) = src->curoffset; GST_BUFFER_TIMESTAMP (buf) = src->basetime + - src->samples_since_basetime * GST_SECOND / src->frequency; + src->samples_since_basetime * GST_SECOND / src->rate; src->curoffset += readbytes; readsamples = readbytes / src->channels; - if (src->format == 16) readsamples /= 2; + if (src->width == 16) readsamples /= 2; src->samples_since_basetime += readsamples; - GST_DEBUG (GST_CAT_PLUGIN_INFO, "pushed buffer from soundcard of %ld bytes, timestamp %lld", readbytes, GST_BUFFER_TIMESTAMP (buf)); + GST_DEBUG (GST_CAT_PLUGIN_INFO, "pushed buffer from soundcard of %ld bytes, timestamp %lld", + readbytes, GST_BUFFER_TIMESTAMP (buf)); + return buf; } @@ -272,22 +317,6 @@ case ARG_BYTESPERREAD: src->bytes_per_read = g_value_get_ulong (value); break; - case ARG_FORMAT: - src->format = g_value_get_int (value); - break; - case ARG_CHANNELS: - src->channels = g_value_get_int (value); - break; - case ARG_FREQUENCY: - /* Preserve the timestamps */ - src->basetime = src->samples_since_basetime * GST_SECOND / src->frequency; - src->samples_since_basetime = 0; - - src->frequency = g_value_get_int (value); - break; - case ARG_CUROFFSET: - src->curoffset = g_value_get_ulong (value); - break; case ARG_DEVICE: g_free(src->device); src->device = g_strdup (g_value_get_string (value)); @@ -311,18 +340,6 @@ case ARG_BYTESPERREAD: g_value_set_ulong (value, src->bytes_per_read); break; - case ARG_FORMAT: - g_value_set_int (value, src->format); - break; - case ARG_CHANNELS: - g_value_set_int (value, src->channels); - break; - case ARG_FREQUENCY: - g_value_set_int (value, src->frequency); - break; - case ARG_CUROFFSET: - g_value_set_ulong (value, src->curoffset); - break; case ARG_DEVICE: g_value_set_string (value, src->device); break; @@ -337,42 +354,27 @@ { GstOssSrc *osssrc = GST_OSSSRC (element); - g_return_val_if_fail (GST_IS_OSSSRC (element), FALSE); GST_DEBUG (GST_CAT_PLUGIN_INFO, "osssrc: state change"); switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_READY_TO_NULL: - break; - - case GST_STATE_NULL_TO_READY: - break; - - case GST_STATE_READY_TO_PAUSED: - /* Paused state: open device */ - if (!GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { - if (!gst_osssrc_open_audio (GST_OSSSRC (element))) - return GST_STATE_FAILURE; - } - - break; - - case GST_STATE_PAUSED_TO_READY: - /* Going down to ready: close device */ - if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - gst_osssrc_close_audio (GST_OSSSRC (element)); - - break; - - case GST_STATE_PAUSED_TO_PLAYING: - if (osssrc->need_sync) { - gst_osssrc_sync_parms (GST_OSSSRC (element)); - osssrc->need_sync = FALSE; - } - - break; - - case GST_STATE_PLAYING_TO_PAUSED: - break; + case GST_STATE_NULL_TO_READY: + break; + case GST_STATE_READY_TO_PAUSED: + if (!GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { + if (!gst_osssrc_open_audio (osssrc)) + return GST_STATE_FAILURE; + } + break; + case GST_STATE_PAUSED_TO_PLAYING: + break; + case GST_STATE_PLAYING_TO_PAUSED: + break; + case GST_STATE_PAUSED_TO_READY: + if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) + gst_osssrc_close_audio (osssrc); + break; + case GST_STATE_READY_TO_NULL: + break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) @@ -381,25 +383,6 @@ return GST_STATE_SUCCESS; } -static GstPadConnectReturn -gst_osssrc_connect (GstPad *pad, - GstCaps *caps) -{ - GstOssSrc *osssrc; - - osssrc = GST_OSSSRC (GST_PAD_PARENT (pad)); - - if (!GST_CAPS_IS_FIXED (caps)) { - return GST_PAD_CONNECT_DELAYED; - } - - gst_caps_get_int (caps, "rate", &osssrc->frequency); - gst_caps_get_int (caps, "channels", &osssrc->channels); - - osssrc->need_sync = TRUE; - return GST_PAD_CONNECT_OK; -} - static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event) @@ -410,13 +393,12 @@ osssrc = GST_OSSSRC (element); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - osssrc->need_eos = TRUE; - retval = TRUE; - break; - - default: - break; + case GST_EVENT_EOS: + osssrc->need_eos = TRUE; + retval = TRUE; + break; + default: + break; } gst_event_unref (event); @@ -435,7 +417,6 @@ if (src->fd > 0) { /* set card state */ - gst_osssrc_sync_parms (src); GST_DEBUG (GST_CAT_PLUGIN_INFO,"opened audio: %s",src->device); GST_FLAG_SET (src, GST_OSSSRC_OPEN); @@ -456,7 +437,7 @@ GST_FLAG_UNSET (src, GST_OSSSRC_OPEN); } -static void +static gboolean gst_osssrc_sync_parms (GstOssSrc *osssrc) { audio_buf_info ispace; @@ -465,32 +446,39 @@ * is actually set to ! Setting it to 44101 Hz could cause it to * be set to 44101, for example */ + guint rate; + gint format; + gint bps; - guint frequency; - - g_return_if_fail (osssrc != NULL); - g_return_if_fail (GST_IS_OSSSRC (osssrc)); - g_return_if_fail (osssrc->fd > 0); + g_return_val_if_fail (osssrc->fd > 0, FALSE); - frequency = osssrc->frequency; + /* get rate, we don't modify the original rate as the audio device + * might not exactly give us the requested value */ + rate = osssrc->rate; + /* transform format parameters to oss format */ + if (!gst_ossformat_get (osssrc->law, osssrc->endianness, osssrc->sign, + osssrc->width, osssrc->depth, &format, &bps)) + { + return FALSE; + } + frag = 0x7fff0006; ioctl(osssrc->fd, SNDCTL_DSP_SETFRAGMENT, &frag); ioctl(osssrc->fd, SNDCTL_DSP_RESET, 0); - ioctl(osssrc->fd, SNDCTL_DSP_SETFMT, &osssrc->format); + ioctl(osssrc->fd, SNDCTL_DSP_SETFMT, &format); ioctl(osssrc->fd, SNDCTL_DSP_CHANNELS, &osssrc->channels); - ioctl(osssrc->fd, SNDCTL_DSP_SPEED, &osssrc->frequency); - osssrc->frequency = frequency; - ioctl(osssrc->fd, SNDCTL_DSP_SPEED, &frequency); + ioctl(osssrc->fd, SNDCTL_DSP_SPEED, &rate); ioctl(osssrc->fd, SNDCTL_DSP_GETISPACE, &ispace); ioctl(osssrc->fd, SNDCTL_DSP_GETBLKSIZE, &frag); g_print("setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)\n", - osssrc->frequency, osssrc->format, + rate, osssrc->width, (osssrc->channels == 2) ? "stereo" : "mono", ispace.bytes, frag); + return TRUE; } gboolean @@ -498,10 +486,13 @@ { GstElementFactory *factory; - factory = gst_element_factory_new ("osssrc", GST_TYPE_OSSSRC, &gst_osssrc_details); + factory = gst_element_factory_new ("osssrc", + GST_TYPE_OSSSRC, + &gst_osssrc_details); g_return_val_if_fail (factory != NULL, FALSE); - gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (osssrc_src_factory)); + gst_element_factory_add_pad_template (factory, + GST_PAD_TEMPLATE_GET (osssrc_src_factory)); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); Index: gstosssrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstosssrc.h 6 Dec 2002 01:23:41 -0000 1.4 +++ gstosssrc.h 7 Dec 2002 14:25:18 -0000 1.5 @@ -28,11 +28,7 @@ #include <config.h> #include <gst/gst.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - +G_BEGIN_DECLS #define GST_TYPE_OSSSRC \ (gst_osssrc_get_type()) @@ -67,11 +63,14 @@ gint fd; /* audio parameters */ - gint format; + gint law; + gint endianness; + gint sign; + gint width; + gint depth; + gint rate; gint channels; - gint frequency; - gboolean need_sync; /* Do the parameters need resynced? */ gboolean need_eos; /* Do we need to emit an EOS? */ /* blocking */ @@ -90,9 +89,6 @@ gboolean gst_osssrc_factory_init (GstPlugin *plugin); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - +G_END_DECLS #endif /* __GST_OSSSRC_H__ */ |
From: Wim T. <wt...@us...> - 2002-12-07 20:55:01
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat Dec 07 2002 12:54:59 PST Log message: More refactoring osssrc has more features now, like query/convert etc Modified files: sys/oss : gstosscommon.c gstosscommon.h gstosssink.c gstosssink.h gstosssrc.c gstosssrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.h.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.46&r2=1.47 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.21&r2=1.22 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstosscommon.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstosscommon.c 7 Dec 2002 14:25:18 -0000 1.1 +++ gstosscommon.c 7 Dec 2002 20:54:47 -0000 1.2 @@ -21,10 +21,19 @@ */ -#include "gstosscommon.h" +#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> -gboolean +#include <config.h> +#include "gstosscommon.h" + +static gboolean gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint depth, gint *format, gint *bps) { @@ -89,3 +98,348 @@ return TRUE; } + +void +gst_osscommon_init (GstOssCommon *common) +{ + common->device = g_strdup ("/dev/dsp"); + common->fd = -1; + + common->law = 0; + common->endianness = G_BYTE_ORDER; + common->sign = TRUE; + common->width = 16; + common->depth = 16; + common->channels = 2; + common->rate = 44100; + common->fragment = 6; + common->bps = 0; + +/* AFMT_*_BE not available on all OSS includes (e.g. FBSD) */ +#ifdef WORDS_BIGENDIAN + common->format = AFMT_S16_BE; +#else + common->format = AFMT_S16_LE; +#endif /* WORDS_BIGENDIAN */ +} + +gboolean +gst_osscommon_parse_caps (GstOssCommon *common, GstCaps *caps) +{ + gint bps, format; + + gst_caps_get_int (caps, "width", &common->width); + gst_caps_get_int (caps, "depth", &common->depth); + + if (common->width != common->depth) + return FALSE; + + gst_caps_get_int (caps, "law", &common->law); + gst_caps_get_int (caps, "endianness", &common->endianness); + gst_caps_get_boolean (caps, "signed", &common->sign); + + if (!gst_ossformat_get (common->law, common->endianness, common->sign, + common->width, common->depth, &format, &bps)) + { + GST_DEBUG (GST_CAT_PLUGIN_INFO, "could not get format"); + return FALSE; + } + + gst_caps_get_int (caps, "channels", &common->channels); + gst_caps_get_int (caps, "rate", &common->rate); + + common->bps = bps * common->channels * common->rate; + common->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_osscommon_merge_fixed_caps (GstOssCommon *common, GstCaps *caps) +{ + gint bps, format; + + /* peel off fixed stuff from the caps */ + GET_FIXED_INT (caps, "law", &common->law); + GET_FIXED_INT (caps, "endianness", &common->endianness); + GET_FIXED_BOOLEAN (caps, "signed", &common->sign); + GET_FIXED_INT (caps, "width", &common->width); + GET_FIXED_INT (caps, "depth", &common->depth); + + if (!gst_ossformat_get (common->law, common->endianness, common->sign, + common->width, common->depth, &format, &bps)) + { + return FALSE; + } + + GET_FIXED_INT (caps, "rate", &common->rate); + GET_FIXED_INT (caps, "channels", &common->channels); + + common->bps = bps * common->channels * common->rate; + common->format = format; + + return TRUE; +} + +gboolean +gst_osscommon_sync_parms (GstOssCommon *common) +{ + audio_buf_info space; + int frag; + gint target_format; + gint target_channels; + gint target_rate; + gint fragscale, frag_ln; + + if (common->fd == -1) + return FALSE; + + if (common->fragment >> 16) + frag = common->fragment; + else + frag = 0x7FFF0000 | common->fragment; + + GST_INFO (GST_CAT_PLUGIN_INFO, + "common: setting sound card to %dHz %d format %s (%08x fragment)", + common->rate, common->format, + (common->channels == 2) ? "stereo" : "mono", frag); + + ioctl (common->fd, SNDCTL_DSP_SETFRAGMENT, &frag); + ioctl (common->fd, SNDCTL_DSP_RESET, 0); + + target_format = common->format; + target_channels = common->channels; + target_rate = common->rate; + + ioctl (common->fd, SNDCTL_DSP_SETFMT, &common->format); + ioctl (common->fd, SNDCTL_DSP_CHANNELS, &common->channels); + ioctl (common->fd, SNDCTL_DSP_SPEED, &common->rate); + + ioctl (common->fd, SNDCTL_DSP_GETBLKSIZE, &common->fragment_size); + + if (common->mode == GST_OSSCOMMON_WRITE) { + ioctl (common->fd, SNDCTL_DSP_GETOSPACE, &space); + } + else { + ioctl (common->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++; + } + common->fragment = space.fragstotal << 16 | frag_ln; + + GST_INFO (GST_CAT_PLUGIN_INFO, + "common: set sound card to %dHz, %d format, %s " + "(%d bytes buffer, %08x fragment)", + common->rate, common->format, + (common->channels == 2) ? "stereo" : "mono", + space.bytes, common->fragment); + + common->fragment_time = (GST_SECOND * common->fragment_size) / common->bps; + GST_INFO (GST_CAT_PLUGIN_INFO, "fragment time %u %llu\n", + common->bps, common->fragment_time); + + if (target_format != common->format || + target_channels != common->channels || + target_rate != common->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; +} + +gboolean +gst_osscommon_open_audio (GstOssCommon *common, GstOssOpenMode mode, gchar **error) +{ + gint caps; + g_return_val_if_fail (common->fd == -1, FALSE); + + GST_INFO (GST_CAT_PLUGIN_INFO, "common: attempting to open sound device"); + + /* first try to open the sound card */ + /* FIXME: this code is dubious, why do we need to open and close this ?*/ + if (mode == GST_OSSCOMMON_WRITE) { + common->fd = open (common->device, O_WRONLY | O_NONBLOCK); + if (errno == EBUSY) { + g_warning ("osscommon: unable to open the sound device (in use ?)\n"); + } + + if (common->fd >= 0) + close (common->fd); + + /* re-open the sound device in blocking mode */ + common->fd = open (common->device, O_WRONLY); + } + else { + common->fd = open (common->device, O_RDONLY); + } + + if (common->fd < 0) { + switch (errno) { + case EISDIR: + *error = g_strdup_printf ("osscommon: Device %s is a directory", + common->device); + break; + case EACCES: + case ETXTBSY: + *error = g_strdup_printf ( "osscommon: Cannot access %s, check permissions", + common->device); + break; + case ENXIO: + case ENODEV: + case ENOENT: + *error = g_strdup_printf ("osscommon: Cannot access %s, does it exist ?", + common->device); + break; + case EROFS: + *error = g_strdup_printf ("osscommon: Cannot access %s, read-only filesystem ?", + common->device); + default: + /* FIXME: strerror is not threadsafe */ + *error = g_strdup_printf ("osscommon: Cannot open %s, generic error: %s", + common->device, strerror (errno)); + break; + } + return FALSE; + } + + common->mode = mode; + + /* we have it, set the default parameters and go have fun */ + /* set card state */ + ioctl (common->fd, SNDCTL_DSP_GETCAPS, &caps); + + GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Capabilities %08x", caps); + + if (caps & DSP_CAP_DUPLEX) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Full duplex"); + if (caps & DSP_CAP_REALTIME) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Realtime"); + if (caps & DSP_CAP_BATCH) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Batch"); + if (caps & DSP_CAP_COPROC) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Has coprocessor"); + if (caps & DSP_CAP_TRIGGER) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Trigger"); + if (caps & DSP_CAP_MMAP) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Direct access"); + +#ifdef DSP_CAP_MULTI + if (caps & DSP_CAP_MULTI) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Multiple open"); +#endif /* DSP_CAP_MULTI */ + +#ifdef DSP_CAP_BIND + if (caps & DSP_CAP_BIND) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Channel binding"); +#endif /* DSP_CAP_BIND */ + + ioctl(common->fd, SNDCTL_DSP_GETFMTS, &caps); + + GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: Formats %08x", caps); + if (caps & AFMT_MU_LAW) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: MU_LAW"); + if (caps & AFMT_A_LAW) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: A_LAW"); + if (caps & AFMT_IMA_ADPCM) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: IMA_ADPCM"); + if (caps & AFMT_U8) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: U8"); + if (caps & AFMT_S16_LE) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: S16_LE"); + if (caps & AFMT_S16_BE) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: S16_BE"); + if (caps & AFMT_S8) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: S8"); + if (caps & AFMT_U16_LE) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: U16_LE"); + if (caps & AFMT_U16_BE) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: U16_BE"); + if (caps & AFMT_MPEG) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: MPEG"); +#ifdef AFMT_AC3 + if (caps & AFMT_AC3) GST_INFO (GST_CAT_PLUGIN_INFO, "osscommon: AC3"); +#endif + + GST_INFO (GST_CAT_PLUGIN_INFO, + "osscommon: opened audio (%s) with fd=%d", common->device, common->fd); + + common->caps = caps; + + return TRUE; +} + +void +gst_osscommon_close_audio (GstOssCommon *common) +{ + if (common->fd < 0) + return; + + close(common->fd); + common->fd = -1; +} + +gboolean +gst_osscommon_convert (GstOssCommon *common, 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 (common->bps == 0 || common->channels == 0 || common->width == 0) + return FALSE; + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_TIME; + case GST_FORMAT_TIME: + *dest_value = src_value * GST_SECOND / common->bps; + break; + case GST_FORMAT_UNITS: + *dest_value = src_value / (common->channels * common->width); + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_BYTES; + case GST_FORMAT_BYTES: + *dest_value = src_value * common->bps / GST_SECOND; + break; + case GST_FORMAT_UNITS: + *dest_value = src_value * common->rate / GST_SECOND; + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_UNITS: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_format = GST_FORMAT_TIME; + case GST_FORMAT_TIME: + *dest_value = src_value * GST_SECOND / common->rate; + break; + case GST_FORMAT_BYTES: + *dest_value = src_value * common->channels * common->width; + break; + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + + return res; +} + Index: gstosscommon.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstosscommon.h 7 Dec 2002 14:25:18 -0000 1.1 +++ gstosscommon.h 7 Dec 2002 20:54:47 -0000 1.2 @@ -20,12 +20,57 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __GST_OSSFORMAT_H__ -#define __GST_OSSFORMAT_H__ +#ifndef __GST_OSSCOMMON_H__ +#define __GST_OSSCOMMON_H__ #include <gst/gst.h> -gboolean gst_ossformat_get (gint law, gint endianness, gboolean sign, - gint width, gint depth, gint *format, gint *bps); +typedef struct _GstOssCommon GstOssCommon; -#endif /* __GST_OSSFORMAT_H__ */ +typedef enum { + GST_OSSCOMMON_READ, + GST_OSSCOMMON_WRITE, +} GstOssOpenMode; + +struct _GstOssCommon +{ + gchar *device; + /* 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; +}; + +void gst_osscommon_init (GstOssCommon *common); + +gboolean gst_osscommon_open_audio (GstOssCommon *common, + GstOssOpenMode mode, gchar **error); +void gst_osscommon_close_audio (GstOssCommon *common); + +gboolean gst_osscommon_parse_caps (GstOssCommon *common, GstCaps *caps); +gboolean gst_osscommon_merge_fixed_caps (GstOssCommon *common, GstCaps *caps); + +gboolean gst_osscommon_sync_parms (GstOssCommon *common); + +gboolean gst_osscommon_convert (GstOssCommon *common, + GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value); + + + +#endif /* __GST_OSSCOMMON_H__ */ Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- gstosssink.c 7 Dec 2002 14:25:18 -0000 1.46 +++ gstosssink.c 7 Dec 2002 20:54:47 -0000 1.47 @@ -20,18 +20,10 @@ * Boston, MA 02111-1307, USA. */ - -#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 <gstosssink.h> -#include <gstosscommon.h> /* elementfactory information */ static GstElementDetails gst_osssink_details = { @@ -49,9 +41,6 @@ static void gst_osssink_init (GstOssSink *osssink); static void gst_osssink_finalize (GObject *object); -static gboolean gst_osssink_open_audio (GstOssSink *sink); -static void gst_osssink_close_audio (GstOssSink *sink); -static gboolean gst_osssink_sync_parms (GstOssSink *osssink); static GstElementStateReturn gst_osssink_change_state (GstElement *element); static void gst_osssink_set_clock (GstElement *element, GstClock *clock); static GstClock* gst_osssink_get_clock (GstElement *element); @@ -163,7 +152,7 @@ { GstOssSink *osssink = (GstOssSink *) object; - g_free (osssink->device); + g_free (osssink->common.device); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -227,19 +216,9 @@ gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); - osssink->device = g_strdup ("/dev/dsp"); - osssink->fd = -1; - osssink->channels = 1; - osssink->frequency = 11025; - osssink->fragment = 6; -/* AFMT_*_BE not available on all OSS includes (e.g. FBSD) */ -#ifdef WORDS_BIGENDIAN - osssink->format = AFMT_S16_BE; -#else - osssink->format = AFMT_S16_LE; -#endif /* WORDS_BIGENDIAN */ + gst_osscommon_init (&osssink->common); + osssink->bufsize = 4096; - osssink->bps = 0; osssink->resync = FALSE; osssink->sync = TRUE; osssink->sinkpool = NULL; @@ -254,141 +233,32 @@ static GstPadConnectReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) { - gint law, endianness, width, depth, bps; - gboolean sign; - gint format = -1; GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_CONNECT_DELAYED; - - gst_caps_get_int (caps, "width", &width); - gst_caps_get_int (caps, "depth", &depth); - - if (width != depth) - return GST_PAD_CONNECT_REFUSED; - osssink->width = width; - - /* laws 1 and 2 are 1 bps anyway */ - osssink->bps = 1; - - gst_caps_get_int (caps, "law", &law); - gst_caps_get_int (caps, "endianness", &endianness); - gst_caps_get_boolean (caps, "signed", &sign); - - if (!gst_ossformat_get (law, endianness, sign, - width, depth, &format, &bps)) - { - GST_DEBUG (GST_CAT_PLUGIN_INFO, "could not get format"); + if (!gst_osscommon_parse_caps (&osssink->common, caps)) return GST_PAD_CONNECT_REFUSED; - } - - osssink->bps = bps; - osssink->format = format; - - gst_caps_get_int (caps, "channels", &osssink->channels); - gst_caps_get_int (caps, "rate", &osssink->frequency); - - osssink->bps *= osssink->channels; - osssink->bps *= osssink->frequency; - if (!gst_osssink_sync_parms (osssink)) { + if (!gst_osscommon_sync_parms (&osssink->common)) { return GST_PAD_CONNECT_REFUSED; } return GST_PAD_CONNECT_OK; } -static gboolean -gst_osssink_sync_parms (GstOssSink *osssink) -{ - audio_buf_info ospace; - int frag; - gint target_format; - gint target_channels; - gint target_frequency; - GObject *object; - gint fragscale, frag_ln; - - g_return_val_if_fail (osssink != NULL, FALSE); - g_return_val_if_fail (GST_IS_OSSSINK (osssink), FALSE); - - if (osssink->fd == -1) - return FALSE; - - if (osssink->fragment >> 16) - frag = osssink->fragment; - else - frag = 0x7FFF0000 | osssink->fragment; - - GST_INFO (GST_CAT_PLUGIN_INFO, - "osssink: setting sound card to %dHz %d format %s (%08x fragment)", - osssink->frequency, osssink->format, - (osssink->channels == 2) ? "stereo" : "mono", frag); - - ioctl (osssink->fd, SNDCTL_DSP_SETFRAGMENT, &frag); - - ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); - - target_format = osssink->format; - target_channels = osssink->channels; - target_frequency = osssink->frequency; - - ioctl (osssink->fd, SNDCTL_DSP_SETFMT, &osssink->format); - ioctl (osssink->fd, SNDCTL_DSP_CHANNELS, &osssink->channels); - ioctl (osssink->fd, SNDCTL_DSP_SPEED, &osssink->frequency); - - ioctl (osssink->fd, SNDCTL_DSP_GETBLKSIZE, &osssink->fragment_size); - ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &ospace); - - /* calculate new fragment using a poor man's logarithm function */ - fragscale = 1; - frag_ln = 0; - while (fragscale < ospace.fragsize) { - fragscale <<= 1; - frag_ln++; - } - osssink->fragment = ospace.fragstotal << 16 | frag_ln; - - GST_INFO (GST_CAT_PLUGIN_INFO, - "osssink: set sound card to %dHz %d format %s " - "(%d bytes buffer, %08x fragment)", - osssink->frequency, osssink->format, - (osssink->channels == 2) ? "stereo" : "mono", - ospace.bytes, osssink->fragment); - - object = G_OBJECT (osssink); - g_object_freeze_notify (object); - g_object_notify (object, "fragment"); - g_object_thaw_notify (object); - - osssink->fragment_time = (GST_SECOND * osssink->fragment_size) / osssink->bps; - GST_INFO (GST_CAT_PLUGIN_INFO, "fragment time %u %llu\n", - osssink->bps, osssink->fragment_time); - - if (target_format != osssink->format || - target_channels != osssink->channels || - target_frequency != osssink->frequency) - { - 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 inline gint64 gst_osssink_get_delay (GstOssSink *osssink) { gint delay = 0; - if (osssink->fd == -1) + if (osssink->common.fd == -1) return 0; - if (ioctl (osssink->fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { + if (ioctl (osssink->common.fd, SNDCTL_DSP_GETODELAY, &delay) < 0) { audio_buf_info info; - if (ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { + if (ioctl (osssink->common.fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { delay = 0; } else { @@ -405,7 +275,7 @@ gint delay; GstClockTime res; - if (!osssink->bps) + if (!osssink->common.bps) return 0; delay = gst_osssink_get_delay (osssink); @@ -416,7 +286,7 @@ if (((guint64)delay) > osssink->handled) { delay = osssink->handled; } - res = (osssink->handled - delay) * GST_SECOND / osssink->bps; + res = (osssink->handled - delay) * GST_SECOND / osssink->common.bps; return res; } @@ -455,7 +325,7 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - ioctl (osssink->fd, SNDCTL_DSP_SYNC); + ioctl (osssink->common.fd, SNDCTL_DSP_SYNC); gst_oss_clock_set_active (osssink->provided_clock, FALSE); gst_pad_event_default (pad, event); return; @@ -466,7 +336,7 @@ { gint64 value; - ioctl (osssink->fd, SNDCTL_DSP_RESET); + ioctl (osssink->common.fd, SNDCTL_DSP_RESET); if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) { if (!gst_clock_handle_discont (osssink->clock, value)) gst_oss_clock_set_active (osssink->provided_clock, FALSE); @@ -483,7 +353,7 @@ return; } - if (!osssink->bps) { + if (!osssink->common.bps) { gst_buffer_unref (buf); gst_element_error (GST_ELEMENT (osssink), "capsnego was never performed, unknown data type"); return; @@ -491,7 +361,7 @@ buftime = GST_BUFFER_TIMESTAMP (buf); - if (osssink->fd >= 0) { + if (osssink->common.fd >= 0) { if (!osssink->mute) { guchar *data = GST_BUFFER_DATA (buf); gint size = GST_BUFFER_SIZE (buf); @@ -502,7 +372,7 @@ GstClockTimeDiff jitter; delay = gst_osssink_get_delay (osssink); - queued = delay * GST_SECOND / osssink->bps; + queued = delay * GST_SECOND / osssink->common.bps; if (osssink->resync && osssink->sync) { gst_element_clock_wait (GST_ELEMENT (osssink), osssink->clock, @@ -510,14 +380,14 @@ if (jitter >= 0) { gst_clock_handle_discont (osssink->clock, buftime - queued + jitter); - write (osssink->fd, data, size); + write (osssink->common.fd, data, size); gst_oss_clock_set_active (osssink->provided_clock, TRUE); osssink->resync = FALSE; osssink->handled += size; } } else { - write (osssink->fd, data, size); + write (osssink->common.fd, data, size); osssink->handled += size; } } @@ -525,10 +395,10 @@ else { audio_buf_info ospace; - ioctl (osssink->fd, SNDCTL_DSP_GETOSPACE, &ospace); + ioctl (osssink->common.fd, SNDCTL_DSP_GETOSPACE, &ospace); if (ospace.bytes >= size) { - write (osssink->fd, data, size); + write (osssink->common.fd, data, size); } } } @@ -552,68 +422,12 @@ gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, GstFormat *dest_format, gint64 *dest_value) { - gboolean res = TRUE; - GstOssSink *osssink; - if (src_format == *dest_format) { - *dest_value = src_value; - return TRUE; - } - osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - - if (osssink->bps == 0 || osssink->channels == 0 || osssink->width == 0) - return FALSE; - - switch (src_format) { - case GST_FORMAT_BYTES: - switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_TIME; - case GST_FORMAT_TIME: - *dest_value = src_value * GST_SECOND / osssink->bps; - break; - case GST_FORMAT_UNITS: - *dest_value = src_value / (osssink->channels * osssink->width); - break; - default: - res = FALSE; - } - break; - case GST_FORMAT_TIME: - switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_BYTES; - case GST_FORMAT_BYTES: - *dest_value = src_value * osssink->bps / GST_SECOND; - break; - case GST_FORMAT_UNITS: - *dest_value = src_value * osssink->frequency / GST_SECOND; - break; - default: - res = FALSE; - } - break; - case GST_FORMAT_UNITS: - switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_TIME; - case GST_FORMAT_TIME: - *dest_value = src_value * GST_SECOND / osssink->frequency; - break; - case GST_FORMAT_BYTES: - *dest_value = src_value * osssink->channels * osssink->width; - break; - default: - res = FALSE; - } - break; - default: - res = FALSE; - } - - return res; + + return gst_osscommon_convert (&osssink->common, src_format, src_value, + dest_format, dest_value); } static const GstPadQueryType* @@ -673,9 +487,6 @@ { GstOssSink *osssink; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_OSSSINK (object)); - osssink = GST_OSSSINK (object); switch (prop_id) { @@ -684,8 +495,8 @@ get_property("device") should return the right one */ if (!GST_FLAG_IS_SET (osssink, GST_OSSSINK_OPEN)) { - g_free (osssink->device); - osssink->device = g_strdup (g_value_get_string (value)); + g_free (osssink->common.device); + osssink->common.device = g_strdup (g_value_get_string (value)); g_object_notify (object, "device"); } break; @@ -694,8 +505,8 @@ g_object_notify (G_OBJECT (osssink), "mute"); break; case ARG_FRAGMENT: - osssink->fragment = g_value_get_int (value); - gst_osssink_sync_parms (osssink); + osssink->common.fragment = g_value_get_int (value); + gst_osscommon_sync_parms (&osssink->common); break; case ARG_BUFFER_SIZE: if (osssink->bufsize == g_value_get_int (value)) break; @@ -718,20 +529,17 @@ { GstOssSink *osssink; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_OSSSINK (object)); - osssink = GST_OSSSINK (object); switch (prop_id) { case ARG_DEVICE: - g_value_set_string (value, osssink->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->fragment); + g_value_set_int (value, osssink->common.fragment); break; case ARG_BUFFER_SIZE: g_value_set_int (value, osssink->bufsize); @@ -745,132 +553,24 @@ } } -static gboolean -gst_osssink_open_audio (GstOssSink *sink) -{ - gint caps; - g_return_val_if_fail (sink->fd == -1, FALSE); - - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: attempting to open sound device"); - - /* first try to open the sound card */ - /* FIXME: this code is dubious, why do we need to open and close this ?*/ - sink->fd = open (sink->device, O_WRONLY | O_NONBLOCK); - if (errno == EBUSY) { - g_warning ("osssink: unable to open the sound device (in use ?)\n"); - } - - if (sink->fd >= 0) - close (sink->fd); - - /* re-open the sound device in blocking mode */ - sink->fd = open (sink->device, O_WRONLY); - - if (sink->fd < 0) { - switch (errno) { - case EISDIR: - gst_element_error (GST_ELEMENT (sink), - "osssink: Device %s is a directory", - sink->device); - break; - case EACCES: - case ETXTBSY: - gst_element_error (GST_ELEMENT (sink), - "osssink: Cannot access %s, check permissions", - sink->device); - break; - case ENXIO: - case ENODEV: - case ENOENT: - gst_element_error (GST_ELEMENT (sink), - "osssink: Cannot access %s, does it exist ?", - sink->device); - break; - case EROFS: - gst_element_error (GST_ELEMENT (sink), - "osssink: Cannot access %s, read-only filesystem ?", - sink->device); - default: - /* FIXME: strerror is not threadsafe */ - gst_element_error (GST_ELEMENT (sink), - "osssink: Cannot open %s, generic error: %s", - sink->device, strerror (errno)); - break; - } - return FALSE; - } - /* we have it, set the default parameters and go have fun */ - /* set card state */ - ioctl (sink->fd, SNDCTL_DSP_GETCAPS, &caps); - - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Capabilities %08x", caps); - - if (caps & DSP_CAP_DUPLEX) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Full duplex"); - if (caps & DSP_CAP_REALTIME) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Realtime"); - if (caps & DSP_CAP_BATCH) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Batch"); - if (caps & DSP_CAP_COPROC) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Has coprocessor"); - if (caps & DSP_CAP_TRIGGER) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Trigger"); - if (caps & DSP_CAP_MMAP) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Direct access"); - -#ifdef DSP_CAP_MULTI - if (caps & DSP_CAP_MULTI) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Multiple open"); -#endif /* DSP_CAP_MULTI */ - -#ifdef DSP_CAP_BIND - if (caps & DSP_CAP_BIND) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Channel binding"); -#endif /* DSP_CAP_BIND */ - - ioctl(sink->fd, SNDCTL_DSP_GETFMTS, &caps); - - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: Formats %08x", caps); - if (caps & AFMT_MU_LAW) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: MU_LAW"); - if (caps & AFMT_A_LAW) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: A_LAW"); - if (caps & AFMT_IMA_ADPCM) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: IMA_ADPCM"); - if (caps & AFMT_U8) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: U8"); - if (caps & AFMT_S16_LE) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: S16_LE"); - if (caps & AFMT_S16_BE) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: S16_BE"); - if (caps & AFMT_S8) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: S8"); - if (caps & AFMT_U16_LE) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: U16_LE"); - if (caps & AFMT_U16_BE) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: U16_BE"); - if (caps & AFMT_MPEG) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: MPEG"); -#ifdef AFMT_AC3 - if (caps & AFMT_AC3) GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: AC3"); -#endif - - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: opened audio (%s) with fd=%d", sink->device, sink->fd); - GST_FLAG_SET (sink, GST_OSSSINK_OPEN); - - return TRUE; -} - -static void -gst_osssink_close_audio (GstOssSink *sink) -{ - if (sink->fd < 0) return; - - close(sink->fd); - sink->fd = -1; - - GST_FLAG_UNSET (sink, GST_OSSSINK_OPEN); - - GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: closed sound device"); -} - static GstElementStateReturn gst_osssink_change_state (GstElement *element) { GstOssSink *osssink; - g_return_val_if_fail (GST_IS_OSSSINK (element), FALSE); - osssink = GST_OSSSINK (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: if (!GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { - if (!gst_osssink_open_audio (osssink)) { + 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: @@ -881,18 +581,23 @@ case GST_STATE_PLAYING_TO_PAUSED: { if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (osssink->fd, SNDCTL_DSP_RESET, 0); + ioctl (osssink->common.fd, SNDCTL_DSP_RESET, 0); gst_oss_clock_set_active (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->fd, SNDCTL_DSP_RESET, 0); + ioctl (osssink->common.fd, SNDCTL_DSP_RESET, 0); + gst_osscommon_init (&osssink->common); break; case GST_STATE_READY_TO_NULL: - if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - gst_osssink_close_audio (osssink); + if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { + gst_osscommon_close_audio (&osssink->common); + GST_FLAG_UNSET (osssink, GST_OSSSINK_OPEN); + + GST_INFO (GST_CAT_PLUGIN_INFO, "osssink: closed sound device"); + } break; } Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstosssink.h 3 Sep 2002 16:11:57 -0000 1.10 +++ gstosssink.h 7 Dec 2002 20:54:47 -0000 1.11 @@ -25,15 +25,12 @@ #define __GST_OSSSINK_H__ -#include <config.h> #include <gst/gst.h> +#include "gstosscommon.h" #include "gstossclock.h" -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - +G_BEGIN_DECLS #define GST_TYPE_OSSSINK \ (gst_osssink_get_type()) @@ -67,23 +64,11 @@ gboolean sync; guint64 handled; - /* device */ - gchar *device; + GstOssCommon common; - /* soundcard state */ - int fd; - int caps; /* the capabilities */ - gint format; - gint width; - gint channels; - gint frequency; - gint fragment; - gint fragment_size; gboolean mute; guint bufsize; - guint bps; - guint64 fragment_time; }; struct _GstOssSinkClass { @@ -97,9 +82,6 @@ gboolean gst_osssink_factory_init(GstPlugin *plugin); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - +G_END_DECLS #endif /* __GST_OSSSINK_H__ */ Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstosssrc.c 7 Dec 2002 14:25:18 -0000 1.21 +++ gstosssrc.c 7 Dec 2002 20:54:47 -0000 1.22 @@ -51,7 +51,8 @@ enum { ARG_0, ARG_DEVICE, - ARG_BYTESPERREAD, + ARG_BUFFERSIZE, + ARG_FRAGMENT, }; GST_PAD_TEMPLATE_FACTORY (osssrc_src_factory, @@ -85,16 +86,23 @@ static void gst_osssrc_init (GstOssSrc *osssrc); static GstPadConnectReturn gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps); +static const GstFormat* gst_osssrc_get_formats (GstPad *pad); +static gboolean gst_osssrc_convert (GstPad *pad, + GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value); + static void gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static GstElementStateReturn gst_osssrc_change_state (GstElement *element); -static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event); -static void gst_osssrc_close_audio (GstOssSrc *src); -static gboolean gst_osssrc_open_audio (GstOssSrc *src); -static gboolean gst_osssrc_sync_parms (GstOssSrc *osssrc); +static const GstEventMask* gst_osssrc_get_event_masks (GstPad *pad); +static gboolean gst_osssrc_src_event (GstPad *pad, GstEvent *event); +static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event); +static const GstPadQueryType* gst_osssrc_get_query_types (GstPad *pad); +static gboolean gst_osssrc_src_query (GstPad *pad, GstPadQueryType type, + GstFormat *format, gint64 *value); static GstBuffer * gst_osssrc_get (GstPad *pad); @@ -134,12 +142,16 @@ parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BYTESPERREAD, - g_param_spec_ulong("bytes_per_read","bytes_per_read","bytes_per_read", - 0,G_MAXULONG,0,G_PARAM_READWRITE)); /* CHECKME */ + 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_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)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); gobject_class->set_property = gst_osssrc_set_property; gobject_class->get_property = gst_osssrc_get_property; @@ -155,25 +167,20 @@ GST_PAD_TEMPLATE_GET (osssrc_src_factory), "src"); gst_pad_set_get_function (osssrc->srcpad, gst_osssrc_get); gst_pad_set_connect_function (osssrc->srcpad, gst_osssrc_srcconnect); + gst_pad_set_convert_function (osssrc->srcpad, gst_osssrc_convert); + gst_pad_set_formats_function (osssrc->srcpad, gst_osssrc_get_formats); + gst_pad_set_event_function (osssrc->srcpad, gst_osssrc_src_event); + gst_pad_set_event_mask_function (osssrc->srcpad, gst_osssrc_get_event_masks); + gst_pad_set_query_function (osssrc->srcpad, gst_osssrc_src_query); + gst_pad_set_query_type_function (osssrc->srcpad, gst_osssrc_get_query_types); + + gst_element_add_pad (GST_ELEMENT (osssrc), osssrc->srcpad); - osssrc->device = g_strdup ("/dev/dsp"); - osssrc->fd = -1; + gst_osscommon_init (&osssrc->common); - /* adding some default values */ - osssrc->law = 0; - osssrc->endianness = G_BYTE_ORDER; - osssrc->sign = TRUE; - osssrc->depth = 16; - osssrc->width = 16; - osssrc->channels = 2; - osssrc->rate = 44100; - osssrc->need_eos = FALSE; - - osssrc->bytes_per_read = 4096; + osssrc->buffersize = 4096; osssrc->curoffset = 0; - osssrc->basetime = 0; - osssrc->samples_since_basetime = 0; } static GstPadConnectReturn @@ -186,29 +193,14 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_CONNECT_DELAYED; - gst_caps_get_int (caps, "law", &src->law); - gst_caps_get_int (caps, "endianness", &src->endianness); - gst_caps_get_boolean (caps, "signed", &src->sign); - gst_caps_get_int (caps, "width", &src->width); - gst_caps_get_int (caps, "depth", &src->depth); - gst_caps_get_int (caps, "rate", &src->rate); - gst_caps_get_int (caps, "channels", &src->channels); + if (!gst_osscommon_parse_caps (&src->common, caps)) + return GST_PAD_CONNECT_REFUSED; - if (!gst_osssrc_sync_parms (src)) + if (!gst_osscommon_sync_parms (&src->common)) return GST_PAD_CONNECT_REFUSED; return GST_PAD_CONNECT_OK; } -#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 static gboolean gst_osssrc_negotiate (GstPad *pad) @@ -220,16 +212,10 @@ allowed = gst_pad_get_allowed_caps (pad); - /* peel off fixed stuff from the allowed caps */ - GET_FIXED_INT (allowed, "law", &src->law); - GET_FIXED_INT (allowed, "endianness", &src->endianness); - GET_FIXED_BOOLEAN (allowed, "signed", &src->sign); - GET_FIXED_INT (allowed, "width", &src->width); - GET_FIXED_INT (allowed, "depth", &src->depth); - GET_FIXED_INT (allowed, "rate", &src->rate); - GET_FIXED_INT (allowed, "channels", &src->channels); + if (!gst_osscommon_merge_fixed_caps (&src->common, allowed)) + return FALSE; - if (!gst_osssrc_sync_parms (src)) + if (!gst_osscommon_sync_parms (&src->common)) return FALSE; /* set caps on src pad */ @@ -238,13 +224,13 @@ "oss_src", "audio/raw", "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (src->law), - "endianness", GST_PROPS_INT (src->endianness), - "signed", GST_PROPS_BOOLEAN (src->sign), - "width", GST_PROPS_INT (src->width), - "depth", GST_PROPS_INT (src->depth), - "rate", GST_PROPS_INT (src->rate), - "channels", GST_PROPS_INT (src->channels) + "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) )) <= 0) { return FALSE; @@ -258,7 +244,6 @@ GstOssSrc *src; GstBuffer *buf; glong readbytes; - glong readsamples; src = GST_OSSSRC(gst_pad_get_parent (pad)); @@ -269,10 +254,10 @@ return GST_BUFFER (gst_event_new (GST_EVENT_EOS)); } - buf = gst_buffer_new_and_alloc (src->bytes_per_read); + buf = gst_buffer_new_and_alloc (src->buffersize); - readbytes = read (src->fd,GST_BUFFER_DATA (buf), - src->bytes_per_read); + readbytes = read (src->common.fd,GST_BUFFER_DATA (buf), + src->buffersize); if (readbytes == 0) { gst_element_set_eos (GST_ELEMENT (src)); @@ -286,16 +271,16 @@ return NULL; } } + if (src->common.bps == 0) { + gst_element_error (GST_ELEMENT (src), "no format negotiated"); + return NULL; + } GST_BUFFER_SIZE (buf) = readbytes; GST_BUFFER_OFFSET (buf) = src->curoffset; - GST_BUFFER_TIMESTAMP (buf) = src->basetime + - src->samples_since_basetime * GST_SECOND / src->rate; + GST_BUFFER_TIMESTAMP (buf) = src->curoffset * GST_SECOND / src->common.bps; src->curoffset += readbytes; - readsamples = readbytes / src->channels; - if (src->width == 16) readsamples /= 2; - src->samples_since_basetime += readsamples; GST_DEBUG (GST_CAT_PLUGIN_INFO, "pushed buffer from soundcard of %ld bytes, timestamp %lld", readbytes, GST_BUFFER_TIMESTAMP (buf)); @@ -308,19 +293,20 @@ { GstOssSrc *src; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_OSSSRC (object)); - src = GST_OSSSRC (object); switch (prop_id) { - case ARG_BYTESPERREAD: - src->bytes_per_read = g_value_get_ulong (value); + case ARG_BUFFERSIZE: + src->buffersize = g_value_get_ulong (value); break; case ARG_DEVICE: - g_free(src->device); - src->device = g_strdup (g_value_get_string (value)); + 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); + break; default: break; } @@ -331,17 +317,17 @@ { GstOssSrc *src; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_OSSSRC (object)); - src = GST_OSSSRC (object); switch (prop_id) { - case ARG_BYTESPERREAD: - g_value_set_ulong (value, src->bytes_per_read); + case ARG_BUFFERSIZE: + g_value_set_ulong (value, src->buffersize); break; case ARG_DEVICE: - g_value_set_string (value, src->device); + g_value_set_string (value, src->common.device); + break; + case ARG_FRAGMENT: + g_value_set_int (value, src->common.fragment); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -361,8 +347,13 @@ break; case GST_STATE_READY_TO_PAUSED: if (!GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) { - if (!gst_osssrc_open_audio (osssrc)) + 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_PAUSED_TO_PLAYING: @@ -370,8 +361,11 @@ case GST_STATE_PLAYING_TO_PAUSED: break; case GST_STATE_PAUSED_TO_READY: - if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - gst_osssrc_close_audio (osssrc); + 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; @@ -383,103 +377,117 @@ return GST_STATE_SUCCESS; } +static const GstFormat* +gst_osssrc_get_formats (GstPad *pad) +{ + static const GstFormat formats[] = { + GST_FORMAT_TIME, + GST_FORMAT_UNITS, + GST_FORMAT_BYTES, + 0 + }; + return formats; +} + static gboolean -gst_osssrc_send_event (GstElement *element, - GstEvent *event) +gst_osssrc_convert (GstPad *pad, GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value) { - gboolean retval = FALSE; GstOssSrc *osssrc; - osssrc = GST_OSSSRC (element); + osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); + + return gst_osscommon_convert (&osssrc->common, src_format, src_value, + dest_format, dest_value); +} + +static const GstEventMask* +gst_osssrc_get_event_masks (GstPad *pad) +{ + static const GstEventMask gst_osssrc_src_event_masks[] = { + { GST_EVENT_EOS, 0 }, + { GST_EVENT_SIZE, 0 }, + { 0, } + }; + return gst_osssrc_src_event_masks; +} + +static gboolean +gst_osssrc_src_event (GstPad *pad, GstEvent *event) +{ + GstOssSrc *osssrc; + gboolean retval = FALSE; + + osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: osssrc->need_eos = TRUE; retval = TRUE; break; + case GST_EVENT_SIZE: + { + GstFormat format; + gint64 value; + + 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)) + { + osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); + g_object_notify (G_OBJECT (osssrc), "buffersize"); + retval = TRUE; + } + } default: break; } - gst_event_unref (event); return retval; } -static gboolean -gst_osssrc_open_audio (GstOssSrc *src) +static gboolean +gst_osssrc_send_event (GstElement *element, + GstEvent *event) { - g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_OSSSRC_OPEN), FALSE); - - /* first try to open the sound card */ - src->fd = open(src->device, O_RDONLY); - - /* if we have it, set the default parameters and go have fun */ - if (src->fd > 0) { - - /* set card state */ - GST_DEBUG (GST_CAT_PLUGIN_INFO,"opened audio: %s",src->device); - - GST_FLAG_SET (src, GST_OSSSRC_OPEN); - return TRUE; - } + GstOssSrc *osssrc = GST_OSSSRC (element); - return FALSE; + return gst_osssrc_src_event (osssrc->srcpad, event); } -static void -gst_osssrc_close_audio (GstOssSrc *src) +static const GstPadQueryType* +gst_osssrc_get_query_types (GstPad *pad) { - g_return_if_fail (GST_FLAG_IS_SET (src, GST_OSSSRC_OPEN)); - - close(src->fd); - src->fd = -1; - - GST_FLAG_UNSET (src, GST_OSSSRC_OPEN); -} + static const GstPadQueryType query_types[] = { + GST_PAD_QUERY_POSITION, + 0, + }; + return query_types; +} -static gboolean -gst_osssrc_sync_parms (GstOssSrc *osssrc) +static gboolean +gst_osssrc_src_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) { - audio_buf_info ispace; - gint frag; - /* remember : ioctl on samplerate returns the sample rate the card - * is actually set to ! Setting it to 44101 Hz could cause it to - * be set to 44101, for example - */ - guint rate; - gint format; - gint bps; - - g_return_val_if_fail (osssrc->fd > 0, FALSE); - - /* get rate, we don't modify the original rate as the audio device - * might not exactly give us the requested value */ - rate = osssrc->rate; - - /* transform format parameters to oss format */ - if (!gst_ossformat_get (osssrc->law, osssrc->endianness, osssrc->sign, - osssrc->width, osssrc->depth, &format, &bps)) - { - return FALSE; + gboolean res = FALSE; + GstOssSrc *osssrc; + + osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); + + switch (type) { + case GST_PAD_QUERY_POSITION: + res = gst_osscommon_convert (&osssrc->common, + GST_FORMAT_BYTES, osssrc->curoffset, + format, value); + break; + default: + break; } - - frag = 0x7fff0006; - - ioctl(osssrc->fd, SNDCTL_DSP_SETFRAGMENT, &frag); - ioctl(osssrc->fd, SNDCTL_DSP_RESET, 0); - - ioctl(osssrc->fd, SNDCTL_DSP_SETFMT, &format); - ioctl(osssrc->fd, SNDCTL_DSP_CHANNELS, &osssrc->channels); - ioctl(osssrc->fd, SNDCTL_DSP_SPEED, &rate); - ioctl(osssrc->fd, SNDCTL_DSP_GETISPACE, &ispace); - ioctl(osssrc->fd, SNDCTL_DSP_GETBLKSIZE, &frag); - - g_print("setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)\n", - rate, osssrc->width, - (osssrc->channels == 2) ? "stereo" : "mono", ispace.bytes, frag); - - return TRUE; -} + return res; +} gboolean gst_osssrc_factory_init (GstPlugin *plugin) Index: gstosssrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstosssrc.h 7 Dec 2002 14:25:18 -0000 1.5 +++ gstosssrc.h 7 Dec 2002 20:54:47 -0000 1.6 @@ -25,8 +25,8 @@ #define __GST_OSSSRC_H__ -#include <config.h> #include <gst/gst.h> +#include "gstosscommon.h" G_BEGIN_DECLS @@ -51,34 +51,18 @@ typedef struct _GstOssSrcClass GstOssSrcClass; struct _GstOssSrc { - GstElement element; + GstElement element; /* pads */ - GstPad *srcpad; - - /* device */ - gchar *device; - - /* sound card */ - gint fd; + GstPad *srcpad; - /* audio parameters */ - gint law; - gint endianness; - gint sign; - gint width; - gint depth; - gint rate; - gint channels; + GstOssCommon common; - gboolean need_eos; /* Do we need to emit an EOS? */ + gboolean need_eos; /* Do we need to emit an EOS? */ /* blocking */ - guint64 basetime; - guint64 samples_since_basetime; - gulong curoffset; - gulong bytes_per_read; - + gulong curoffset; + gulong buffersize; }; struct _GstOssSrcClass { |
From: Wim T. <wt...@us...> - 2002-12-10 20:41:28
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Tue Dec 10 2002 12:41:26 PST Log message: Properly reset the internal state without leaking the filehandle Modified files: sys/oss : gstosscommon.c gstosscommon.h gstosssink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c.diff?r1=1.2&r2=1.3 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.h.diff?r1=1.2&r2=1.3 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.47&r2=1.48 ====Begin Diffs==== Index: gstosscommon.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstosscommon.c 7 Dec 2002 20:54:47 -0000 1.2 +++ gstosscommon.c 10 Dec 2002 20:41:04 -0000 1.3 @@ -105,6 +105,12 @@ common->device = g_strdup ("/dev/dsp"); common->fd = -1; + gst_osscommon_reset (common); +} + +void +gst_osscommon_reset (GstOssCommon *common) +{ common->law = 0; common->endianness = G_BYTE_ORDER; common->sign = TRUE; Index: gstosscommon.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstosscommon.h 7 Dec 2002 20:54:47 -0000 1.2 +++ gstosscommon.h 10 Dec 2002 20:41:05 -0000 1.3 @@ -57,6 +57,7 @@ }; void gst_osscommon_init (GstOssCommon *common); +void gst_osscommon_reset (GstOssCommon *common); gboolean gst_osscommon_open_audio (GstOssCommon *common, GstOssOpenMode mode, gchar **error); Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- gstosssink.c 7 Dec 2002 20:54:47 -0000 1.47 +++ gstosssink.c 10 Dec 2002 20:41:06 -0000 1.48 @@ -589,7 +589,7 @@ 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_init (&osssink->common); + gst_osscommon_reset (&osssink->common); break; case GST_STATE_READY_TO_NULL: if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) { |
From: Wim T. <wt...@us...> - 2003-01-19 19:42:32
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sun Jan 19 2003 11:42:31 PST Log message: Enable sync again, for some reason it was disabled 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.53&r2=1.54 ====Begin Diffs==== Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- gstosssink.c 13 Jan 2003 12:48:53 -0000 1.53 +++ gstosssink.c 19 Jan 2003 19:42:18 -0000 1.54 @@ -176,7 +176,7 @@ TRUE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, g_param_spec_boolean ("sync", "Sync", "If syncing on timestamps should be enabled", - FALSE, G_PARAM_READWRITE)); + TRUE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, g_param_spec_int ("fragment", "Fragment", "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", @@ -220,7 +220,7 @@ osssink->bufsize = 4096; osssink->resync = FALSE; - osssink->sync = FALSE; + osssink->sync = TRUE; osssink->sinkpool = NULL; osssink->provided_clock = GST_CLOCK (gst_oss_clock_new ("ossclock", gst_osssink_get_time, osssink)); osssink->handled = 0; |
From: Wim T. <wt...@us...> - 2003-01-27 20:24:10
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Mon Jan 27 2003 12:24:09 PST Log message: - Add error reporting - never return a NULL buffer 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&r2=1.26 ====Begin Diffs==== Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstosssrc.c 10 Jan 2003 13:38:31 -0000 1.25 +++ gstosssrc.c 27 Jan 2003 20:23:55 -0000 1.26 @@ -25,7 +25,9 @@ #include <fcntl.h> #include <sys/soundcard.h> #include <sys/ioctl.h> +#include <errno.h> #include <unistd.h> +#include <string.h> #include <gstosssrc.h> #include <gstosscommon.h> @@ -258,22 +260,31 @@ readbytes = read (src->common.fd,GST_BUFFER_DATA (buf), src->buffersize); + if (readbytes < 0) { + gst_buffer_unref (buf); + gst_element_error (GST_ELEMENT (src), "error reading data (%s)", + strerror (errno)); + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); + } if (readbytes == 0) { + gst_buffer_unref (buf); gst_element_set_eos (GST_ELEMENT (src)); - return NULL; + 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 NULL; + 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 NULL; + return GST_BUFFER (gst_event_new (GST_EVENT_INTERRUPT)); } GST_BUFFER_SIZE (buf) = readbytes; |
From: Wim T. <wt...@us...> - 2003-01-27 20:37:04
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Mon Jan 27 2003 12:37:02 PST Log message: Removed bogus patch 1.4 to make osssrc work again. Modified files: sys/oss : gstosscommon.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstosscommon.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstosscommon.c 12 Jan 2003 11:43:46 -0000 1.4 +++ gstosscommon.c 27 Jan 2003 20:36:46 -0000 1.5 @@ -281,41 +281,25 @@ GST_INFO (GST_CAT_PLUGIN_INFO, "common: attempting to open sound device"); /* first try to open the sound card */ - /* FIXME: This code is dubious, why do we need to open and close this ? - * For linux at least this causes the second open to never return - * if the device was already in use .. */ -#ifndef __linux__ if (mode == GST_OSSCOMMON_WRITE) { -#endif + /* open non blocking first so that it returns immediatly with an error + * when we cannot get to the device */ common->fd = open (common->device, O_WRONLY | O_NONBLOCK); -#ifdef __linux__ - if (common->fd >= 0) { - /* remove the non-blocking flag */ - if(fcntl (common->fd, F_SETFL, 0) < 0) { - *error = g_strdup_printf ("osscommon: Can't make filedescriptor blocking for %s", - common->device); - return FALSE; - } - } -#else - if (errno == EBUSY) { - g_warning ("osscommon: unable to open the sound device (in use ?)\n"); - } - if (common->fd >= 0) + if (common->fd >= 0) { close (common->fd); - - /* re-open the sound device in blocking mode */ - common->fd = open (common->device, O_WRONLY); + + /* re-open the sound device in blocking mode */ + common->fd = open (common->device, O_WRONLY); + } } else { common->fd = open (common->device, O_RDONLY); } -#endif if (common->fd < 0) { switch (errno) { - case EBUSY: + case EBUSY: *error = g_strdup_printf ("osscommon: Unable to open %s (in use ?)", common->device); break; |
From: Wim T. <wt...@us...> - 2003-05-24 10:45:40
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Sat May 24 2003 03:45:39 PDT Log message: - UNITS -> DEFAULT - added chunk_size option to osssink, buffers will be written to the devive in chunks of this size, this can increase the accuracy of the clock on some devices. Modified files: sys/oss : gstosscommon.c gstosssink.c gstosssink.h gstosssrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosscommon.c.diff?r1=1.6&r2=1.7 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.55&r2=1.56 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.30&r2=1.31 ====Begin Diffs==== Index: gstosscommon.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosscommon.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstosscommon.c 2 Feb 2003 05:26:29 -0000 1.6 +++ gstosscommon.c 24 May 2003 10:45:27 -0000 1.7 @@ -405,12 +405,10 @@ switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_TIME; case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / common->bps; break; - case GST_FORMAT_UNITS: + case GST_FORMAT_DEFAULT: *dest_value = src_value / (common->channels * common->width); break; default: @@ -419,22 +417,18 @@ break; case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_BYTES; case GST_FORMAT_BYTES: *dest_value = src_value * common->bps / GST_SECOND; break; - case GST_FORMAT_UNITS: + case GST_FORMAT_DEFAULT: *dest_value = src_value * common->rate / GST_SECOND; break; default: res = FALSE; } break; - case GST_FORMAT_UNITS: + case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_format = GST_FORMAT_TIME; case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / common->rate; break; Index: gstosssink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- gstosssink.c 10 May 2003 11:35:59 -0000 1.55 +++ gstosssink.c 24 May 2003 10:45:27 -0000 1.56 @@ -77,7 +77,8 @@ ARG_MUTE, ARG_FRAGMENT, ARG_BUFFER_SIZE, - ARG_SYNC + ARG_SYNC, + ARG_CHUNK_SIZE, /* FILL ME */ }; @@ -193,8 +194,11 @@ "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", 0, G_MAXINT, 6, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_SIZE, - g_param_spec_int ("buffer_size", "Buffer size", "The buffer size", - 0, G_MAXINT, 4096, G_PARAM_READWRITE)); + g_param_spec_uint ("buffer_size", "Buffer size", "The buffer size", + 0, G_MAXINT, 4096, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHUNK_SIZE, + g_param_spec_uint ("chunk_size", "Chunk size", "Write data in chunk sized buffers", + 0, G_MAXUINT, 4096, G_PARAM_READWRITE)); gst_osssink_signals[SIGNAL_HANDOFF] = g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, @@ -231,6 +235,7 @@ gst_osscommon_init (&osssink->common); osssink->bufsize = 4096; + osssink->chunk_size = 4096; osssink->resync = FALSE; osssink->sync = TRUE; osssink->sinkpool = NULL; @@ -402,8 +407,15 @@ } } else { - write (osssink->common.fd, data, size); - osssink->handled += size; + gint to_write; + while (size > 0) { + to_write = MIN (size, osssink->chunk_size); + + write (osssink->common.fd, data, to_write); + size -= to_write; + data += to_write; + osssink->handled += to_write; + } } } /* no clock, try to be as fast as possible */ @@ -426,7 +438,7 @@ { static const GstFormat formats[] = { GST_FORMAT_TIME, - GST_FORMAT_UNITS, + GST_FORMAT_DEFAULT, GST_FORMAT_BYTES, 0 }; @@ -525,7 +537,7 @@ break; case ARG_BUFFER_SIZE: if (osssink->bufsize == g_value_get_int (value)) break; - osssink->bufsize = g_value_get_int (value); + osssink->bufsize = g_value_get_uint (value); osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); g_object_notify (object, "buffer_size"); break; @@ -533,6 +545,9 @@ osssink->sync = g_value_get_boolean (value); g_object_notify (G_OBJECT (osssink), "sync"); break; + case ARG_CHUNK_SIZE: + osssink->chunk_size = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -557,10 +572,13 @@ g_value_set_int (value, osssink->common.fragment); break; case ARG_BUFFER_SIZE: - g_value_set_int (value, osssink->bufsize); + g_value_set_uint (value, osssink->bufsize); break; case ARG_SYNC: g_value_set_boolean (value, osssink->sync); + break; + case ARG_CHUNK_SIZE: + g_value_set_uint (value, osssink->chunk_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstosssink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstosssink.h 7 Dec 2002 20:54:47 -0000 1.11 +++ gstosssink.h 24 May 2003 10:45:27 -0000 1.12 @@ -68,6 +68,7 @@ gboolean mute; guint bufsize; + guint chunk_size; }; Index: gstosssrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstosssrc.c 10 May 2003 11:35:59 -0000 1.30 +++ gstosssrc.c 24 May 2003 10:45:27 -0000 1.31 @@ -473,7 +473,7 @@ { static const GstFormat formats[] = { GST_FORMAT_TIME, - GST_FORMAT_UNITS, + GST_FORMAT_DEFAULT, GST_FORMAT_BYTES, 0 }; |