Remove glib-compat-private.h stuff we don't need any more
[platform/upstream/gstreamer.git] / gst-libs / gst / audio / gstaudiosrc.c
index 57864d1..d6eff00 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * SECTION:gstaudiosrc
  * @short_description: Simple base class for audio sources
- * @see_also: #GstBaseAudioSrc, #GstRingBuffer, #GstAudioSrc.
+ * @see_also: #GstAudioBaseSrc, #GstAudioRingBuffer, #GstAudioSrc.
  *
  * This is the most simple base class for audio sources that only requires
  * subclasses to implement a set of simple functions:
@@ -61,8 +61,8 @@
  * </variablelist>
  *
  * All scheduling of samples and timestamps is done in this base class
- * together with #GstBaseAudioSrc using a default implementation of a
- * #GstRingBuffer that uses threads.
+ * together with #GstAudioBaseSrc using a default implementation of a
+ * #GstAudioRingBuffer that uses threads.
  *
  * Last reviewed on 2006-09-27 (0.10.12)
  */
 GST_DEBUG_CATEGORY_STATIC (gst_audio_src_debug);
 #define GST_CAT_DEFAULT gst_audio_src_debug
 
-#define GST_TYPE_AUDIORING_BUFFER        \
-        (gst_audioringbuffer_get_type())
-#define GST_AUDIORING_BUFFER(obj)        \
-        (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBuffer))
-#define GST_AUDIORING_BUFFER_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBufferClass))
-#define GST_AUDIORING_BUFFER_GET_CLASS(obj) \
-        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIORING_BUFFER, GstAudioRingBufferClass))
-#define GST_IS_AUDIORING_BUFFER(obj)     \
-        (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIORING_BUFFER))
-#define GST_IS_AUDIORING_BUFFER_CLASS(klass)\
-        (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIORING_BUFFER))
-
-typedef struct _GstAudioRingBuffer GstAudioRingBuffer;
-typedef struct _GstAudioRingBufferClass GstAudioRingBufferClass;
-
-#define GST_AUDIORING_BUFFER_GET_COND(buf) (((GstAudioRingBuffer *)buf)->cond)
-#define GST_AUDIORING_BUFFER_WAIT(buf)     (g_cond_wait (GST_AUDIORING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
-#define GST_AUDIORING_BUFFER_SIGNAL(buf)   (g_cond_signal (GST_AUDIORING_BUFFER_GET_COND (buf)))
-#define GST_AUDIORING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIORING_BUFFER_GET_COND (buf)))
-
-struct _GstAudioRingBuffer
+#define GST_TYPE_AUDIO_SRC_RING_BUFFER        \
+        (gst_audio_src_ring_buffer_get_type())
+#define GST_AUDIO_SRC_RING_BUFFER(obj)        \
+        (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_SRC_RING_BUFFER,GstAudioSrcRingBuffer))
+#define GST_AUDIO_SRC_RING_BUFFER_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_SRC_RING_BUFFER,GstAudioSrcRingBufferClass))
+#define GST_AUDIO_SRC_RING_BUFFER_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIO_SRC_RING_BUFFER, GstAudioSrcRingBufferClass))
+#define GST_IS_AUDIO_SRC_RING_BUFFER(obj)     \
+        (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_SRC_RING_BUFFER))
+#define GST_IS_AUDIO_SRC_RING_BUFFER_CLASS(klass)\
+        (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_SRC_RING_BUFFER))
+
+typedef struct _GstAudioSrcRingBuffer GstAudioSrcRingBuffer;
+typedef struct _GstAudioSrcRingBufferClass GstAudioSrcRingBufferClass;
+
+#define GST_AUDIO_SRC_RING_BUFFER_GET_COND(buf) (((GstAudioSrcRingBuffer *)buf)->cond)
+#define GST_AUDIO_SRC_RING_BUFFER_WAIT(buf)     (g_cond_wait (GST_AUDIO_SRC_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
+#define GST_AUDIO_SRC_RING_BUFFER_SIGNAL(buf)   (g_cond_signal (GST_AUDIO_SRC_RING_BUFFER_GET_COND (buf)))
+#define GST_AUDIO_SRC_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIO_SRC_RING_BUFFER_GET_COND (buf)))
+
+struct _GstAudioSrcRingBuffer
 {
-  GstRingBuffer object;
+  GstAudioRingBuffer object;
 
   gboolean running;
   gint queuedseg;
@@ -105,82 +105,89 @@ struct _GstAudioRingBuffer
   GCond *cond;
 };
 
-struct _GstAudioRingBufferClass
+struct _GstAudioSrcRingBufferClass
 {
-  GstRingBufferClass parent_class;
+  GstAudioRingBufferClass parent_class;
 };
 
