From db9404dcf6b58fae528dcc6affdad2918f45c572 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 23 Oct 2025 08:34:44 +0100 Subject: [PATCH] CMake: Add SDL3_mixer Requires a not-yet-released SDL 3.4.0. I tried implementing audio with plain SDL and it's too complicated. --- 3rdParty/SDL3/CMakeLists.txt | 4 +-- 3rdParty/SDL3_mixer/CMakeLists.txt | 33 ++++++++++++++++++++++ CMake/Dependencies.cmake | 44 +++++++++++++++++++++--------- Source/CMakeLists.txt | 6 +++- Source/diablo.cpp | 1 + Source/engine/dx.cpp | 1 + Source/gamemenu.cpp | 4 +++ 7 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 3rdParty/SDL3_mixer/CMakeLists.txt diff --git a/3rdParty/SDL3/CMakeLists.txt b/3rdParty/SDL3/CMakeLists.txt index c2e1d812c..c327d7a84 100644 --- a/3rdParty/SDL3/CMakeLists.txt +++ b/3rdParty/SDL3/CMakeLists.txt @@ -16,7 +16,7 @@ include(functions/FetchContent_ExcludeFromAll_backport) include(FetchContent) FetchContent_Declare(SDL3 - URL https://github.com/libsdl-org/SDL/releases/download/release-3.2.24/SDL3-3.2.24.tar.gz - URL_HASH SHA256=81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76 + URL https://github.com/libsdl-org/SDL/archive/02c4478f9364ac9ba8c0b157c01e47c2f059552c.tar.gz + URL_HASH SHA256=1c8e9369ef6c67b6ca4102cc957846966815de56924b24a8a28feeac344a506a ) FetchContent_MakeAvailable_ExcludeFromAll(SDL3) diff --git a/3rdParty/SDL3_mixer/CMakeLists.txt b/3rdParty/SDL3_mixer/CMakeLists.txt new file mode 100644 index 000000000..a6e10da95 --- /dev/null +++ b/3rdParty/SDL3_mixer/CMakeLists.txt @@ -0,0 +1,33 @@ +include(functions/dependency_options) +include(functions/FetchContent_ExcludeFromAll_backport) +include(FetchContent) + +if(DEVILUTIONX_STATIC_SDL_MIXER) + set(BUILD_SHARED_LIBS OFF) +else() + set(BUILD_SHARED_LIBS ON) +endif() + +set(SDLMIXER_AIFF OFF) +set(SDLMIXER_WAVE ON) +set(SDLMIXER_VOC OFF) +set(SDLMIXER_AU OFF) +set(SDLMIXER_FLAC_LIBFLAC OFF) +set(SDLMIXER_FLAC_DRFLAC OFF) +set(SDLMIXER_GME OFF) +set(SDLMIXER_MOD_XMP OFF) +set(SDLMIXER_MP3_DRMP3 ON) +set(SDLMIXER_MP3_MPG123 OFF) +set(SDLMIXER_MIDI_FLUIDSYNTH OFF) +set(SDLMIXER_MIDI_TIMIDITY OFF) +set(SDLMIXER_OPUS OFF) +set(SDLMIXER_VORBIS_STB OFF) +set(SDLMIXER_VORBIS_VORBISFILE OFF) +set(SDLMIXER_VORBIS_TREMOR OFF) +set(SDLMIXER_WAVPACK OFF) + +FetchContent_Declare_ExcludeFromAll(SDL_mixer + URL https://github.com/libsdl-org/SDL_mixer/archive/4b4b05949208ad0a49832ed34f59beeae6d6c2da.tar.gz + URL_HASH SHA256=744bbe25e127121a87b070f9211794b38e71db7e6ea497757bf45ac85525a905 +) +FetchContent_MakeAvailable_ExcludeFromAll(SDL_mixer) diff --git a/CMake/Dependencies.cmake b/CMake/Dependencies.cmake index 0c066ef2e..a574210b2 100644 --- a/CMake/Dependencies.cmake +++ b/CMake/Dependencies.cmake @@ -66,7 +66,7 @@ elseif(USE_SDL1) elseif(USE_SDL3) dependency_options("SDL3" DEVILUTIONX_SYSTEM_SDL3 ON DEVILUTIONX_STATIC_SDL3) if(DEVILUTIONX_SYSTEM_SDL3) - find_package(SDL3 3.2.0 REQUIRED CONFIG REQUIRED COMPONENTS SDL3) + find_package(SDL3 3.4.0 REQUIRED CONFIG REQUIRED COMPONENTS SDL3) else() add_subdirectory(3rdParty/SDL3) endif() @@ -195,21 +195,39 @@ else() add_subdirectory(3rdParty/libfmt) endif() -if(NOT NOSOUND AND NOT USE_SDL3) - if(NOT DEFINED DEVILUTIONX_SYSTEM_SDL_AUDIOLIB) - find_package(SDL_audiolib QUIET) - if(SDL_audiolib_FOUND) - message("-- Found SDL_audiolib") +if(NOT NOSOUND) + if(USE_SDL3) + if(NOT DEFINED DEVILUTIONX_SYSTEM_SDL_MIXER) + find_package(SDL3_mixer QUIET CONFIG) + if(SDL3_mixer_FOUND) + message("-- Found SDL3_mixer") + else() + message("-- Suitable system SDL3_mixer package not found, will use SDL3_mixer from source") + set(DEVILUTIONX_SYSTEM_SDL_MIXER OFF) + endif() + endif() + dependency_options("SDL3_mixer" DEVILUTIONX_SYSTEM_SDL_MIXER ON DEVILUTIONX_STATIC_SDL_MIXER) + if(DEVILUTIONX_SYSTEM_SDL_MIXER) + find_package(SDL3_mixer REQUIRED CONFIG) else() - message("-- Suitable system SDL_audiolib package not found, will use SDL_audiolib from source") - set(DEVILUTIONX_SYSTEM_SDL_AUDIOLIB OFF) + add_subdirectory(3rdParty/SDL3_mixer) endif() - endif() - dependency_options("SDL_audiolib" DEVILUTIONX_SYSTEM_SDL_AUDIOLIB ON DEVILUTIONX_STATIC_SDL_AUDIOLIB) - if(DEVILUTIONX_SYSTEM_SDL_AUDIOLIB) - find_package(SDL_audiolib REQUIRED) else() - add_subdirectory(3rdParty/SDL_audiolib) + if(NOT DEFINED DEVILUTIONX_SYSTEM_SDL_AUDIOLIB) + find_package(SDL_audiolib QUIET) + if(SDL_audiolib_FOUND) + message("-- Found SDL_audiolib") + else() + message("-- Suitable system SDL_audiolib package not found, will use SDL_audiolib from source") + set(DEVILUTIONX_SYSTEM_SDL_AUDIOLIB OFF) + endif() + endif() + dependency_options("SDL_audiolib" DEVILUTIONX_SYSTEM_SDL_AUDIOLIB ON DEVILUTIONX_STATIC_SDL_AUDIOLIB) + if(DEVILUTIONX_SYSTEM_SDL_AUDIOLIB) + find_package(SDL_audiolib REQUIRED) + else() + add_subdirectory(3rdParty/SDL_audiolib) + endif() endif() endif() diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 35dc90e99..8f16d8641 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -747,7 +747,11 @@ else() engine/sound.cpp utils/soundsample.cpp ) - if(NOT USE_SDL3) + if(USE_SDL3) + target_link_dependencies(libdevilutionx_sound PUBLIC + SDL3_mixer::SDL3_mixer + ) + else() target_sources(libdevilutionx_sound PRIVATE utils/push_aulib_decoder.cpp) target_link_dependencies(libdevilutionx_sound PUBLIC diff --git a/Source/diablo.cpp b/Source/diablo.cpp index eedea4281..f19c99855 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -9,6 +9,7 @@ #ifdef USE_SDL3 #include +#include #include #else #include diff --git a/Source/engine/dx.cpp b/Source/engine/dx.cpp index bd23604e8..e7e60b65f 100644 --- a/Source/engine/dx.cpp +++ b/Source/engine/dx.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #else #include diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 321c52b67..f1f997c75 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -5,6 +5,10 @@ */ #include "gamemenu.h" +#ifdef USE_SDL3 +#include +#endif + #include "cursor.h" #include "diablo_msg.hpp" #include "engine/backbuffer_state.hpp"