diff --git a/CMakeLists.txt b/CMakeLists.txt index a6d82b0d65..091feb451e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -434,19 +434,6 @@ if (OPENGL_GL) include_directories(${OPENGL_INCLUDE_DIR}) endif() -if(ENABLE_ALSA) - find_package(ALSA) - if(ALSA_FOUND) - add_definitions(-DHAVE_ALSA=1) - message(STATUS "ALSA found, enabling ALSA sound backend") - else() - add_definitions(-DHAVE_ALSA=0) - message(STATUS "ALSA NOT found, disabling ALSA sound backend") - endif() -else() - message(STATUS "ALSA explicitly disabled, disabling ALSA sound backend") -endif() - if(ENABLE_AO) check_lib(AO ao ao QUIET) if(AO_FOUND) diff --git a/CMakeTests/FindALSA.cmake b/CMakeTests/FindALSA.cmake new file mode 100644 index 0000000000..86c1510287 --- /dev/null +++ b/CMakeTests/FindALSA.cmake @@ -0,0 +1,57 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindALSA +# -------- +# +# Find alsa +# +# Find the alsa libraries (asound) +# +# :: +# +# This module defines the following variables: +# ALSA_FOUND - True if ALSA_INCLUDE_DIR & ALSA_LIBRARY are found +# ALSA_LIBRARIES - Set when ALSA_LIBRARY is found +# ALSA_INCLUDE_DIRS - Set when ALSA_INCLUDE_DIR is found +# +# +# +# :: +# +# ALSA_INCLUDE_DIR - where to find asoundlib.h, etc. +# ALSA_LIBRARY - the asound library +# ALSA_VERSION_STRING - the version of alsa found (since CMake 2.8.8) + +find_path(ALSA_INCLUDE_DIR NAMES alsa/asoundlib.h + DOC "The ALSA (asound) include directory" +) + +find_library(ALSA_LIBRARY NAMES asound + DOC "The ALSA (asound) library" +) + +if(ALSA_INCLUDE_DIR AND EXISTS "${ALSA_INCLUDE_DIR}/alsa/version.h") + file(STRINGS "${ALSA_INCLUDE_DIR}/alsa/version.h" alsa_version_str REGEX "^#define[\t ]+SND_LIB_VERSION_STR[\t ]+\".*\"") + + string(REGEX REPLACE "^.*SND_LIB_VERSION_STR[\t ]+\"([^\"]*)\".*$" "\\1" ALSA_VERSION_STRING "${alsa_version_str}") + unset(alsa_version_str) +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALSA + REQUIRED_VARS ALSA_LIBRARY ALSA_INCLUDE_DIR + VERSION_VAR ALSA_VERSION_STRING) + +if(ALSA_FOUND) + set( ALSA_LIBRARIES ${ALSA_LIBRARY} ) + set( ALSA_INCLUDE_DIRS ${ALSA_INCLUDE_DIR} ) + add_library(ALSA::ALSA UNKNOWN IMPORTED) + set_target_properties(ALSA::ALSA PROPERTIES + IMPORTED_LOCATION ${ALSA_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES ${ALSA_INCLUDE_DIR} + ) +endif() + +mark_as_advanced(ALSA_INCLUDE_DIR ALSA_LIBRARY) diff --git a/Source/Core/AudioCommon/AudioCommon.cpp b/Source/Core/AudioCommon/AudioCommon.cpp index 0d0309a5c0..86d3d5943e 100644 --- a/Source/Core/AudioCommon/AudioCommon.cpp +++ b/Source/Core/AudioCommon/AudioCommon.cpp @@ -33,7 +33,7 @@ void InitSoundStream() std::string backend = SConfig::GetInstance().sBackend; if (backend == BACKEND_OPENAL && OpenALStream::isValid()) g_sound_stream = std::make_unique(); - else if (backend == BACKEND_NULLSOUND && NullSound::isValid()) + else if (backend == BACKEND_NULLSOUND) g_sound_stream = std::make_unique(); else if (backend == BACKEND_XAUDIO2) { @@ -53,7 +53,7 @@ void InitSoundStream() else if (backend == BACKEND_OPENSLES && OpenSLESStream::isValid()) g_sound_stream = std::make_unique(); - if (!g_sound_stream && NullSound::isValid()) + if (!g_sound_stream) { WARN_LOG(AUDIO, "Could not initialize backend %s, using %s instead.", backend.c_str(), BACKEND_NULLSOUND); @@ -92,12 +92,27 @@ void ShutdownSoundStream() INFO_LOG(AUDIO, "Done shutting down sound stream"); } +std::string GetDefaultSoundBackend() +{ + std::string backend = BACKEND_NULLSOUND; +#if defined __linux__ + if (AlsaSound::isValid()) + backend = BACKEND_ALSA; +#elif defined __APPLE__ + backend = BACKEND_COREAUDIO; +#elif defined _WIN32 + backend = BACKEND_XAUDIO2; +#elif defined ANDROID + backend = BACKEND_OPENSLES; +#endif + return backend; +} + std::vector GetSoundBackends() { std::vector backends; - if (NullSound::isValid()) - backends.push_back(BACKEND_NULLSOUND); + backends.push_back(BACKEND_NULLSOUND); if (XAudio2_7::isValid() || XAudio2::isValid()) backends.push_back(BACKEND_XAUDIO2); if (AOSound::isValid()) diff --git a/Source/Core/AudioCommon/AudioCommon.h b/Source/Core/AudioCommon/AudioCommon.h index 249f608aad..8ba06ccac2 100644 --- a/Source/Core/AudioCommon/AudioCommon.h +++ b/Source/Core/AudioCommon/AudioCommon.h @@ -18,6 +18,7 @@ namespace AudioCommon { void InitSoundStream(); void ShutdownSoundStream(); +std::string GetDefaultSoundBackend(); std::vector GetSoundBackends(); bool SupportsDPL2Decoder(const std::string& backend); bool SupportsLatencyControl(const std::string& backend); diff --git a/Source/Core/AudioCommon/CMakeLists.txt b/Source/Core/AudioCommon/CMakeLists.txt index cd852e0366..c5b58c23be 100644 --- a/Source/Core/AudioCommon/CMakeLists.txt +++ b/Source/Core/AudioCommon/CMakeLists.txt @@ -1,51 +1,61 @@ -set(SRCS AudioCommon.cpp - DPL2Decoder.cpp - Mixer.cpp - WaveFile.cpp - NullSoundStream.cpp) +set(SRCS + AudioCommon.cpp + DPL2Decoder.cpp + Mixer.cpp + WaveFile.cpp + NullSoundStream.cpp +) -set(LIBS "") +add_dolphin_library(audiocommon "${SRCS}" "") find_package(OpenSLES) if(OPENSLES_FOUND) - message(STATUS "OpenSLES found, enabling OpenSLES sound backend") - set(SRCS ${SRCS} OpenSLESStream.cpp) - set(LIBS ${LIBS} OpenSLES::OpenSLES) + message(STATUS "OpenSLES found, enabling OpenSLES sound backend") + target_sources(audiocommon PRIVATE OpenSLESStream.cpp) + target_link_libraries(audiocommon PRIVATE OpenSLES::OpenSLES) endif() -if(ALSA_FOUND) - set(SRCS ${SRCS} AlsaSoundStream.cpp) - set(LIBS ${LIBS} ${ALSA_LIBRARIES}) +if(ENABLE_ALSA) + find_package(ALSA) + if(ALSA_FOUND) + message(STATUS "ALSA found, enabling ALSA sound backend") + target_sources(audiocommon PRIVATE AlsaSoundStream.cpp) + target_link_libraries(audiocommon PRIVATE ALSA::ALSA) + target_compile_definitions(audiocommon PRIVATE HAVE_ALSA=1) + else() + message(STATUS "ALSA NOT found, disabling ALSA sound backend") + endif() +else() + message(STATUS "ALSA explicitly disabled, disabling ALSA sound backend") endif() if(AO_FOUND) - set(SRCS ${SRCS} AOSoundStream.cpp) - set(LIBS ${LIBS} ${AO_LIBRARIES}) + target_sources(audiocommon PRIVATE AOSoundStream.cpp) + target_link_libraries(audiocommon PRIVATE ${AO_LIBRARIES}) endif() if(OPENAL_FOUND) - set(SRCS ${SRCS} OpenALStream.cpp aldlist.cpp) - set(LIBS ${LIBS} ${OPENAL_LIBRARY} SoundTouch ) + target_sources(audiocommon PRIVATE OpenALStream.cpp aldlist.cpp) + target_link_libraries(audiocommon PRIVATE ${OPENAL_LIBRARY} SoundTouch) endif() if(PULSEAUDIO_FOUND) - set(SRCS ${SRCS} PulseAudioStream.cpp) - set(LIBS ${LIBS} ${PULSEAUDIO_LIBRARIES}) + target_sources(audiocommon PRIVATE PulseAudioStream.cpp) + target_link_libraries(audiocommon PRIVATE ${PULSEAUDIO_LIBRARIES}) endif() if(WIN32) - set(SRCS ${SRCS} XAudio2Stream.cpp) + target_sources(audiocommon PRIVATE XAudio2Stream.cpp) - add_dolphin_library(audiocommon_xaudio27 "XAudio2_7Stream.cpp" "${LIBS}") - target_include_directories(audiocommon_xaudio27 PRIVATE - ${PROJECT_SOURCE_DIR}/Externals - ${PROJECT_SOURCE_DIR}/Externals/XAudio2_7 - ) - list(APPEND LIBS audiocommon_xaudio27) + add_dolphin_library(audiocommon_xaudio27 "XAudio2_7Stream.cpp" "${LIBS}") + target_include_directories(audiocommon_xaudio27 PRIVATE + ${PROJECT_SOURCE_DIR}/Externals + ${PROJECT_SOURCE_DIR}/Externals/XAudio2_7 + ) + target_link_libraries(audiocommon PRIVATE audiocommon_xaudio27) elseif(APPLE) - set(SRCS ${SRCS} CoreAudioSoundStream.cpp) + target_sources(audiocommon PRIVATE CoreAudioSoundStream.cpp) endif() -add_dolphin_library(audiocommon "${SRCS}" "${LIBS}") diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index edb2386bd4..8e7837c90a 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -6,6 +6,8 @@ #include #include +#include "AudioCommon/AudioCommon.h" + #include "Common/CDUtils.h" #include "Common/CommonPaths.h" #include "Common/CommonTypes.h" @@ -613,17 +615,7 @@ void SConfig::LoadDSPSettings(IniFile& ini) dsp->Get("DumpAudio", &m_DumpAudio, false); dsp->Get("DumpAudioSilent", &m_DumpAudioSilent, false); dsp->Get("DumpUCode", &m_DumpUCode, false); -#if defined __linux__ && HAVE_ALSA - dsp->Get("Backend", &sBackend, BACKEND_ALSA); -#elif defined __APPLE__ - dsp->Get("Backend", &sBackend, BACKEND_COREAUDIO); -#elif defined _WIN32 - dsp->Get("Backend", &sBackend, BACKEND_XAUDIO2); -#elif defined ANDROID - dsp->Get("Backend", &sBackend, BACKEND_OPENSLES); -#else - dsp->Get("Backend", &sBackend, BACKEND_NULLSOUND); -#endif + dsp->Get("Backend", &sBackend, AudioCommon::GetDefaultSoundBackend()); dsp->Get("Volume", &m_Volume, 100); dsp->Get("CaptureLog", &m_DSPCaptureLog, false);