您需要实现一个与 PaStreamCallback 具有相同签名的普通全局函数。
看起来 PaStreamCallback 需要一个参数 void* userData。这就是通常所说的上下文参数。在不了解 PortAudio 的情况下,我猜您可以使用它来表示您的类实例。当您调用 Pa_OpenDefaultStream 时,将“this”传递给 userData 指针,您在示例中在该指针中写入了 NULL。
这是您需要的函数包装器的示例实现:
int MyPaStreamCallback (const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
{
MyClass *myClass = reinterpret_cast<MyClass*>(userData);
return myClass->callbackFunction(input, output, frameCount, timeInfo, statusFlags);
}
然后将您的原始代码替换为:
Pa_OpenDefaultStream(&this->_stream, 1, 2, paFloat32, this->_sampleRate, this->_framesPerBuffer, MyPaStreamCallback , this);
我假设你会让你的 callbackFunction 获取所有其他参数。