Fix visualization for variable audio block sizes

IN A.D. 2101, WAR WAS BEGINNING. *boom*

Yeah, this was a dumb bug, I didn't realize that AUAudioUnit would just
arbitrarily ignore my configured block size and request a different one.

The AirPods Pro will just request 480 instead of the 512 I ask for, so
let's instead support variable block sizes, and only take up to the last
4096 samples of the chunk fed to the output device.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
CQTexperiment
Christopher Snowhill 2022-02-16 21:54:55 -08:00
parent 5611d08df1
commit 4f5e4eca36
3 changed files with 11 additions and 8 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);
}
}