Как узнать, что подключение отключенного устройства midiDevice не удалось в C++/WinRT

Я создаю плагин для REAPER DAW для поддержки ввода BLE MIDI. Код выглядит следующим образом:

      fire_and_forget MidiDeviceService::connectDevice(hstring deviceId, bool updateConfig = true)
{
    if (!deviceId.empty())
    {
        currentDevice = co_await MidiInPort::FromIdAsync(deviceId);
        if (!currentDevice) {}
        {
            ShowMessageBox("Couldn't connect to device.", "Connection Error", 0);
            co_return;
        }
        messageReceivedEventToken = currentDevice.MessageReceived({this, &MidiDeviceService::midiInPort_messageReceived});
    }
    if (updateConfig)
    {
        configuredDeviceId = deviceId;
        setCurrentDeviceInConfig(configuredDeviceId);
    }
}

Это прекрасно работает при попытке подключения к MIDI-устройству, которое подключено к системе. Однако при попытке подключения к BLE MIDI-устройству, находящемуся вне диапазона, как только я co_await co_await MidiInPort::FromIdAsync, вызывающий поток зависает на пять секунд, а затем остальная часть fire_and_forget просто не выполняется.

Я пробовал несколько вещей, в том числе изменение fire_and_forget на IAsyncAction и получение результата в синхронном коде, который выполняет это, но все с тем же результатом. Если я пройдусь по сопрограмме с помощью отладчика Visual Studio, после того как co_await заморозит вызывающую программу на пять секунд, курсор мгновенно переместится в нижнюю часть сопрограммы.

Возможно, я делаю что-то ужасно неправильное, но в Документах нет информации о том, каким должно быть поведение при сбое подключения к устройству (например, должно ли оно просто возвращать nullptr, должно ли оно вызывать исключение)?

0 ответов

Другие вопросы по тегам