这是查看 FreeStreamer 标头的可能答案
#define minForSpectrum 1024
@implementation MyClass {
TPCircularBuffer SpectrumAnalyzerBuffer;
}
- (void)dealloc {
TPCircularBufferCleanup(&SpectrumAnalyzerBuffer);
}
-(instancetype) init {
self = [super init];
if (self) {
TPCircularBufferInit(&SpectrumAnalyzerBuffer, 16384);
self.audioController.activeStream.delegate = self;
}
return self;
}
- (void)audioStream:(FSAudioStream *)audioStream samplesAvailable:(const int16_t *)samples count:(NSUInteger)count {
// incoming data is integer
SInt16 *buffer = samples;
Float32 *floatBuffer = malloc(sizeof(Float32)*count);
// convert to float
vDSP_vflt16(buffer, 1, floatBuffer, 1, count);
// scale
static float scale = 1.f / (INT16_MAX/2);
static float zero = 0.f;
vDSP_vsmsa(floatBuffer, 1, &scale, &zero, floatBuffer, 1, count);
TPCircularBufferProduceBytes(&SpectrumAnalyzerBuffer, floatBuffer, count*sizeof(Float32));
free(floatBuffer);
}
- (void) timerCallback: (NSTimer*) timer {
Float32 *spectrumBufferData = TPCircularBufferTail(&SpectrumAnalyzerBuffer, &availableSpectrum);
if (availableSpectrum >= minForSpectrum) {
// note visualiser may want chunks of a fixed size if its doing fft
[histogram updateBuffer: spectrumBufferData length: minForSpectrum];
TPCircularBufferConsume(&SpectrumAnalyzerBuffer, minForSpectrum);
}
}