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

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

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

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

Ответ 1

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

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

   CoInitializeEx(NULL, COINIT_MULTITHREADED);

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

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

Ответ 2

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

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

Ответ 3

Когда я использую CoInitializeEx(NULL, COINIT_MULTITHREADED), это помогает для проблемы с midi open, но имеет плохое влияние на использование 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 Microsoft, невыносима. Все системы с XP совместимы с MCI, и только Windows 10 вызывает проблемы.