Форк SoLoud
Я терпеть не могу форкать чужие OpenSource-проекты, но иногда все же приходится это делать. Вокруг некоторых замечательных вещей почему-то не складывается сообщество, и если автор забрасывает проект, то форк — единственный выход. Всем хотелось бы, чтобы поддержкой нужного софта занимался кто-нибудь другой, какие-то специалисты с опытом, но в какой-то момент понимаешь, что ты вообще-то сам один из них и должен что-то брать на себя.
Так получилось с SoLoud, моим любимым свободным звуковым движком для игр. Игровое аудио преследует странное проклятие — ни одна библиотека не становится стандартом в достаточной степени, чтобы ее развивали всем миром. Так было с OpenAL, так было с популярным когда-то российским проектом Squall, и теперь вот SoLoud тоже оказался заброшен. Конечно, есть альтернативы — например, те же SDL Audio и SDL_Mixer, но в них из коробки почти ничего нет, все функции нужно реализовывать самому. А в SoLoud есть отличный многоканальный 3D-микшер и поддержка всех популярных аудиоформатов, плюс фильтры и множество полезных настроек. Он работает поверх самых разных системных API и других аудиодвижков, включая те же SDL, OpenAL, MiniAudio и много чего еще. Это единственный в своем роде комбайн, который заслуживает звания «свободного FMOD», и отказываться от такой удобной штуки как-то совсем не с руки.
Беда в том, что переход игрового движка на SDL3 ломает все, что в нем зависело от SDL2. В SoLoud так и не появился официальный бэкенд поверх SDL3, и это стало очередной серьезной проблемой для Dagon 2. Конечно, можно просто выставить в настройках альтернативный бэкенд (под Windows самый очевидный выбор WASAPI, под Linux — что заведется), но мне стало досадно, что нельзя жить по-старому — ведь SDL все-таки штука надежная, работающая практически везде со стопроцентной гарантией. Поэтому я решил сделать свою версию SoLoud со включенным PR #402, добавляющим поддержку SDL3.
Попутно пришлось сделать новый CMakeLists.txt, потому что старый работал через пень-колоду, а официальным генератором сборки проекта вообще является какой-то неведомый форк Premake под названием GENie 🤯 Но это было только началом квеста: оказалось, что PR кривой, с недоделанной загрузкой функций SDL из библиотеки и неправильной инициализацией, из-за которой бэкенд тупо не работал. Пришлось продираться сквозь баги — как в той песне группы PR-Mex, «что ж их так много, ей-богу?»
Я также решил поэкспериментировать и добавил собственный бэкенд поверх DirectSound — ностальгия! И он на удивление хорошо заработал. Статус всех бэкендов на сегодняшний день такой:
- SDL1, SDL2, SDL3 — работают под Windows и Linux;
- OpenAL — работает под Windows и Linux;
- MiniAudio — работает под Windows и Linux;
- PortAudio — работает как минимум под Windows;
- WinMM — работает;
- WASAPI — работает;
- XAudio2 — работает;
- DirectSound — работает;
- ALSA — работает нестабильно, для продакшна не годится;
- OSS — не работает;
- JACK — не тестировал;
- CoreAudio — не тестировал, т.к. не имею компьютера Apple;
- OpenSLES — не тестировал и не включал бэкенд в сборку;
- VitaHomebrew — не тестировал и не включал бэкенд в сборку.
На практике, по моему опыту, самые надежные бэкенды — SDL и MiniAudio. В целях сохранения обратной совместимости ABI я не стал менять константы существующих бэкендов и добавил новые в конец: SDL3 идет под номером 17, DirectSound — 18.
Мой форк доступен тут: https://github.com/gecko0307/soloud, патчи с исправлениями приветствуются. Я пока не уверен, буду ли добавлять новые функции — смысл форка состоит пока только в базовом сопровождении.