midiOutOpen в Windows 10 с использованием Microsoft GS Wavetable Synth не работает

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

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

Любые идеи относительно того, как решить эту проблему, очень ценятся.

12

Решение

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

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

   CoInitializeEx(NULL, COINIT_MULTITHREADED);

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

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

10

Другие решения

Я поместил MessageBox (и ничего важного сказать) как раз перед midiOutOpen, и ЭТО РАБОТАЛО!
Я использую Visual Studio 2013 C ++.

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

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

1
По вопросам рекламы [email protected]