Как узнать, что подключение отключенного устройства 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, должно ли оно вызывать исключение)?