我对AudioKit框架非常陌生,我一直在尝试更多地了解它的DSP端。在翻看源代码时,我意识到AKNodeOutputPlot并不像其他人那样从节点拉取数据。
在AKAmplitudeTracker的DSP代码中,为每个通道计算RMS值,并将结果简短地写入输出缓冲区,但在for循环结束时,通过将输出设置为原始输入,实质上绕过了节点:
void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override {
for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) {
int frameOffset = int(frameIndex + bufferOffset);
for (int channel = 0; channel < channels; ++channel) {
float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset;
float temp = *in;
float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset;
if (channel == 0) {
if (started) {
sp_rms_compute(sp, leftRMS, in, out);
leftAmplitude = *out;
} else {
leftAmplitude = 0;
}
} else {
if (started) {
sp_rms_compute(sp, rightRMS, in, out);
rightAmplitude = *out;
} else {
rightAmplitude = 0;
}
}
*out = temp;
}
}
}这是有意义的,因为将RMS值输出到设备扬声器听起来很糟糕,但是当此节点用作AKNodeOutputPlot对象的输入时,将绘制RMS值。

我假设在某个地方引用了leftAmplitude和rightAmplitude变量,但即使将它们置零,绘图也能正常工作。我感兴趣的是在不影响输出的情况下对信号做一些工作,所以我希望有人能帮我弄清楚AKPlot是如何获取这些数据的。
干杯
发布于 2017-11-18 02:09:36
AKNodeOutputPlot使用的是一种叫做“点击”的东西:
还有一些不一定仅用于用户界面的其他点击:
https://github.com/AudioKit/AudioKit/tree/master/AudioKit/Common/Taps
Tap允许您检查通过另一个节点拉取的数据,而无需插入信号链本身。
https://stackoverflow.com/questions/47345831
复制相似问题