在Windows 10上使用Microsoft GS Wavetable Synth的midiOutOpen失败

时间:2015-07-31 18:27:26

标签: c++ midi windows-10 multimedia

我有一个依赖于内置Microsoft GS Wavetable Synth的应用程序。它在Windows XP,Vista,7,8和8.1上完美运行。在Windows 10上第一次调用midiOutOpen时,后续调用会导致错误代码1,这意味着“未指定错误”。代码很简单:

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

关于如何解决这个问题的任何想法都非常受欢迎。

3 个答案:

答案 0 :(得分:10)

我明白了。跟踪机器代码,我看到modMessage()函数失败并返回MMSYSERR_ERROR。究竟为什么我不清楚,它看起来像一个缺少初始化问题。

这次事故的一个奇怪之处在于没有很多关于它的抱怨,你会发现很多其他程序也会失败。或者就此而言,在Win10发货之前对它们进行测试。接下来我尝试的是添加我在测试程序中跳过的任何非平凡音频应用程序中发生的一件事。部分灵感来自在modMessage的符号中看到“ATL”,尽管它并不是在任何地方。我将其添加为main()中的第一行:

   CoInitializeEx(NULL, COINIT_MULTITHREADED);

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

解释它很困难,使用MIDI时不需​​要初始化COM。有了它,调用midiOutOpen会再加载一个DLL,clbcatq.dll。这是一个COM +支持模块。所以看起来Win10需要初始化COM。

答案 1 :(得分:1)

我在midiOutOpen之前放了一个MessageBox(没什么重要的说法),并且IT工作了! 我正在使用Visual Studio 2013 C ++。

WASAPI在共享模式下不再适合我,虽然我认为我能够使它工作。

答案 2 :(得分:1)

当我使用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中没有记录它必须被调用并导致不确定的问题。对我来说,不清楚它何时或为何必须被调用,何时最好不要调用它。 与微软MCI相关的Windows 10不兼容是无法容忍的。 自XP以来的所有系统都兼容MCI,只有Windows 10会造成麻烦。