coreaudio: capture devices should let the system allocate the render buffer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
diff --git a/src/audio/coreaudio/SDL_coreaudio.c b/src/audio/coreaudio/SDL_coreaudio.c
index 05754ea..d9daded 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 4b05798..606dfc2 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