-static void gst_audioringbuffer_class_init (GstAudioRingBufferClass * klass);
-static void gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
-    GstAudioRingBufferClass * klass);
-static void gst_audioringbuffer_dispose (GObject * object);
-static void gst_audioringbuffer_finalize (GObject * object);
-
-static GstRingBufferClass *ring_parent_class = NULL;
-
-static gboolean gst_audioringbuffer_open_device (GstRingBuffer * buf);
-static gboolean gst_audioringbuffer_close_device (GstRingBuffer * buf);
-static gboolean gst_audioringbuffer_acquire (GstRingBuffer * buf,
-    GstRingBufferSpec * spec);
-static gboolean gst_audioringbuffer_release (GstRingBuffer * buf);
-static gboolean gst_audioringbuffer_start (GstRingBuffer * buf);
-static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf);
-static guint gst_audioringbuffer_delay (GstRingBuffer * buf);
+static void gst_audio_src_ring_buffer_class_init (GstAudioSrcRingBufferClass *
+    klass);
+static void gst_audio_src_ring_buffer_init (GstAudioSrcRingBuffer * ringbuffer,
+    GstAudioSrcRingBufferClass * klass);
+static void gst_audio_src_ring_buffer_dispose (GObject * object);
+static void gst_audio_src_ring_buffer_finalize (GObject * object);
+
+static GstAudioRingBufferClass *ring_parent_class = NULL;
+
+static gboolean gst_audio_src_ring_buffer_open_device (GstAudioRingBuffer *
+    buf);
+static gboolean gst_audio_src_ring_buffer_close_device (GstAudioRingBuffer *
+    buf);
+static gboolean gst_audio_src_ring_buffer_acquire (GstAudioRingBuffer * buf,
+    GstAudioRingBufferSpec * spec);
+static gboolean gst_audio_src_ring_buffer_release (GstAudioRingBuffer * buf);
+static gboolean gst_audio_src_ring_buffer_start (GstAudioRingBuffer * buf);
+static gboolean gst_audio_src_ring_buffer_stop (GstAudioRingBuffer * buf);
+static guint gst_audio_src_ring_buffer_delay (GstAudioRingBuffer * buf);
 
 /* ringbuffer abstract base class */
 static GType
-gst_audioringbuffer_get_type (void)
+gst_audio_src_ring_buffer_get_type (void)
 {
   static GType ringbuffer_type = 0;
 
   if (!ringbuffer_type) {
     static const GTypeInfo ringbuffer_info = {
-      sizeof (GstAudioRingBufferClass),
+      sizeof (GstAudioSrcRingBufferClass),
       NULL,
       NULL,
-      (GClassInitFunc) gst_audioringbuffer_class_init,
+      (GClassInitFunc) gst_audio_src_ring_buffer_class_init,
       NULL,
       NULL,
-      sizeof (GstAudioRingBuffer),
+      sizeof (GstAudioSrcRingBuffer),
       0,
-      (GInstanceInitFunc) gst_audioringbuffer_init,
+      (GInstanceInitFunc) gst_audio_src_ring_buffer_init,
       NULL
     };
 
     ringbuffer_type =
-        g_type_register_static (GST_TYPE_RING_BUFFER, "GstAudioSrcRingBuffer",
-        &ringbuffer_info, 0);
+        g_type_register_static (GST_TYPE_AUDIO_RING_BUFFER,
+        "GstAudioSrcRingBuffer", &ringbuffer_info, 0);
   }
   return ringbuffer_type;
 }
 
 static void
-gst_audioringbuffer_class_init (GstAudioRingBufferClass * klass)
+gst_audio_src_ring_buffer_class_init (GstAudioSrcRingBufferClass * klass)
 {
   GObjectClass *gobject_class;
-  GstRingBufferClass *gstringbuffer_class;
+  GstAudioRingBufferClass *gstringbuffer_class;
 
   gobject_class = (GObjectClass *) klass;
-  gstringbuffer_class = (GstRingBufferClass *) klass;
+  gstringbuffer_class = (GstAudioRingBufferClass *) klass;
 
   ring_parent_class = g_type_class_peek_parent (klass);
 
-  gobject_class->dispose = gst_audioringbuffer_dispose;
-  gobject_class->finalize = gst_audioringbuffer_finalize;
+  gobject_class->dispose = gst_audio_src_ring_buffer_dispose;
+  gobject_class->finalize = gst_audio_src_ring_buffer_finalize;
 
   gstringbuffer_class->open_device =
-      GST_DEBUG_FUNCPTR (gst_audioringbuffer_open_device);
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_open_device);
   gstringbuffer_class->close_device =
-      GST_DEBUG_FUNCPTR (gst_audioringbuffer_close_device);
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_close_device);
   gstringbuffer_class->acquire =
