Как объявить обработчик ввода Midi, используя C ++ / winrt? - PullRequest
0 голосов
/ 26 октября 2019

Документация для устройств UWP Midi в основном охватывает C #. В моем проекте C ++ / winrt я обнаружил, что Lambdas отлично работают для обработки событий, но я не могу получить ввод 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 выглядит действительным. Есть ли что-то еще, что нужно сделать, чтобы это стало активным?

1 Ответ

0 голосов
/ 28 октября 2019

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

...