From 6d70c71c694628d3c1f31dbaa92cba378d6b9b9f Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sun, 22 Oct 2023 12:07:28 +0200 Subject: [PATCH] Port to SDL_mixer 1.2 (Breaks USE_SDL_MAINLOOP) --- CMakeLists.txt | 11 ++++++----- src/C4AudioSystemSdl.cpp | 33 ++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 687cb3f6d..7e4bd3009 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,17 +370,18 @@ endif () # Link SDL2 if (USE_SDL_MAINLOOP OR USE_SDL_MIXER) - find_package(SDL2 REQUIRED) - if (SDL2_FOUND AND USE_SDL_MAINLOOP) + find_package(SDL REQUIRED) + if (SDL_FOUND AND USE_SDL_MAINLOOP) set(USE_SDL_FOR_GAMEPAD ON) endif () - target_link_libraries(clonk SDL2::SDL2) + target_link_libraries(clonk SDL::SDL) endif () # Link SDL2_mixer if (USE_SDL_MIXER) - find_package(SDL2_mixer REQUIRED) - target_link_libraries(clonk SDL2_mixer::SDL2_mixer) + find_package(SDL_mixer REQUIRED) + target_link_libraries(clonk ${SDL_MIXER_LIBRARIES}) + target_include_directories(clonk PUBLIC ${SDL_MIXER_INCLUDE_DIRECTORIES}) endif () # Link Windows Imaging Component diff --git a/src/C4AudioSystemSdl.cpp b/src/C4AudioSystemSdl.cpp index 08256d9e9..56d1678ac 100644 --- a/src/C4AudioSystemSdl.cpp +++ b/src/C4AudioSystemSdl.cpp @@ -48,7 +48,7 @@ class C4AudioSystemSdl : public C4AudioSystem static constexpr Uint16 Format = AUDIO_S16SYS; static constexpr int NumChannels = 2; static constexpr int BytesPerSecond = - Frequency * (SDL_AUDIO_BITSIZE(Format) / 8) * NumChannels; + Frequency * (16 / 8) * NumChannels; // Smart pointers for SDL_mixer objects using SDLMixChunkUniquePtr = C4DeleterFunctionUniquePtr; @@ -58,11 +58,11 @@ class C4AudioSystemSdl : public C4AudioSystem static void ThrowIfFailed(const char *funcName, bool failed, std::string_view errorMessage = {}); - template - using SampleLoadFunc = T *(*)(SDL_RWops *, int); + template + using SampleLoadFunc = T *(*)(SDL_RWops *, extra...); - template - static T *LoadSampleCheckMpegLayer3Header(SampleLoadFunc loadFunc, const char *funcName, const void *buf, const std::size_t size); + template + static T *LoadSampleCheckMpegLayer3Header(SampleLoadFunc loadFunc, const char *funcName, const void *buf, const std::size_t size); public: @@ -135,8 +135,8 @@ C4AudioSystemSdl::C4AudioSystemSdl(const int maxChannels, const bool preferLinea // Try to enable linear resampling if requested if (preferLinearResampling) { - if (!SDL_SetHint(SDL_HINT_AUDIO_RESAMPLING_MODE, "linear")) - LogF("SDL_SetHint(SDL_HINT_AUDIO_RESAMPLING_MODE, \"linear\") failed"); + //if (!SDL_SetHint(SDL_HINT_AUDIO_RESAMPLING_MODE, "linear")) +// LogF("SDL_SetHint(SDL_HINT_AUDIO_RESAMPLING_MODE, \"linear\") failed"); } // Initialize SDL_mixer @@ -187,10 +187,21 @@ void C4AudioSystemSdl::StopMusic() void C4AudioSystemSdl::UnpauseMusic() { /* Not supported */ } -template -T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc loadFunc, const char *const funcName, const void *const buf, const std::size_t size) +template +T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc loadFunc, const char *const funcName, const void *const buf, const std::size_t size) { - const auto direct = loadFunc(SDL_RWFromConstMem(buf, size), SDL_TRUE); + const auto loadIt = [loadFunc](auto buf, auto size) + { + if constexpr (sizeof...(extra) == 1) + { + return loadFunc(SDL_RWFromConstMem(buf, size), SDL_TRUE); + } + else + { + return loadFunc(SDL_RWFromConstMem(buf, size)); + } + }; + const auto direct = loadIt(buf, size); if (direct) { return direct; @@ -227,7 +238,7 @@ T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc loa if ((byte4 & std::byte{0x03}) == std::byte{0x02}) continue; // at this point there seems to be a valid MPEG frame header - const auto sample = loadFunc(SDL_RWFromConstMem(data.data() + i, size - i), SDL_TRUE); + const auto sample = loadIt(buf, size); if (sample) { return sample;