-      GST_DEBUG_FUNCPTR (gst_audioringbuffer_acquire);
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_acquire);
   gstringbuffer_class->release =
-      GST_DEBUG_FUNCPTR (gst_audioringbuffer_release);
-  gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
-  gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
-  gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_audioringbuffer_stop);
-
-  gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_audioringbuffer_delay);
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_release);
+  gstringbuffer_class->start =
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_start);
+  gstringbuffer_class->resume =
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_start);
+  gstringbuffer_class->stop =
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_stop);
+
+  gstringbuffer_class->delay =
+      GST_DEBUG_FUNCPTR (gst_audio_src_ring_buffer_delay);
 }
 
 typedef guint (*ReadFunc) (GstAudioSrc * src, gpointer data, guint length);
@@ -191,11 +198,11 @@ typedef guint (*ReadFunc) (GstAudioSrc * src, gpointer data, guint length);
  * The start/stop methods control the thread.
  */
 static void
-audioringbuffer_thread_func (GstRingBuffer * buf)
+audioringbuffer_thread_func (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
-  GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER (buf);
+  GstAudioSrcRingBuffer *abuf = GST_AUDIO_SRC_RING_BUFFER (buf);
   ReadFunc readfunc;
   GstMessage *message;
   GValue val = { 0 };
@@ -223,7 +230,7 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
     guint8 *readptr;
     gint readseg;
 
-    if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
+    if (gst_audio_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
       gint read;
 
       left = len;
@@ -242,15 +249,20 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
       } while (left > 0);
 
       /* we read one segment */
-      gst_ring_buffer_advance (buf, 1);
+      gst_audio_ring_buffer_advance (buf, 1);
     } else {
       GST_OBJECT_LOCK (abuf);
       if (!abuf->running)
         goto stop_running;
+      if (G_UNLIKELY (g_atomic_int_get (&buf->state) ==
+              GST_AUDIO_RING_BUFFER_STATE_STARTED)) {
+        GST_OBJECT_UNLOCK (abuf);
+        continue;
+      }
       GST_DEBUG_OBJECT (src, "signal wait");
-      GST_AUDIORING_BUFFER_SIGNAL (buf);
+      GST_AUDIO_SRC_RING_BUFFER_SIGNAL (buf);
       GST_DEBUG_OBJECT (src, "wait for action");
-      GST_AUDIORING_BUFFER_WAIT (buf);
+      GST_AUDIO_SRC_RING_BUFFER_WAIT (buf);
       GST_DEBUG_OBJECT (src, "got signal");
       if (!abuf->running)
         goto stop_running;
@@ -283,8 +295,8 @@ stop_running:
 }
 
 static void
-gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
-    GstAudioRingBufferClass * g_class)
+gst_audio_src_ring_buffer_init (GstAudioSrcRingBuffer * ringbuffer,
+    GstAudioSrcRingBufferClass * g_class)
 {
   ringbuffer->running = FALSE;
   ringbuffer->queuedseg = 0;
@@ -293,9 +305,9 @@ gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
 }
 
 static void
