Merge pull request #4825 from Orphis/cmake_alsa

CMake: Updates to AudioCommon & ALSA discovery
This commit is contained in:
Mat M 2017-02-05 08:50:34 -05:00 committed by GitHub
commit af33c9714e
6 changed files with 117 additions and 55 deletions

View file

@ -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)

57
CMakeTests/FindALSA.cmake Normal file
View file

@ -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)

View file

@ -33,7 +33,7 @@ void InitSoundStream()
std::string backend = SConfig::GetInstance().sBackend;
if (backend == BACKEND_OPENAL && OpenALStream::isValid())
g_sound_stream = std::make_unique<OpenALStream>();
else if (backend == BACKEND_NULLSOUND && NullSound::isValid())
else if (backend == BACKEND_NULLSOUND)
g_sound_stream = std::make_unique<NullSound>();
else if (backend == BACKEND_XAUDIO2)
{
@ -53,7 +53,7 @@ void InitSoundStream()
else if (backend == BACKEND_OPENSLES && OpenSLESStream::isValid())
g_sound_stream = std::make_unique<OpenSLESStream>();
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<std::string> GetSoundBackends()
{
std::vector<std::string> 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())

View file

@ -18,6 +18,7 @@ namespace AudioCommon
{
void InitSoundStream();
void ShutdownSoundStream();
std::string GetDefaultSoundBackend();
std::vector<std::string> GetSoundBackends();
bool SupportsDPL2Decoder(const std::string& backend);
bool SupportsLatencyControl(const std::string& backend);

View file

@ -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}")

View file

@ -6,6 +6,8 @@
#include <climits>
#include <memory>
#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);