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 вызывает проблемы.