I’m trying to set a callback function in Jack. This is usually quite simple, using the function “jack_set_process_callback” (in the case of setting the “process” callback).
The definition in the API is this:
int jack_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg).
In the example code (which has C components) the global function below is declared.
int process(jack_nframes_t nframes, void *arg){
// do something in the callback
return 0;
}
It is then set as the Jack process callback by the line:
jack_set_process_callback(client, process, 0)
.. and this compiles and works perfectly.
What I’m doing now is trying to build a class-based audio program. I’m putting all the Jack stuff inside a class imaginatively called “Sound_Module”.
The definition of the function that I want to set as my callback is now a member function of this class:
int Sound_Module::process(jack_nframes_t nframes, void *arg){
// do something in the callback
return 0;
}
I’m trying to set this method as my callback function within the class constructor:
(83) jack_set_process_callback(client, process, 0)
but on compilation this leads to the following error:
sound_module.cpp:83: error: argument of type ‘int (Sound_Module::)(jack_nframes_t, void*)’ does not match ‘int (*)(jack_nframes_t, void*)’
I get the impression from this error message that I need to cast the callback function to something else. I’ve tried a few things, such as casting to the Jack type designed for callbacks with no luck – below is the line dug out of the API for “JackProcessCallback”.
typedef int(* JackProcessCallback)(jack_nframes_t nframes, void *arg)
Can anyone shed any light on what this compiler error might be hinting at, or what I could be doing wrong?
Thanks!
Member functions are different from non-member functions because you can only call them on an object of the class type of which the function is a member.
You need to write a non-member function that delegates to the member function. When you call
jack_set_process_callback, you tell the library what to pass to thevoid*parameter of your callback, so you can tell it to pass back the address of theSound_Moduleobject for which you want to call the member function callback.The non-member callback is quite simple:
Registered as: