rtmidi library requires setting callback to static function, which should handle incoming midi messages. I found workaround (CinderMidiIn::callback function) but application crashes when I try to send signal after parsing. Here is shortened version of code:
void static callback(double deltatime, std::vector< unsigned char > *message, void *userData){
((CinderMidiIn*)userData)->newMidiMessage(deltatime * 1000, message);
}
void newMidiMessage(double deltatime, std::vector< unsigned char > *message){
midiMessage newMsg(message);
//parse message
//midiSignal(newMsg); /// THIS DOES NEITHER WORKS
dispatch(newMsg);
}
void dispatch(midiMessage &msg){
midiSignal(msg);
}
// Signal
boost::signals2::signal<void(midiMessage)> midiSignal;
//// MAIN FUNCTION ////
void ciMidiIn::midiEvent(midiMessage msg){
cout << "value " << msg.value << endl;
}
void ciMidiIn::setup()
{
midi.midiSignal.connect(boost::bind(&ciMidiIn::midiEvent, this, boost::arg<1>::arg()));
}
I get a ton of warning during compilation and crashes on start (at sending signal at line 149-150) call-stack gives me no clue even where to start looking for solution:
VanillaRTMidi.exe!boost::signals2::signal1<void,midiMessage,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(midiMessage)>,boost::function<void __cdecl(boost::signals2::connection const &,midiMessage)>,boost::signals2::mutex>::operator()(midiMessage arg1) Line 695 C++
VanillaRTMidi.exe!boost::shared_ptr<boost::signals2::detail::signal1_impl<void,midiMessage,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(midiMessage)>,boost::function<void __cdecl(boost::signals2::connection const &,midiMessage)>,boost::signals2::mutex> >::operator*() Line 646 C++
I've read a lot about static functions and I understand that non static variables cannot access static function, but still, I have no idea how to pass anything into signal and dispatch it from static function.
Disclaimer: Originally posted on Cinder Forums, with link to pastebin containing full code, but as I mentioned at top of original post, this is more likely question for Stack Overflow.