Windows 10 上使用 Microsoft GS 波表合成器的 midiOutOpen 失败

midiOutOpen on Windows 10 using Microsoft GS Wavetable Synth fails

我有一个应用程序依赖于内置的 Microsoft GS 波表合成器。它在 Windows XP、Vista、7、8 和 8.1 上完美运行。虽然在 Windows 10 上第一次调用 midiOutOpen 有效,但后续调用会导致错误代码 1,即 'Unspecified error'。代码很简单:

result = midiOutOpen(&_midiOutHandle, midiOutputDevice, NULL, 0, CALLBACK_NULL);

非常感谢有关如何解决此问题的任何想法。

我在 midiOutOpen 之前放了一个 MessageBox(没什么可说的),它成功了! 我正在使用 Visual Studio 2013 C++。

WASAPI 在共享模式下不再为我工作,尽管我认为我可以让它工作。

我看到了。跟踪机器代码,我看到 modMessage() 函数失败并且 return MMSYSERR_ERROR。到底为什么我不清楚,它看起来像是缺少初始化问题。

这个事故的奇怪之处在于没有很多关于它的投诉,你会期望很多其他程序也会崩溃。或者就此而言,在 Win10 发布之前对它们进行测试。我尝试的下一件事是添加我在测试程序中跳过的任何重要音频应用程序中发生的一件事。部分灵感来自于在 modMessage 的符号中看到 "ATL",尽管它离得很远。我将其添加为 main() 中的第一行:

   CoInitializeEx(NULL, COINIT_MULTITHREADED);

Badaboom,没有更多的错误。如果在 UI 线程的主线程上调用它,请使用 COINIT_APARTMENTTHREADED。 CoUninitialize() 最后进行清理。

解释起来有难度,使用MIDI时应该不需要初始化COM。有了它,调用 midiOutOpen 会加载一个 DLL,clbcatq.dll。那是一个 COM+ 支持模块。所以看起来 Win10 确实需要初始化 COM。

当我使用CoInitializeEx(NULL, COINIT_MULTITHREADED)时,这有助于解决midi打开问题,但对使用mciSendString打开MP3歌曲有不好的影响,导致在同一个程序中总是出现错误266。例如:

open "d:\music\Fernando.mp3" type MPEGVideo alias Fernando.mp3 wait

(没有 CoInitializeEx 这个打开的作品和 mp3 歌曲在 Windows 10 中播放)。

在某些 Windows 10 系统上,midi 和 mp3 可以很好地打开而无需调用 CoInitializeEx,在其他系统上它无法播放 midi。 MCI api 中没有记录必须调用它并导致未确定的问题。对我来说,不清楚什么时候或为什么必须调用它,什么时候我最好不要调用它。 Windows 10 微软的MCI相关的不兼容是不能容忍的。 XP 之后的所有系统都与 MCI 兼容,只有 Windows 10 个会导致问题。