diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index d8b827a18..5cd9833dc 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -63,7 +63,7 @@ static OSStatus renderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioAct amountToRead = inNumberFrames * bytesPerPacket; int visTabulated = 0; - float visAudio[512]; // Chunk size + float visAudio[inNumberFrames]; // Chunk size if(_self->stopping == YES || [_self->outputController shouldContinue] == NO) { // Chain is dead, fill out the serial number pointer forever with silence @@ -188,12 +188,10 @@ static OSStatus renderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioAct // buffer loop if it doesn't get anything, so always produce a full // buffer, and silence anything we couldn't supply. clearBuffers(ioData, (amountToRead - amountRead) / bytesPerPacket, amountRead / bytesPerPacket); - - vDSP_vclr(visAudio + visTabulated, 1, 512 - visTabulated); } [_self->visController postSampleRate:_self->deviceFormat.mSampleRate]; - [_self->visController postVisPCM:visAudio]; + [_self->visController postVisPCM:visAudio amount:visTabulated]; return 0; } diff --git a/Audio/Visualization/VisualizationController.h b/Audio/Visualization/VisualizationController.h index d0e112585..247433673 100644 --- a/Audio/Visualization/VisualizationController.h +++ b/Audio/Visualization/VisualizationController.h @@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN + (VisualizationController *)sharedController; - (void)postSampleRate:(double)sampleRate; -- (void)postVisPCM:(const float *)inPCM; +- (void)postVisPCM:(const float *)inPCM amount:(int)amount; - (double)readSampleRate; - (void)copyVisPCM:(float *)outPCM visFFT:(float *)outFFT; diff --git a/Audio/Visualization/VisualizationController.m b/Audio/Visualization/VisualizationController.m index 360b0a16b..8c6e62d72 100644 --- a/Audio/Visualization/VisualizationController.m +++ b/Audio/Visualization/VisualizationController.m @@ -41,10 +41,15 @@ static VisualizationController *_sharedController = nil; } } -- (void)postVisPCM:(const float *)inPCM { +- (void)postVisPCM:(const float *)inPCM amount:(int)amount { + int skipAmount = 0; + if(amount > 4096) { + skipAmount = amount - 4096; + amount = 4096; + } @synchronized(self) { - cblas_scopy(4096 - 512, visAudio + 512, 1, visAudio, 1); - cblas_scopy(512, inPCM, 1, visAudio + 4096 - 512, 1); + cblas_scopy(4096 - amount, visAudio + amount, 1, visAudio, 1); + cblas_scopy(amount, inPCM + skipAmount, 1, visAudio + 4096 - amount, 1); } }