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 { |
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); |
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 { |