Skip to content

Commit

Permalink
Port to SDL_mixer 1.2 (Breaks USE_SDL_MAINLOOP)
Browse files Browse the repository at this point in the history
  • Loading branch information
maxmitti committed Oct 22, 2023
1 parent e28c8cd commit 6d70c71
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
11 changes: 6 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 22 additions & 11 deletions src/C4AudioSystemSdl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Mix_FreeChunk>;
Expand All @@ -58,11 +58,11 @@ class C4AudioSystemSdl : public C4AudioSystem

static void ThrowIfFailed(const char *funcName, bool failed, std::string_view errorMessage = {});

template <typename T>
using SampleLoadFunc = T *(*)(SDL_RWops *, int);
template <typename T, typename... extra>
using SampleLoadFunc = T *(*)(SDL_RWops *, extra...);

template <typename T>
static T *LoadSampleCheckMpegLayer3Header(SampleLoadFunc<T> loadFunc, const char *funcName, const void *buf, const std::size_t size);
template <typename T, typename... extra>
static T *LoadSampleCheckMpegLayer3Header(SampleLoadFunc<T, extra...> loadFunc, const char *funcName, const void *buf, const std::size_t size);

public:

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -187,10 +187,21 @@ void C4AudioSystemSdl::StopMusic()

void C4AudioSystemSdl::UnpauseMusic() { /* Not supported */ }

template <typename T>
T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc<T> loadFunc, const char *const funcName, const void *const buf, const std::size_t size)
template <typename T, typename... extra>
T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc<T, extra...> 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;
Expand Down Expand Up @@ -227,7 +238,7 @@ T *C4AudioSystemSdl::LoadSampleCheckMpegLayer3Header(const SampleLoadFunc<T> 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;
Expand Down

0 comments on commit 6d70c71

Please sign in to comment.