Как объявить обработчик ввода Midi с помощью C++/winrt?

Документация для устройств UWP Midi в основном охватывает C#. В моем проекте C++/winrt я обнаружил, что лямбда-выражения отлично подходят для обработки событий, но таким образом я не могу получить входные данные Midi.

По аналогии с другими обработчиками, которые хорошо работают, я пробовал следующее, но обработчик никогда не вызывается, даже если порт ввода указан и выбран.

m_midi_in_port.MessageReceived([&](winrt::Windows::Devices::Midi::IMidiInPort, MidiMessageReceivedEventArgs const& args)
        {
            winrt::Windows::Devices::Midi::IMidiMessage message = args.Message();
            ReceivedInput(message);
        });

[Обновление] Другой способ — зарегистрироваться на событие, используя ссылку на обработчик. Он скомпилируется и запустится, если я объявлю статический обработчик (ранее я не мог этого сделать, потому что не понимал, что обработчик должен быть статическим):

static void InputEventHandler(winrt::Windows::Devices::Midi::IMidiInPort inputPort, winrt::Windows::Devices::Midi::MidiMessageReceivedEventArgs args);

а затем зарегистрируйтесь таким образом после получения входного порта от DevInfo:

m_event_token = m_midi_in_port.MessageReceived(&InputEventHandler);

Но снова обработчик никогда не вызывается, хотя устройство ввода обнаружено и указано в списке, а inputPort кажется действительным. Есть ли что-то еще, что нужно сделать, чтобы это стало активным?


person user3743210    schedule 26.10.2019    source источник


Ответы (1)


Хорошо, чтобы не тратить ничье время, и, возможно, это поможет другим читателям: оба эти метода работают. Проблема заключалась в том, что inputPort на самом деле не был создан должным образом, как я думал. В качестве примечания: промежуточное сообщение, по-видимому, идентифицирует себя как примечание, если устройство ввода использует нулевую скорость в качестве сокращения для примечания без изменения рабочего состояния, но это совсем другое дело.

person user3743210    schedule 27.10.2019