Проблемы с громкостью SDL_Mixer MIDI в Windows Vista/7

На самом деле я не очень хорошо разбираюсь в C++ или SDL_Mixer, но я все равно задаю этот вопрос от имени сообщества Doom. Проще говоря, кажется, что никто, пишущий исходные порты Doom, не может понять, как управлять нормальной громкостью звука и громкостью звука MIDI независимо, используя SDL_Mixer в Windows Vista или 7. Я позволю Джеймсу Хейли, автору Eternity Engine, выразить это своими словами. :

Кажется, что концепция независимой громкости для собственного MIDI не существует в Windows Vista или 7, поскольку использование ползунков громкости MIDI в любом приложении, в котором они есть (включая большинство игр, использующих SDL_mixer), также влияет на громкость вывода цифрового звука. Это делает невозможным попытку отрегулировать относительную громкость музыки для комфорта.

Кто-нибудь нашел обходные пути для этого? Я предполагаю, что это маловероятно, учитывая, как Microsoft, похоже, экономила на всей ОС, пытаясь контролировать громкость отдельных звуковых устройств по отдельности.

Я слышал о различных обходных путях, связанных с драйвером Timidity, но это требует, чтобы пользователь делал все возможное, чтобы просто установить игру в своей системе. Единственный известный мне порт, который окончательно решает эту проблему, — это ZDoom, но он использует несовместимый с GPL FModEx и, таким образом, не является подходящим решением.

Если вы хотите посмотреть какой-то код, Chocolate Doom, возможно, является самым простым портом исходного кода Doom для поиска, и вы можете получить его исходный код здесь.

Любые предложения по другим звуковым и музыкальным библиотекам с открытым исходным кодом также будут приветствоваться.


person AlexMax    schedule 03.05.2011    source источник
comment
Почему бы просто не преобразовать существующие MIDI-файлы в WAV (или любой другой формат файла, который можно распаковывать в поток PCM) и управлять музыкальным потоком, как если бы это был любой другой звук, с которым вы микшируете?   -  person selbie    schedule 03.05.2011
comment
Файлы MIDI встроены в файлы данных .WAD, и существуют десятки тысяч файлов данных .WAD, созданных пользователями, некоторые из которых датируются 1994 годом. О предварительном преобразовании, вероятно, не может быть и речи. Для этого в самой программе есть Timidity++ и Fluidsynth, но я слышал жалобы на неудовлетворительные преобразования в обоих случаях.   -  person AlexMax    schedule 03.05.2011


Ответы (4)


Решением будет поставка с SDL_mixer с поддержкой FluidSynth. Вам также потребуется отправить файл SoundFont2 вместе с ним. К счастью, есть бесплатные SF2, а некоторые даже оптимизированы для MIDI-файлов Doom. Лицензии не должны быть проблемой, поскольку SoundFonts — это активы, а не код.

Затем вы загружаете SF2, используя Mix_SetSoundFonts().

person Nikos C.    schedule 29.08.2012

Вы можете захотеть просмотреть различные MIDI-библиотеки вне SDL.

http://wildmidi.sourceforge.net/

http://sourceforge.net/apps/trac/fluidsynth/

http://timidity.sourceforge.net

person Byron    schedule 14.07.2011

Я поддерживаю аналогичный игровой порт (Descent 2) и столкнулся с той же проблемой. Afaik нет решения для этого при использовании SDL_mixer. Я нашел средство, позволяющее избежать отключения звука при отключении миди-музыки, — это получить дескриптор временного миди-устройства, установить максимальную громкость миди, а затем снова закрыть временное устройство.

person Razzupaltuff    schedule 02.12.2011

Долгое время единственным решением, которое мы находили, было использование чего-то вроде PortMIDI. Однако известность Quasar of Eternity Engine нашла изящное решение:

http://www.doomworld.com/vb/showthread.php?s=&postid=1124981#post1124981

По сути, он помещает SDL_Mixer в свой собственный процесс и управляет им с помощью RPC. Очень умный.

person AlexMax    schedule 24.11.2012