[Core Audio Output] Refine output function a bit

Refine the output function a bit, including adding some minor safety
checks, in case the caller requests zero samples, or requests a format
with zero channels.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
swiftingly
Christopher Snowhill 2022-06-20 22:26:35 -07:00
parent ca6a2f41df
commit 2716ca41b0
1 changed files with 6 additions and 2 deletions

View File

@ -679,12 +679,16 @@ current_device_listener(AudioObjectID inObjectID, UInt32 inNumberAddresses, cons
_au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags *_Nonnull actionFlags, const AudioTimeStamp *_Nonnull timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList *_Nonnull inputData) { _au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags *_Nonnull actionFlags, const AudioTimeStamp *_Nonnull timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList *_Nonnull inputData) {
// This expects multiple buffers, so: // This expects multiple buffers, so:
if(!frameCount) return 0;
int i; int i;
const int channels = format->mChannelsPerFrame; const int channels = format->mChannelsPerFrame;
if(!channels) return 0;
const int channelsminusone = channels - 1; const int channelsminusone = channels - 1;
float buffers[frameCount * format->mChannelsPerFrame]; float buffers[frameCount * channels];
uint8_t bufferlistbuffer[sizeof(AudioBufferList) + sizeof(AudioBuffer) * channelsminusone]; uint8_t bufferlistbuffer[sizeof(AudioBufferList) + sizeof(AudioBuffer) * channelsminusone];
AudioBufferList *ioData = (AudioBufferList *)(bufferlistbuffer); AudioBufferList *ioData = (AudioBufferList *)(&bufferlistbuffer[0]);
ioData->mNumberBuffers = channels; ioData->mNumberBuffers = channels;