使用 Microsoft GS Wavetable Synth 在 Windows 10 上打开 midiOutOpen 失败
Posted
技术标签:
【中文标题】使用 Microsoft GS Wavetable Synth 在 Windows 10 上打开 midiOutOpen 失败【英文标题】:midiOutOpen on Windows 10 using Microsoft GS Wavetable Synth fails 【发布时间】:2015-10-23 12:33:36 【问题描述】:我有一个依赖于内置 Microsoft GS Wavetable Synth 的应用程序。它在 Windows XP、Vista、7、8 和 8.1 上完美运行。虽然在 Windows 10 上第一次调用 midiOutOpen 有效,但后续调用会导致错误代码 1,意思是“未指定错误”。代码很简单:
result = midiOutOpen(&_midiOutHandle, midiOutputDevice, NULL, 0, CALLBACK_NULL);
任何关于如何解决这个问题的想法都非常感谢。
【问题讨论】:
【参考方案1】:我看到了。跟踪机器代码,我看到 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。
【讨论】:
感谢您对此进行调查 - 您的解决方法对我有用! 很多程序确实失败了。但是许多低预算的程序员在 Win10 发布之前并没有额外的机器用于 Win10 测试......他们希望 M$ 保持兼容............ VanBasco 卡拉 OK 播放器是翻倒的...除非您单击? (帮助)图标,显然使用/初始化 COM。【参考方案2】:我在 midiOutOpen 之前放了一个 MessageBox(没什么重要的),它成功了! 我正在使用 Visual Studio 2013 C++。
WASAPI 在共享模式下不再为我工作,但我想我可以让它工作。
【讨论】:
感谢您的回复,非常感谢您的意见。但是,我不能强迫我的用户每次按下开始按钮时都关闭一个空消息框。你知道为什么会这样吗?【参考方案3】:当我使用CoInitializeEx(NULL, COINIT_MULTITHREADED)
时,这有助于解决midi打开问题,但对使用mciSendString
打开MP3歌曲有不良影响,导致同一程序中总是出现错误266。例如:
open "d:\\music\\Fernando.mp3" type MPEGVideo alias Fernando.mp3 wait
(没有CoInitializeEx
这个打开的作品和在Windows 10中播放的mp3歌曲)。
在某些 Windows 10 系统上,midi 和 mp3 可以很好地打开而无需调用 CoInitializeEx
,而在其他系统上则不能播放 midi。 MCI api 中没有记录必须调用它并导致不确定的问题。对我来说,不清楚何时或为什么必须调用它以及何时最好不要调用它。
微软的 MCI 相关的 Windows 10 不兼容是无法容忍的。
自 XP 以来的所有系统都与 MCI 兼容,只有 Windows 10 会导致问题。
【讨论】:
以上是关于使用 Microsoft GS Wavetable Synth 在 Windows 10 上打开 midiOutOpen 失败的主要内容,如果未能解决你的问题,请参考以下文章