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, 링크는 전체 코드를 포함하는 페이스트 빈,하지만 내가 원래 게시물의 상단에 언급 한 바와 같이,이 스택 오버플로에 대한 가능성이 질문입니다.
확인을 배웠습니다. 콜백이 호출 될 때 인스턴스가 "활성"(파괴되지 않음)인지 확인하십시오. –
이런, 절대적으로 옳습니다! 내가 그들을 완전히 추가하는 것을 잊었을 때, 그것은 더 나빴다 ... – sphere42