gint writeseg;
gint len;
gint remaining;
+ UInt32 n;
gint offset = 0;
+ /* Previous invoke of AudioUnitRender changed mDataByteSize into
+ * number of bytes actually read. Reset the members. */
+ for (n = 0; n < buf->core_audio->recBufferList->mNumberBuffers; ++n) {
+ buf->core_audio->recBufferList->mBuffers[n].mDataByteSize =
+ buf->core_audio->recBufferSize;
+ }
+
status = AudioUnitRender (buf->core_audio->audiounit, ioActionFlags,
inTimeStamp, inBusNumber, inNumberFrames, buf->core_audio->recBufferList);
return status;
}
+ /* TODO: To support non-interleaved audio, go over all mBuffers,
+ * not just the first one. */
+
remaining = buf->core_audio->recBufferList->mBuffers[0].mDataByteSize;
while (remaining) {
if (core_audio->is_src) {
/* create AudioBufferList needed for recording */
+ core_audio->recBufferSize = frame_size * format.mBytesPerFrame;
core_audio->recBufferList =
- buffer_list_alloc (format.mChannelsPerFrame,
- frame_size * format.mBytesPerFrame);
+ buffer_list_alloc (format.mChannelsPerFrame, core_audio->recBufferSize,
+ /* Currently always TRUE (i.e. interleaved) */
+ !(format.mFormatFlags & kAudioFormatFlagIsNonInterleaved));
}
/* Initialize the AudioUnit */
return TRUE;
error:
- if (core_audio->is_src && core_audio->recBufferList) {
- buffer_list_free (core_audio->recBufferList);
- core_audio->recBufferList = NULL;
- }
+ buffer_list_free (core_audio->recBufferList);
+ core_audio->recBufferList = NULL;
return FALSE;
}
{
AudioUnitUninitialize (core_audio->audiounit);
- if (core_audio->recBufferList) {
- buffer_list_free (core_audio->recBufferList);
- core_audio->recBufferList = NULL;
- }
+ buffer_list_free (core_audio->recBufferList);
+ core_audio->recBufferList = NULL;
}
void
/* For LPCM in/out */
AudioUnit audiounit;
+ UInt32 recBufferSize; /* AudioUnitRender clobbers mDataByteSize */
AudioBufferList *recBufferList;
#ifndef HAVE_IOS
}
AudioBufferList *
-buffer_list_alloc (int channels, int size)
+buffer_list_alloc (UInt32 channels, UInt32 size, gboolean interleaved)
{
AudioBufferList *list;
- int total_size;
- int n;
-
- total_size = sizeof (AudioBufferList) + 1 * sizeof (AudioBuffer);
- list = (AudioBufferList *) g_malloc (total_size);
-
- list->mNumberBuffers = 1;
- for (n = 0; n < (int) list->mNumberBuffers; ++n) {
- list->mBuffers[n].mNumberChannels = channels;
+ gsize list_size;
+ UInt32 num_buffers, n;
+
+ num_buffers = interleaved ? 1 : channels;
+ list_size = G_STRUCT_OFFSET (AudioBufferList, mBuffers[num_buffers]);
+ list = (AudioBufferList *) g_malloc (list_size);
+
+ list->mNumberBuffers = num_buffers;
+ for (n = 0; n < num_buffers; ++n) {
+ /* See http://lists.apple.com/archives/coreaudio-api/2015/Feb/msg00027.html */
+ list->mBuffers[n].mNumberChannels = interleaved ? channels : 1;
+ /* AudioUnitRender will keep overwriting mDataByteSize */
list->mBuffers[n].mDataByteSize = size;
list->mBuffers[n].mData = g_malloc (size);
}
void
buffer_list_free (AudioBufferList * list)
{
- int n;
+ UInt32 n;
+
+ if (list == NULL)
+ return;
- for (n = 0; n < (int) list->mNumberBuffers; ++n) {
- if (list->mBuffers[n].mData)
- g_free (list->mBuffers[n].mData);
+ for (n = 0; n < list->mNumberBuffers; ++n) {
+ g_free (list->mBuffers[n].mData);
}
g_free (list);
gboolean gst_core_audio_io_proc_stop (GstCoreAudio * core_audio);
-AudioBufferList * buffer_list_alloc (int channels, int size);
+AudioBufferList * buffer_list_alloc (UInt32 channels, UInt32 size, gboolean interleaved);
void buffer_list_free (AudioBufferList * list);