1

我正在为 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,是否应该引发异常)?

4

0 回答 0