0
rtmidi庫需要設置回調靜態函數,它應該處理傳入的midi消息。我發現解決方法(CinderMidiIn ::回調函數),但當我嘗試解析後發送信號時,應用程序崩潰。代碼在這裏被縮短版本:boost ::帶有靜態成員函數參數的信號?
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發送信號)調用堆棧給了我不知道即使在開始尋找解決方案:
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的問題。
檢查'userData'是否是一個有效的指針'CinderMidiIn'實例。確保在調用回調時實例處於「活動」狀態(未銷燬)。 –
嘖嘖,你是絕對正確的!更糟的是,因爲我忘了完全添加它們,呃... – sphere42