diff options
Diffstat (limited to 'src/MKVoiceProcessingDevice.m')
-rw-r--r-- | src/MKVoiceProcessingDevice.m | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/MKVoiceProcessingDevice.m b/src/MKVoiceProcessingDevice.m index 069fcaf..9105dab 100644 --- a/src/MKVoiceProcessingDevice.m +++ b/src/MKVoiceProcessingDevice.m @@ -53,7 +53,7 @@ static OSStatus inputCallback(void *udata, AudioUnitRenderActionFlags *flags, co b->mData = calloc(1, b->mDataByteSize); } - if (dev->_buflist.mBuffers->mDataByteSize < (nframes/dev->_micSampleSize)) { + if (dev->_buflist.mBuffers->mDataByteSize < (dev->_micSampleSize * nframes)) { NSLog(@"MKVoiceProcessingDevice: Buffer too small. Allocating more space."); AudioBuffer *b = dev->_buflist.mBuffers; free(b->mData); @@ -61,11 +61,18 @@ static OSStatus inputCallback(void *udata, AudioUnitRenderActionFlags *flags, co b->mData = calloc(1, b->mDataByteSize); } + /* + AudioUnitRender modifies the mDataByteSize members with the + actual read bytes count. We need to write it back otherwise + we'll reallocate the buffer even if not needed. + */ + UInt32 dataByteSize = dev->_buflist.mBuffers->mDataByteSize; err = AudioUnitRender(dev->_audioUnit, flags, ts, busnum, nframes, &dev->_buflist); if (err != noErr) { NSLog(@"MKVoiceProcessingDevice: AudioUnitRender failed. err = %li", (long int)err); return err; } + dev->_buflist.mBuffers->mDataByteSize = dataByteSize; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; short *buf = (short *) dev->_buflist.mBuffers->mData; |