rtmidi库需要设置回调到静态函数,该函数应处理传入的midi消息。我找到了解决方法(CinderMidiIn :: callback函数)但是当我尝试在解析后发送信号时应用程序崩溃了。这是缩短版的代码:
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()));
}
我在编译期间收到大量警告并且在启动时崩溃(在149-150行发送信号)call-stack甚至不知道哪里开始寻找解决方案:
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++
我已经阅读了很多关于静态函数的内容,并且我理解非静态变量不能访问静态函数,但是,我仍然不知道如何将任何内容传递给信号并从静态函数中调度它。
免责声明: Originally posted on Cinder Forums,包含指向包含完整代码的pastebin的链接,但正如我在原帖后面提到的,这更可能是Stack Overflow的问题。
答案 0 :(得分:0)
所以最后问题是未初始化的用户数据(感谢Igor R.指出这一点!) From rtmidi documentation:
void RtMidiIn::setCallback (RtMidiCallback callback, void * userData = 0);
因为我只是根据midi输入的教程包装rtmidi,所以没有类(一切都只是main()之外的全局函数),所以我没有考虑实际设置指针。
哇,我一路上学到了很多......