From 3b53304a9439cbc7e74fea1c1b3e255ce31ca5fe Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 3 Sep 2016 00:13:41 -0400 Subject: [PATCH] coreaudio: capture devices should let the system allocate the render buffer. --- src/audio/coreaudio/SDL_coreaudio.c | 37 ++++++++++------------------- src/audio/coreaudio/SDL_coreaudio.h | 1 - 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/audio/coreaudio/SDL_coreaudio.c b/src/audio/coreaudio/SDL_coreaudio.c index 05754ea0a2aeb..d9dadedddbd57 100644 --- a/src/audio/coreaudio/SDL_coreaudio.c +++ b/src/audio/coreaudio/SDL_coreaudio.c @@ -354,16 +354,19 @@ inputCallback(void *inRefCon, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { + AudioBufferList bufferList; SDL_AudioDevice *this = (SDL_AudioDevice *) inRefCon; if (!SDL_AtomicGet(&this->enabled) || SDL_AtomicGet(&this->paused)) { return noErr; /* just drop this if we're not accepting input. */ } - const OSStatus err = AudioUnitRender(this->hidden->audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &this->hidden->captureBufferList); - SDL_assert(this->hidden->captureBufferList.mNumberBuffers == 1); + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mData = NULL; + + const OSStatus err = AudioUnitRender(this->hidden->audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList); if (err == noErr) { - const AudioBuffer *abuf = &this->hidden->captureBufferList.mBuffers[0]; + const AudioBuffer *abuf = &bufferList.mBuffers[0]; UInt32 remaining = abuf->mDataByteSize; const Uint8 *ptr = (const Uint8 *) abuf->mData; @@ -460,7 +463,6 @@ COREAUDIO_CloseDevice(_THIS) AudioComponentInstanceDispose(this->hidden->audioUnit); } - SDL_free(this->hidden->captureBufferList.mBuffers[0].mData); SDL_free(this->hidden->buffer); SDL_free(this->hidden); @@ -604,27 +606,12 @@ prepare_audiounit(_THIS, void *handle, int iscapture, CHECK_RESULT("AudioUnitSetProperty (kAudioUnitProperty_StreamFormat)"); if (iscapture) { /* only need to do this for capture devices. */ - void *ptr; - UInt32 framesize = 0; - UInt32 propsize = sizeof (UInt32); - - result = AudioUnitGetProperty(this->hidden->audioUnit, - kAudioUnitProperty_MaximumFramesPerSlice, - kAudioUnitScope_Global, output_bus, - &framesize, &propsize); - CHECK_RESULT - ("AudioUnitGetProperty (kAudioDevicePropertyBufferFrameSize)"); - - framesize *= SDL_AUDIO_BITSIZE(this->spec.format) / 8; - ptr = SDL_calloc(1, framesize); - if (ptr == NULL) { - SDL_OutOfMemory(); - return 0; - } - this->hidden->captureBufferList.mNumberBuffers = 1; - this->hidden->captureBufferList.mBuffers[0].mNumberChannels = this->spec.channels; - this->hidden->captureBufferList.mBuffers[0].mDataByteSize = framesize; - this->hidden->captureBufferList.mBuffers[0].mData = ptr; + const UInt32 yes = 1; + result = AudioUnitSetProperty(this->hidden->audioUnit, + kAudioUnitProperty_ShouldAllocateBuffer, + kAudioUnitScope_Output, + input_bus, &yes, sizeof (yes)); + CHECK_RESULT("AudioUnitSetProperty (kAudioUnitProperty_ShouldAllocateBuffer)"); } /* Set the audio callback */ diff --git a/src/audio/coreaudio/SDL_coreaudio.h b/src/audio/coreaudio/SDL_coreaudio.h index 4b05798e8456b..606dfc2619811 100644 --- a/src/audio/coreaudio/SDL_coreaudio.h +++ b/src/audio/coreaudio/SDL_coreaudio.h @@ -48,7 +48,6 @@ struct SDL_PrivateAudioData void *buffer; UInt32 bufferOffset; UInt32 bufferSize; - AudioBufferList captureBufferList; #if MACOSX_COREAUDIO AudioDeviceID deviceID; #endif