From: Benjamin O. <co...@us...> - 2003-04-24 00:03:23
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: company Date: Wed Apr 23 2003 17:03:21 PDT Log message: total code reorganization as a start to get alsasrc working - sink and src are now really different classes, not just on paper - includes a fix that makes the testsuite work that might be an older bug Modified files: ext/alsa : gstalsa.c gstalsa.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/alsa/gstalsa.c.diff?r1=1.51&r2=1.52 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/alsa/gstalsa.h.diff?r1=1.17&r2=1.18 ====Begin Diffs==== Index: gstalsa.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/ext/alsa/gstalsa.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- gstalsa.c 22 Apr 2003 23:33:04 -0000 1.51 +++ gstalsa.c 24 Apr 2003 00:03:06 -0000 1.52 @@ -93,12 +93,31 @@ GValue * value, GParamSpec * pspec); -/* GStreamer functions for pads and state changing */ -static GstPadTemplate * gst_alsa_src_pad_factory (void); -static GstPadTemplate * gst_alsa_src_request_pad_factory (void); +/* GstAlsaSink functions */ static GstPadTemplate * gst_alsa_sink_pad_factory (void); static GstPadTemplate * gst_alsa_sink_request_pad_factory (void); +static void gst_alsa_sink_class_init (GstAlsaSinkClass * klass); +static void gst_alsa_sink_init (GstAlsaSink * this); [...1295 lines suppressed...] - (snd_pcm_state (this->handle) == SND_PCM_STATE_PAUSED || - snd_pcm_state (this->handle) == SND_PCM_STATE_XRUN || - snd_pcm_state (this->handle) == SND_PCM_STATE_RUNNING)) { - gst_alsa_clock_stop (this->clock); - ERROR_CHECK (snd_pcm_drop (this->handle), - "couldn't stop (dropping frames): %s"); + switch (snd_pcm_state (this->handle)) { + case SND_PCM_STATE_XRUN: + case SND_PCM_STATE_RUNNING: + gst_alsa_clock_stop (this->clock); + /* fall through - clock is already stopped when paused */ + case SND_PCM_STATE_PAUSED: + ERROR_CHECK (snd_pcm_drop (this->handle), + "couldn't stop (dropping frames): %s"); + break; + default: + break; } GST_FLAG_UNSET (this, GST_ALSA_RUNNING); Index: gstalsa.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/ext/alsa/gstalsa.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstalsa.h 22 Apr 2003 18:28:33 -0000 1.17 +++ gstalsa.h 24 Apr 2003 00:03:06 -0000 1.18 @@ -38,6 +38,7 @@ #define GST_ALSA(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_ALSA, GstAlsa) #define GST_ALSA_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_ALSA, GstAlsaClass) +#define GST_ALSA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ALSA, GstAlsaClass)) #define GST_IS_ALSA(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_ALSA) #define GST_IS_ALSA_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_ALSA) #define GST_TYPE_ALSA gst_alsa_get_type() @@ -65,10 +66,10 @@ typedef struct _GstAlsa GstAlsa; typedef struct _GstAlsaClass GstAlsaClass; -typedef GstAlsa GstAlsaSink; -typedef GstAlsaClass GstAlsaSinkClass; -typedef GstAlsa GstAlsaSrc; -typedef GstAlsaClass GstAlsaSrcClass; +typedef struct _GstAlsaSink GstAlsaSink; +typedef struct _GstAlsaSinkClass GstAlsaSinkClass; +typedef struct _GstAlsaSrc GstAlsaSrc; +typedef struct _GstAlsaSrcClass GstAlsaSrcClass; typedef struct _GstAlsaClock GstAlsaClock; typedef struct _GstAlsaClockClass GstAlsaClockClass; @@ -99,14 +100,6 @@ typedef int (*GstAlsaTransmitFunction) (GstAlsa *this, snd_pcm_sframes_t *avail); typedef struct { - GstPad * pad; - guint8 * data; /* pointer into buffer */ - guint size; /* sink: bytes left in buffer */ - GstBuffer * buf; /* current buffer */ - guint behaviour; /* 0 = data points into buffer (so unref when size == 0), - 1 = data should be freed, use buffer after that */ -} GstAlsaPad; -typedef struct { snd_pcm_format_t format; guint rate; gint channels; @@ -116,10 +109,9 @@ GstElement parent; /* array of GstAlsaPads */ - GstAlsaPad pads[GST_ALSA_MAX_CHANNELS]; + GstPad * pad[GST_ALSA_MAX_CHANNELS]; gchar * device; - snd_pcm_stream_t stream; snd_pcm_t * handle; guint pcm_caps; /* capabilities of the pcm device, see GstAlsaPcmCaps */ snd_output_t * out; @@ -146,9 +138,32 @@ */ }; struct _GstAlsaClass { - GstElementClass parent_class; -}; + GstElementClass parent_class; + snd_pcm_stream_t stream; + + /* different transmit functions */ + GstAlsaTransmitFunction transmit_mmap; + GstAlsaTransmitFunction transmit_rw; +}; +struct _GstAlsaSink { + GstAlsa parent; + /* array of the data on the channels */ + guint8 * data[GST_ALSA_MAX_CHANNELS]; /* pointer into buffer */ + guint size[GST_ALSA_MAX_CHANNELS]; /* sink: bytes left in buffer */ + GstBuffer * buf[GST_ALSA_MAX_CHANNELS]; /* current buffer */ + guint behaviour[GST_ALSA_MAX_CHANNELS]; /* 0 = data points into buffer (so unref when size == 0), + 1 = data should be freed, use buffer after that */ +}; +struct _GstAlsaSinkClass { + GstAlsaClass parent_class; +}; +struct _GstAlsaSrc { + GstAlsa parent; +}; +struct _GstAlsaSrcClass { + GstAlsaClass parent_class; +}; struct _GstAlsaClock { GstSystemClock parent; |