我正在尝试在 Jack 中设置回调函数。这通常非常简单,使用函数“jack_set_process_callback”(在设置“process”回调的情况下)。
API中的定义是这样的:
int jack_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg).
在示例代码(具有 C 组件)中声明了下面的全局函数。
int process(jack_nframes_t nframes, void *arg){
// do something in the callback
return 0;
}
然后通过以下行将其设置为 Jack 进程回调:
jack_set_process_callback(client, process, 0)
..这可以完美编译并运行。
我现在正在做的是尝试构建一个基于类的音频程序。我将所有 Jack 的东西放入一个名为“Sound_Module”的类中。
我想要设置为回调的函数的定义现在是此类的成员函数:
int Sound_Module::process(jack_nframes_t nframes, void *arg){
// do something in the callback
return 0;
}
我试图将此方法设置为类构造函数中的回调函数:
(83) jack_set_process_callback(client, process, 0)
但是在编译时会导致以下错误:
sound_module.cpp:83: error: argument of type ‘int (Sound_Module::)(jack_nframes_t, void*)’ does not match ‘int (*)(jack_nframes_t, void*)’
我从这个错误消息中得到的印象是我需要将回调函数转换为其他函数。我尝试了一些方法,例如转换为专为回调设计的 Jack 类型,但没有成功 - 下面是从“JackProcessCallback”的 API 中挖出的行。
typedef int(* JackProcessCallback)(jack_nframes_t nframes, void *arg)
任何人都可以阐明这个编译器错误可能暗示的内容,或者我可能做错了什么吗?
谢谢!
最佳答案
成员函数与非成员函数不同,因为您只能在该函数所属的类类型的对象上调用它们。
您需要编写一个委托(delegate)给成员函数的非成员函数。当您调用jack_set_process_callback
时,您告诉库将什么传递给回调的void*
参数,这样您就可以告诉它传回的地址要为其调用成员函数回调的 Sound_Module
对象。
非成员回调非常简单:
int Sound_Module_Process_Callback(jack_nframes_t x, void* p)
{
return static_cast<Sound_Module*>(p)->process(x);
}
注册为:
jack_set_process_callback(client, Sound_Module_Process_Callback, this);
关于c++ - 为什么我不能在 Jack 中将非全局函数设置为回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6969419/