midiOutOpen в Windows 10 с помощью Microsoft GS Wavetable Synth терпит неудачу

У меня есть приложение, которое опирается на встроенный синтезатор Microsoft GS Wavetable. Он работал безупречно на Windows XP, Vista, 7, 8 и 8.1. Хотя первый вызов midiOutOpen в Windows 10 работает, последующие вызовы приводят к коду ошибки 1, Что означает "неопределенная ошибка". Код прост:

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

любые идеи о том, как решить эту чрезвычайно высокую оценку.

3 ответов


Я вижу это. Отслеживая машинный код, я вижу modMessage() сбой функции и возврат MMSYSERR_ERROR. Точно почему мне непонятно, это похоже на отсутствующую проблему инициализации.

что странно в этой неудаче, так это то, что на нее не так много жалоб, вы ожидаете, что многие другие программы также упадут. Или, если на то пошло, для их тестирования перед отправкой Win10. Следующее, что я попытался добавить, это то, что происходит в любом нетривиальном аудио-приложении, которое я пропустил в своей тестовой программе. Частично вдохновленный видением " ATL " в символах modMessage, хотя он и не был где-то близко. Я добавил Это как первую строку в main ():

   CoInitializeEx(NULL, COINIT_MULTITHREADED);

Badaboom, больше нет ошибок. Используйте COINIT_APARTMENTTHREADED, если вы вызываете это в основном потоке потока пользовательского интерфейса. CoUninitialize () в конце для очистки.

объяснить это трудно, инициализация COM не должна быть необходима при использовании MIDI. С он на месте, вызывая midiOutOpen получает еще одну загруженную DLL, clbcatq.файл DLL. Это модуль поддержки COM+. Так что, похоже, Win10 требует инициализации COM.


Я поставил MessageBox (ничего важного сказать) непосредственно перед midiOutOpen, и это сработало! Я использую Visual Studio 2013 c++.

WASAPI больше не работает для меня в режиме совместного использования, хотя я думаю, что смогу заставить его работать.


когда я использую 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, что он должен быть вызван и причины проблем indetermined. Для меня непонятно, когда и почему это должно быть названо, а когда лучше не называть. Несовместимость Windows 10, связанная с MCI Microsoft, недопустима. Все системы, начиная с XP, совместимы с MCI, и только Windows 10 вызывает проблемы.