【问题标题】:Using MIDI in UWP在 UWP 中使用 MIDI
【发布时间】: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 我添加了更多细节和部分解决方法。

标签: c# uwp midi freeze


【解决方案1】:

我无法重现此问题。我相信这可能与声卡的驱动程序有关。

使用您提到的示例,https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MIDI • 当我关闭它时应用程序没有挂起。 • 我能够在应用程序生命周期内移除电缆,没有问题。重新连接后,我仍然能够发送和接收消息。 • 我能够在设备生命周期中期插入设备,没有问题。我仍然能够发送和接收消息。

虽然它目前在桌面上运行,但它必须是“通用的”才能在 UWP 中正常运行。声卡驱动是通用的吗?

在我们的开发驱动程序文档中,我们看到使用 InfV​​erif 工具验证您的驱动程序包的 INF 文件是否通用的注释。 https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/infverif。 在应用程序开发人员文档中,我看到了测试设备元数据的注释。 https://docs.microsoft.com/en-us/windows-hardware/drivers/devapps/step-4--test-device-metadata

与您的问题相关的其他文档: 构建 UWP 设备应用
https://docs.microsoft.com/en-us/windows-hardware/drivers/devapps/the-workflow

测试 UWP 设备应用的设备元数据
https://docs.microsoft.com/en-us/windows-hardware/drivers/devapps/step-4--test-device-metadata

通用 Windows 驱动程序入门
https://docs.microsoft.com/en-us/windows-hardware/drivers/develop/getting-started-with-universal-drivers

MIDI 样本 https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MIDI

在应用挂起中释放资源
https://docs.microsoft.com/en-us/windows/uwp/launch-resume/suspend-an-app#release-resources

使用 Dispose 抑制终结 注意:取决于终结器将使内存中的资源比必要的时间更长。在执行完整的 GC 或进程退出时,它们不会被释放。
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多