2014-02-21 4 views
0

rtmidi 라이브러리는 들어오는 MIDI 메시지를 처리해야하는 정적 함수에 콜백을 설정해야합니다. 해결 방법 (CinderMidiIn :: 콜백 함수)을 찾았지만 구문 분석 후 신호를 보내려고하면 응용 프로그램이 충돌합니다. 코드의 다음 단축 버전 :정적 멤버 함수의 인수가있는 boost :: signal?

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, 링크는 전체 코드를 포함하는 페이스트 빈,하지만 내가 원래 게시물의 상단에 언급 한 바와 같이,이 스택 오버플로에 대한 가능성이 질문입니다.

+1

확인을 배웠습니다. 콜백이 호출 될 때 인스턴스가 "활성"(파괴되지 않음)인지 확인하십시오. –

+0

이런, 절대적으로 옳습니다! 내가 그들을 완전히 추가하는 것을 잊었을 때, 그것은 더 나빴다 ... – sphere42

답변

0

그래서 결국 문제는 (그 지적에 대한 감사 이고르 R.!) 초기화되지 않은 사용자 데이터를했다 난 그냥 미디 입력을위한 튜토리얼에 따라 rtmidi 포장되면서 From rtmidi documentation:

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

, 더 클래스 (모든 없었다 main() 외부의 전역 함수 였기 때문에 포인터를 실제로 설정하는 것에 대해서는 생각하지 않았습니다.

와우

, 나는 ... 길을 따라 너무 많은`userData`이 CinderMidiIn` 인스턴스`에 대한 유효한 포인터가 있음을