-gst_audioringbuffer_dispose (GObject * object)
+gst_audio_src_ring_buffer_dispose (GObject * object)
 {
-  GstAudioRingBuffer *ringbuffer = GST_AUDIORING_BUFFER (object);
+  GstAudioSrcRingBuffer *ringbuffer = GST_AUDIO_SRC_RING_BUFFER (object);
 
   if (ringbuffer->cond) {
     g_cond_free (ringbuffer->cond);
@@ -306,13 +318,13 @@ gst_audioringbuffer_dispose (GObject * object)
 }
 
 static void
-gst_audioringbuffer_finalize (GObject * object)
+gst_audio_src_ring_buffer_finalize (GObject * object)
 {
   G_OBJECT_CLASS (ring_parent_class)->finalize (object);
 }
 
 static gboolean
-gst_audioringbuffer_open_device (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_open_device (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
@@ -336,7 +348,7 @@ could_not_open:
 }
 
 static gboolean
-gst_audioringbuffer_close_device (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_close_device (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
@@ -360,11 +372,12 @@ could_not_open:
 }
 
 static gboolean
-gst_audioringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
+gst_audio_src_ring_buffer_acquire (GstAudioRingBuffer * buf,
+    GstAudioRingBufferSpec * spec)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
-  GstAudioRingBuffer *abuf;
+  GstAudioSrcRingBuffer *abuf;
   gboolean result = FALSE;
 
   src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
@@ -379,13 +392,14 @@ gst_audioringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
   buf->size = spec->segtotal * spec->segsize;
   buf->memory = g_malloc0 (buf->size);
 
-  abuf = GST_AUDIORING_BUFFER (buf);
+  abuf = GST_AUDIO_SRC_RING_BUFFER (buf);
   abuf->running = TRUE;
 
-  src->thread =
-      g_thread_create ((GThreadFunc) audioringbuffer_thread_func, buf, TRUE,
-      NULL);
-  GST_AUDIORING_BUFFER_WAIT (buf);
+  /* FIXME: handle thread creation failure */
+  src->thread = g_thread_try_new ("audiosrc-ringbuffer",
+      (GThreadFunc) audioringbuffer_thread_func, buf, NULL);
+
+  GST_AUDIO_SRC_RING_BUFFER_WAIT (buf);
 
   return result;
 
@@ -397,19 +411,19 @@ could_not_open:
 
 /* function is called with LOCK */
 static gboolean
-gst_audioringbuffer_release (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_release (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
-  GstAudioRingBuffer *abuf;
+  GstAudioSrcRingBuffer *abuf;
   gboolean result = FALSE;
 
   src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
   csrc = GST_AUDIO_SRC_GET_CLASS (src);
-  abuf = GST_AUDIORING_BUFFER (buf);
+  abuf = GST_AUDIO_SRC_RING_BUFFER (buf);
 
   abuf->running = FALSE;
-  GST_AUDIORING_BUFFER_SIGNAL (buf);
+  GST_AUDIO_SRC_RING_BUFFER_SIGNAL (buf);
   GST_OBJECT_UNLOCK (buf);
 
   /* join the thread */
@@ -428,16 +442,16 @@ gst_audioringbuffer_release (GstRingBuffer * buf)
 }
 
 static gboolean
-gst_audioringbuffer_start (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_start (GstAudioRingBuffer * buf)
 {
   GST_DEBUG ("start, sending signal");
-  GST_AUDIORING_BUFFER_SIGNAL (buf);
+  GST_AUDIO_SRC_RING_BUFFER_SIGNAL (buf);
 
   return TRUE;
 }
 
 static gboolean
-gst_audioringbuffer_stop (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_stop (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
@@ -453,7 +467,7 @@ gst_audioringbuffer_stop (GstRingBuffer * buf)
   }
 #if 0
   GST_DEBUG ("stop, waiting...");
-  GST_AUDIORING_BUFFER_WAIT (buf);
+  GST_AUDIO_SRC_RING_BUFFER_WAIT (buf);
   GST_DEBUG ("stoped");
 #endif
 
@@ -461,7 +475,7 @@ gst_audioringbuffer_stop (GstRingBuffer * buf)
 }
 
 static guint
-gst_audioringbuffer_delay (GstRingBuffer * buf)
+gst_audio_src_ring_buffer_delay (GstAudioRingBuffer * buf)
 {
   GstAudioSrc *src;
   GstAudioSrcClass *csrc;
@@ -492,21 +506,22 @@ enum
     GST_DEBUG_CATEGORY_INIT (gst_audio_src_debug, "audiosrc", 0, "audiosrc element");
 #define gst_audio_src_parent_class parent_class
 G_DEFINE_TYPE_WITH_CODE (GstAudioSrc, gst_audio_src,
-    GST_TYPE_BASE_AUDIO_SRC, _do_init);
+    GST_TYPE_AUDIO_BASE_SRC, _do_init);
 
-static GstRingBuffer *gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src);
+static GstAudioRingBuffer *gst_audio_src_create_ringbuffer (GstAudioBaseSrc *
+    src);
 
 static void
 gst_audio_src_class_init (GstAudioSrcClass * klass)
 {
-  GstBaseAudioSrcClass *gstbaseaudiosrc_class;
+  GstAudioBaseSrcClass *gstaudiobasesrc_class;
 
-  gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
+  gstaudiobasesrc_class = (GstAudioBaseSrcClass *) klass;
 
-  gstbaseaudiosrc_class->create_ringbuffer =
+  gstaudiobasesrc_class->create_ringbuffer =
       GST_DEBUG_FUNCPTR (gst_audio_src_create_ringbuffer);
 
-  g_type_class_ref (GST_TYPE_AUDIORING_BUFFER);
+  g_type_class_ref (GST_TYPE_AUDIO_SRC_RING_BUFFER);
 }
 
 static void
@@ -514,13 +529,13 @@ gst_audio_src_init (GstAudioSrc * audiosrc)
 {
 }
 
-static GstRingBuffer *
-gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
+static GstAudioRingBuffer *
+gst_audio_src_create_ringbuffer (GstAudioBaseSrc * src)
 {
-  GstRingBuffer *buffer;
+  GstAudioRingBuffer *buffer;
 
   GST_DEBUG ("creating ringbuffer");
-  buffer = g_object_new (GST_TYPE_AUDIORING_BUFFER, NULL);
+  buffer = g_object_new (GST_TYPE_AUDIO_SRC_RING_BUFFER, NULL);
   GST_DEBUG ("created ringbuffer @%p", buffer);
 
   return buffer;