2014-02-21 51 views
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的問題。

+1

檢查'userData'是否是一個有效的指針'CinderMidiIn'實例。確保在調用回調時實例處於「活動」狀態(未銷燬)。 –

+0

嘖嘖,你是絕對正確的!更糟的是,因爲我忘了完全添加它們,呃... – sphere42

回答

0

所以最後的問題是未初始化的用戶數據(感謝伊戈爾R.指出了這一點!) From rtmidi documentation:

void RtMidiIn::setCallback (RtMidiCallback callback, void * userData = 0); 

正如我剛纔包裝rtmidi根據教程MIDI輸入,沒有類(一切只是main()之外的全局函數,所以我沒有考慮實際設置這個指針。

哇,我在這裏學到了很多...

相關問題