gst_plugins_base/gst-libs/gst/audio/gstaudiosrc.c
branchRCL_3
changeset 29 567bb019e3e3
parent 0 0e761a78d257
child 30 7e817e7e631c
equal deleted inserted replaced
6:9b2c3c7a1a9c 29:567bb019e3e3
    68  */
    68  */
    69 
    69 
    70 #include <string.h>
    70 #include <string.h>
    71 
    71 
    72 #include "gstaudiosrc.h"
    72 #include "gstaudiosrc.h"
    73 
       
    74 #ifdef __SYMBIAN32__
       
    75 #include <glib_global.h>
       
    76 #endif
       
    77 
    73 
    78 GST_DEBUG_CATEGORY_STATIC (gst_audio_src_debug);
    74 GST_DEBUG_CATEGORY_STATIC (gst_audio_src_debug);
    79 #define GST_CAT_DEFAULT gst_audio_src_debug
    75 #define GST_CAT_DEFAULT gst_audio_src_debug
    80 
    76 
    81 #define GST_TYPE_AUDIORING_BUFFER        \
    77 #define GST_TYPE_AUDIORING_BUFFER        \
   201 {
   197 {
   202   GstAudioSrc *src;
   198   GstAudioSrc *src;
   203   GstAudioSrcClass *csrc;
   199   GstAudioSrcClass *csrc;
   204   GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER (buf);
   200   GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER (buf);
   205   ReadFunc readfunc;
   201   ReadFunc readfunc;
       
   202   GstMessage *message;
       
   203   GValue val = { 0 };
   206 
   204 
   207   src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
   205   src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
   208   csrc = GST_AUDIO_SRC_GET_CLASS (src);
   206   csrc = GST_AUDIO_SRC_GET_CLASS (src);
   209 
   207 
   210   GST_DEBUG_OBJECT (src, "enter thread");
   208   GST_DEBUG_OBJECT (src, "enter thread");
   211 
   209 
   212   readfunc = csrc->read;
   210   readfunc = csrc->read;
   213   if (readfunc == NULL)
   211   if (readfunc == NULL)
   214     goto no_function;
   212     goto no_function;
       
   213 
       
   214   g_value_init (&val, G_TYPE_POINTER);
       
   215   g_value_set_pointer (&val, src->thread);
       
   216   message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
       
   217       GST_STREAM_STATUS_TYPE_ENTER, GST_ELEMENT_CAST (src));
       
   218   gst_message_set_stream_status_object (message, &val);
       
   219   GST_DEBUG_OBJECT (src, "posting ENTER stream status");
       
   220   gst_element_post_message (GST_ELEMENT_CAST (src), message);
   215 
   221 
   216   while (TRUE) {
   222   while (TRUE) {
   217     gint left, len;
   223     gint left, len;
   218     guint8 *readptr;
   224     guint8 *readptr;
   219     gint readseg;
   225     gint readseg;
   220 
   226 
   221     if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
   227     if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
   222       gint read = 0;
   228       gint read;
   223 
   229 
   224       left = len;
   230       left = len;
   225       do {
   231       do {
   226         read = readfunc (src, readptr + read, left);
   232         read = readfunc (src, readptr, left);
   227         GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
   233         GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
   228             left, readseg);
   234             left, readseg);
   229         if (read < 0 || read > left) {
   235         if (read < 0 || read > left) {
   230           GST_WARNING_OBJECT (src,
   236           GST_WARNING_OBJECT (src,
   231               "error reading data (reason: %s), skipping segment",
   237               "error reading data %d (reason: %s), skipping segment", read,
   232               g_strerror (errno));
   238               g_strerror (errno));
   233           break;
   239           break;
   234         }
   240         }
   235         left -= read;
   241         left -= read;
       
   242         readptr += read;
   236       } while (left > 0);
   243       } while (left > 0);
   237 
   244 
   238       /* we read one segment */
   245       /* we read one segment */
   239       gst_ring_buffer_advance (buf, 1);
   246       gst_ring_buffer_advance (buf, 1);
   240     } else {
   247     } else {
   250         goto stop_running;
   257         goto stop_running;
   251       GST_DEBUG_OBJECT (src, "continue running");
   258       GST_DEBUG_OBJECT (src, "continue running");
   252       GST_OBJECT_UNLOCK (abuf);
   259       GST_OBJECT_UNLOCK (abuf);
   253     }
   260     }
   254   }
   261   }
   255   GST_DEBUG_OBJECT (src, "exit thread");
   262 
   256 
   263   /* Will never be reached */
       
   264   g_assert_not_reached ();
   257   return;
   265   return;
   258 
   266 
   259   /* ERROR */
   267   /* ERROR */
   260 no_function:
   268 no_function:
   261   {
   269   {
   264   }
   272   }
   265 stop_running:
   273 stop_running:
   266   {
   274   {
   267     GST_OBJECT_UNLOCK (abuf);
   275     GST_OBJECT_UNLOCK (abuf);
   268     GST_DEBUG ("stop running, exit thread");
   276     GST_DEBUG ("stop running, exit thread");
       
   277     message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
       
   278         GST_STREAM_STATUS_TYPE_LEAVE, GST_ELEMENT_CAST (src));
       
   279     gst_message_set_stream_status_object (message, &val);
       
   280     GST_DEBUG_OBJECT (src, "posting LEAVE stream status");
       
   281     gst_element_post_message (GST_ELEMENT_CAST (src), message);
   269     return;
   282     return;
   270   }
   283   }
   271 }
   284 }
   272 
   285 
   273 static void
   286 static void
   361   if (csrc->prepare)
   374   if (csrc->prepare)
   362     result = csrc->prepare (src, spec);
   375     result = csrc->prepare (src, spec);
   363 
   376 
   364   if (!result)
   377   if (!result)
   365     goto could_not_open;
   378     goto could_not_open;
   366 
       
   367   /* allocate one more segment as we need some headroom */
       
   368   spec->segtotal++;
       
   369 
   379 
   370   buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
   380   buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
   371   memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data));
   381   memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data));
   372 
   382 
   373   abuf = GST_AUDIORING_BUFFER (buf);
   383   abuf = GST_AUDIORING_BUFFER (buf);
   444   if (csrc->reset) {
   454   if (csrc->reset) {
   445     GST_DEBUG ("reset...");
   455     GST_DEBUG ("reset...");
   446     csrc->reset (src);
   456     csrc->reset (src);
   447     GST_DEBUG ("reset done");
   457     GST_DEBUG ("reset done");
   448   }
   458   }
   449 
   459 #if 0
   450   GST_DEBUG ("stop, waiting...");
   460   GST_DEBUG ("stop, waiting...");
   451   GST_AUDIORING_BUFFER_WAIT (buf);
   461   GST_AUDIORING_BUFFER_WAIT (buf);
   452   GST_DEBUG ("stoped");
   462   GST_DEBUG ("stoped");
       
   463 #endif
   453 
   464 
   454   return TRUE;
   465   return TRUE;
   455 }
   466 }
   456 
   467 
   457 static guint
   468 static guint
   510   gstpushsrc_class = (GstPushSrcClass *) klass;
   521   gstpushsrc_class = (GstPushSrcClass *) klass;
   511   gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
   522   gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
   512 
   523 
   513   gstbaseaudiosrc_class->create_ringbuffer =
   524   gstbaseaudiosrc_class->create_ringbuffer =
   514       GST_DEBUG_FUNCPTR (gst_audio_src_create_ringbuffer);
   525       GST_DEBUG_FUNCPTR (gst_audio_src_create_ringbuffer);
       
   526 
       
   527   g_type_class_ref (GST_TYPE_AUDIORING_BUFFER);
   515 }
   528 }
   516 
   529 
   517 static void
   530 static void
   518 gst_audio_src_init (GstAudioSrc * audiosrc, GstAudioSrcClass * g_class)
   531 gst_audio_src_init (GstAudioSrc * audiosrc, GstAudioSrcClass * g_class)
   519 {
   532 {