在UWP中使用MIDI

时间:2019-01-28 18:05:58

标签: c# uwp midi hang uwp-midi

在物理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,但这对我不起作用。从UWP应用中使用时,midiInGetNumDevs()方法返回0。

我正在使用M-Audio Fast Track USB声卡(通过USB连接)和M-Audio 88es Keystation MIDI Keyboard(通过USB连接)。我在桌面应用程序中没有遇到任何问题。

我发现了一种局部解决方法,该方法将解除分配代码移至App Suspending事件处理程序,而不是将其置于析构函数中。但是,在应用程序的生命周期中拔出设备时仍然会出现问题。如果在应用程序运行时插入了MIDI设备,则该应用程序将关闭而不会出现问题(具有解决方法)。如果在运行应用程序之前已插入MIDI设备,而在运行应用程序时仍保持插入状态,则该应用程序将关闭而不会出现问题(具有解决方法)。只有在应用程序运行时将设备拔出电源,应用程序才会关闭,无论释放代码是在析构函数中还是在App Suspending处理程序中完成。

1 个答案:

答案 0 :(得分:0)

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

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

尽管它目前可以在台​​式机上运行,​​但必须使其“通用”才能在UWP中正常运行。声卡驱动程序是否通用?

在正在开发的驱动程序文档中,我们看到有关使用InfVerif工具验证驱动程序包的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