boost :: signal с аргументами из статической функции-члена?

Библиотека rtmidi требует установки обратного вызова статической функции, которая должна обрабатывать входящие миди-сообщения. Я нашел обходной путь (функция 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) стек вызовов не дает мне даже подсказки, где начать искать решение:

 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++

Я много читал о статических функциях и понимаю, что нестатические переменные не могут получить доступ к статической функции, но, тем не менее, я понятия не имею, как передать что-либо в сигнал и передать его из статической функции.

Отказ от ответственности: Первоначально опубликовано на форумах Cinder, со ссылкой на pastebin, содержащий полный код, но, как я уже упоминал в начале исходного поста, это более вероятный вопрос для переполнения стека.

0

Решение

Итак, наконец, проблема заключалась в неинициализированных пользовательских данных (спасибо Игорю Р. за то, что указал на это!)
Из документации rtmidi:

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

Так как я просто упаковывал rtmidi в соответствии с руководством для ввода midi, класса не было (все были просто глобальными функциями, кроме main ()), поэтому я не думал о том, чтобы на самом деле установить этот указатель.

Вау, я так много узнал по пути …

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector