【发布时间】:2019-01-28 18:05:57
【问题描述】:
在物理 MIDI 设备上使用 UWP MIDI API 时,应用程序在退出时挂起,并且无法从命令行或任务管理器强制终止。
所有使用 MIDI 的 UWP 应用都会发生这种情况,包括 official example from MSDN,无需修改。
我已经为此提出了issue on GitHub,但这似乎不是一个新问题。据说 MIDI 自 2014 年以来就被破坏了。
有没有办法通过其他方式在 UWP 中规避这个问题?我正在用 C# 编写,但我精通 C++,并且可以使用较低级别的 API(如果存在的话)。我只需要从选定的 MIDI 设备(键盘)获取 MIDI 输入。
我还尝试按照相关帖子 (Getting signals from a MIDI port in C#) 中的建议使用 winmm.dll,但这对我不起作用。 midiInGetNumDevs() 方法在 UWP 应用中使用时返回 0。
我正在使用M-Audio Fast Track USB 声卡(通过USB 连接)和M-Audio 88es Keystation MIDI Keyboard(通过USB 连接)。我在桌面应用程序中没有遇到问题。
我发现了一个部分解决方法,我将解除分配代码移动到App Suspending 事件处理程序,而不是将其放在析构函数中。但是,当设备在应用程序的生命周期内拔出时,问题仍然存在。如果在应用程序运行时插入了 MIDI 设备,应用程序将毫无问题地关闭(使用解决方法)。如果 MIDI 设备在应用程序运行之前插入并在应用程序运行时保持插入状态,则应用程序将正常关闭(使用解决方法)。只有在应用程序运行时设备被拔出时,应用程序才会在关闭时挂起,无论释放代码是在析构函数中还是在 App Suspending 处理程序中完成。
【问题讨论】:
-
这很奇怪。我使用了 UWP MIDI API,没有任何问题。尝试使用 Windows 提供的默认 midi 设备在另一台机器上运行您的应用程序
-
在关闭应用程序之前一切似乎都正常。我收到事件并可以处理它们,但是当我关闭应用程序(通过单击关闭或尝试结束进程)时,应用程序挂起。
-
winmm 不适合你真的很奇怪。您可以尝试DryWetMIDI 从输入设备捕获 MIDI 数据吗(请参阅Input device 文章了解详细信息)?
-
你能分享更多细节吗?客户使用什么版本的操作系统?使用什么类型的 MIDI 设备/什么是端点设备?他们使用的是什么 MIDI 接口?
-
@NicoZhu-MSFT 我添加了更多细节和部分解决方法。