OSStatus gst_osx_audio_sink_io_proc (AudioDeviceID inDevice, const AudioTimeStamp * inNow, const AudioBufferList * inInputData, const AudioTimeStamp * inInputTime, AudioBufferList * outOutputData, const AudioTimeStamp * inOutputTime, void *inClientData) { GstOsxRingBuffer *buf = GST_OSX_RING_BUFFER (inClientData); guint8 *readptr; gint readseg; gint len; if (gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), &readseg, &readptr, &len)) { outOutputData->mBuffers[0].mDataByteSize = len; memcpy ((char *) outOutputData->mBuffers[0].mData, readptr, len); /* clear written samples */ gst_ring_buffer_clear (GST_RING_BUFFER (buf), readseg); /* we wrote one segment */ gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); } return 0; }
static OSStatus gst_osx_audio_src_io_proc (GstOsxRingBuffer * buf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList) { OSStatus status; guint8 *writeptr; gint writeseg; gint len; gint remaining; gint offset = 0; status = AudioUnitRender (buf->core_audio->audiounit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, buf->core_audio->recBufferList); if (status) { GST_WARNING_OBJECT (buf, "AudioUnitRender returned %d", (int) status); return status; } remaining = buf->core_audio->recBufferList->mBuffers[0].mDataByteSize; while (remaining) { if (!gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), &writeseg, &writeptr, &len)) return 0; len -= buf->segoffset; if (len > remaining) len = remaining; memcpy (writeptr + buf->segoffset, (char *) buf->core_audio->recBufferList->mBuffers[0].mData + offset, len); buf->segoffset += len; offset += len; remaining -= len; if ((gint) buf->segoffset == GST_RING_BUFFER (buf)->spec.segsize) { /* we wrote one segment */ gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); buf->segoffset = 0; } } return 0; }
/* GstBaseAudioSrc vmethod implementations */ static GstRingBuffer * gst_directsound_src_create_ringbuffer (GstBaseAudioSrc * src) { GstDirectSoundSrc * dsoundsrc; GstDirectSoundRingBuffer * ringbuffer; dsoundsrc = GST_DIRECTSOUND_SRC (src); GST_DEBUG ("creating ringbuffer"); ringbuffer = g_object_new (GST_TYPE_DIRECTSOUND_RING_BUFFER, NULL); GST_DEBUG ("directsound src 0x%p", dsoundsrc); /* capture */ ringbuffer->is_src = TRUE; /* set the src element on the ringbuffer for error messages */ ringbuffer->element = GST_ELEMENT (dsoundsrc); /* set the ringbuffer on the src */ dsoundsrc->dsoundbuffer = ringbuffer; /* set initial volume on ringbuffer */ dsoundsrc->dsoundbuffer->volume = dsoundsrc->volume; return GST_RING_BUFFER (ringbuffer); }
/* GstBaseAudioSink vmethod implementations */ static GstRingBuffer * gst_osx_audio_sink_create_ringbuffer (GstBaseAudioSink * sink) { GstOsxAudioSink *osxsink; osxsink = GST_OSX_AUDIO_SINK (sink); if (!osxsink->ringbuffer) { GST_DEBUG ("Creating ringbuffer"); osxsink->ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); GST_DEBUG ("osx sink 0x%p element 0x%p ioproc 0x%p", osxsink, GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink), (void *) gst_osx_audio_sink_io_proc); osxsink->ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink); } return GST_RING_BUFFER (osxsink->ringbuffer); }
static GstRingBuffer * gst_osx_audio_src_create_ringbuffer (GstBaseAudioSrc * src) { GstOsxAudioSrc *osxsrc; GstOsxRingBuffer *ringbuffer; osxsrc = GST_OSX_AUDIO_SRC (src); gst_osx_audio_src_select_device (osxsrc); GST_DEBUG ("Creating ringbuffer"); ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); GST_DEBUG ("osx src 0x%p element 0x%p ioproc 0x%p", osxsrc, GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc), (void *) gst_osx_audio_src_io_proc); ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc); ringbuffer->is_src = TRUE; ringbuffer->device_id = osxsrc->device_id; return GST_RING_BUFFER (ringbuffer); }