From b3547cde734f7dfffdf6a82938c71bf1128067a5 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 18:14:48 -0700 Subject: [PATCH 01/15] Updating to cmake 3 --- contrib/CMakeLists.txt | 43 ++++- contrib/CMakeLists.txt.user | 191 +++++++++++++++++++++++ contrib/Configure.cmake | 33 ---- contrib/demos.cmake | 93 ++++++----- contrib/src.cmake | 302 ++++++++++++++++-------------------- 5 files changed, 418 insertions(+), 244 deletions(-) create mode 100644 contrib/CMakeLists.txt.user delete mode 100644 contrib/Configure.cmake diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index fb5369e7..8dd5ca8e 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -1,14 +1,46 @@ -cmake_minimum_required (VERSION 2.8) - +cmake_minimum_required (VERSION 3.0) project (SoLoud) set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") set (CMAKE_POSITION_INDEPENDENT_CODE ON) -#INCLUDE (StandartIncludes) -include_directories (../include) +include (OptionDependentOnPackage) +include (PrintOptionStatus) + +option (SOLOUD_DYNAMIC "Set to ON to build dynamic SoLoud" OFF) +print_option_status (SOLOUD_DYNAMIC "Build dynamic library") + +option (SOLOUD_STATIC "Set to ON to build static SoLoud" ON) +print_option_status (SOLOUD_STATIC "Build static library") + +# TODO: +option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) +print_option_status (SOLOUD_BUILD_DEMOS "Build demos") + +option (SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" ON) +print_option_status (SOLOUD_ENABLE_BACKEND_NULL "NULL backend") + +option (SOLOUD_BACKEND_SDL2 "Set to ON for building SDL2 backend" OFF) +print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") + +option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) +print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") + +option (SOLOUD_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) +print_option_status (SOLOUD_BACKEND_OPENSLES "OpenSLES backend") + +option (SOLOUD_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) +print_option_status (SOLOUD_BACKEND_XAUDIO2 "XAudio2 backend") + +option (SOLOUD_BACKEND_WINMM "Set to ON for building WINMM backend" OFF) +print_option_status (SOLOUD_BACKEND_WINMM "WINMM backend") + +option (SOLOUD_BACKEND_WASAPI "Set to ON for building WASAPI backend" OFF) +print_option_status (SOLOUD_BACKEND_WASAPI "WASAPI backend") + +#Establish some basic mappings to filesystem directories +get_filename_component(SOLOUD_ROOT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE) -include (Configure.cmake) #INCLUDE (InstallIncludes.cmake) #INCLUDE (InstallStaticData.cmake) @@ -29,4 +61,3 @@ IF (SOLOUD_BUILD_DEMOS) include (demos.cmake) endif () -include (InstallExport) diff --git a/contrib/CMakeLists.txt.user b/contrib/CMakeLists.txt.user new file mode 100644 index 00000000..44382ded --- /dev/null +++ b/contrib/CMakeLists.txt.user @@ -0,0 +1,191 @@ + + + + + + EnvironmentId + {af0185a3-201a-4f6b-8226-4757c69239b2} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + false + true + false + 0 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + Builtin.BuildSystem + + true + true + Builtin.DefaultTidyAndClazy + 16 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Desktop + {50604b53-b979-42df-8f68-eb2479760347} + 0 + 0 + 0 + + Debug + -GUnix Makefiles +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} + /home/brad/dev/rush/soloud/build-contrib-Desktop-Debug + + + -j 30 + + all + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + 1 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + simplest + CMakeProjectManager.CMakeRunConfiguration.simplest + simplest + false + true + true + false + true + /home/brad/dev/rush/soloud/build-contrib-Desktop-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/contrib/Configure.cmake b/contrib/Configure.cmake deleted file mode 100644 index b627855c..00000000 --- a/contrib/Configure.cmake +++ /dev/null @@ -1,33 +0,0 @@ -include (OptionDependentOnPackage) -include (PrintOptionStatus) - -option (SOLOUD_DYNAMIC "Set to ON to build dynamic SoLoud" OFF) -print_option_status (SOLOUD_DYNAMIC "Build dynamic library") - -option (SOLOUD_STATIC "Set to ON to build static SoLoud" ON) -print_option_status (SOLOUD_STATIC "Build static library") - -# TODO: -option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) -print_option_status (SOLOUD_BUILD_DEMOS "Build demos") - -option (SOLOUD_BACKEND_NULL "Set to ON for building NULL backend" ON) -print_option_status (SOLOUD_BACKEND_NULL "NULL backend") - -option (SOLOUD_BACKEND_SDL2 "Set to ON for building SDL2 backend" ON) -print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") - -option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) -print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") - -option (SOLOUD_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) -print_option_status (SOLOUD_BACKEND_OPENSLES "OpenSLES backend") - -option (SOLOUD_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) -print_option_status (SOLOUD_BACKEND_XAUDIO2 "XAudio2 backend") - -option (SOLOUD_BACKEND_WINMM "Set to ON for building WINMM backend" OFF) -print_option_status (SOLOUD_BACKEND_WINMM "WINMM backend") - -option (SOLOUD_BACKEND_WASAPI "Set to ON for building WASAPI backend" OFF) -print_option_status (SOLOUD_BACKEND_WASAPI "WASAPI backend") diff --git a/contrib/demos.cmake b/contrib/demos.cmake index 43f11442..594849f8 100644 --- a/contrib/demos.cmake +++ b/contrib/demos.cmake @@ -1,38 +1,55 @@ -set (HEADER_PATH ../include) -set (SOURCE_PATH ../demos) - -function (soloud_add_demo name sources) - set (TARGET_NAME SoLoud_${name}) - add_executable (${TARGET_NAME} ${sources}) - target_link_libraries (${TARGET_NAME} soloud) - include (Install) -endfunction() - -include_directories (${SOURCE_PATH}/common) -include_directories (${SOURCE_PATH}/common/imgui) - - -# soloud_add_demo(c_test ${SOURCE_PATH}/c_test/main.c) -soloud_add_demo(enumerate ${SOURCE_PATH}/enumerate/main.cpp) -# soloud_add_demo(env ${SOURCE_PATH}/env/main.cpp) -# soloud_add_demo(megademo -# ${SOURCE_PATH}/megademo/3dtest.cpp -# ${SOURCE_PATH}/megademo/main.cpp -# ${SOURCE_PATH}/megademo/mixbusses.cpp -# ${SOURCE_PATH}/megademo/monotone.cpp -# ${SOURCE_PATH}/megademo/multimusic.cpp -# ${SOURCE_PATH}/megademo/pewpew.cpp -# ${SOURCE_PATH}/megademo/radiogaga.cpp -# ${SOURCE_PATH}/megademo/space.cpp -# ${SOURCE_PATH}/megademo/speechfilter.cpp -# ${SOURCE_PATH}/megademo/tedsid.cpp -# ${SOURCE_PATH}/megademo/virtualvoices.cpp -# ) -soloud_add_demo(null ${SOURCE_PATH}/null/main.cpp) -# soloud_add_demo(piano -# ${SOURCE_PATH}/piano/main.cpp -# ${SOURCE_PATH}/piano/soloud_basicwave.cpp -# ${SOURCE_PATH}/piano/soloud_padsynth.cpp -# ) -soloud_add_demo(simplest ${SOURCE_PATH}/simplest/main.cpp) -soloud_add_demo(welcome ${SOURCE_PATH}/welcome/main.cpp) +set(SOLOUD_DEMO_DIRECTORY ${SOLOUD_ROOT_DIRECTORY}/demos) + + +############################## +#Simplest Demo +############################## +set(SOLOUD_DEMO_SIMPLEST_SOURCES ${SOLOUD_DEMO_DIRECTORY}/simplest/main.cpp) +add_executable(simplest ${SOLOUD_DEMO_SIMPLEST_SOURCES}) +target_link_libraries(simplest PUBLIC soloud) + + +#set(SOLOUD_DEMO_CTEST_SOURCES ${SOLOUD_DEMO_DIRECTORY}/c_test/main.c) +#add_executable(ctest ${SOLOUD_DEMO_CTEST_SOURCES}) +#target_link_libraries(ctest PUBLIC soloud) + +# set (HEADER_PATH ../include) +# set (SOURCE_PATH ../demos) + +# function (soloud_add_demo name sources) +# set (TARGET_NAME SoLoud_${name}) +# add_executable (${TARGET_NAME} ${sources}) +# target_link_libraries (${TARGET_NAME} soloud) +# include (Install) +# endfunction() + +# include_directories (${SOURCE_PATH}/common) +# include_directories (${SOURCE_PATH}/common/imgui) + + +# # soloud_add_demo(c_test ${SOURCE_PATH}/c_test/main.c) +# soloud_add_demo(enumerate ${SOURCE_PATH}/enumerate/main.cpp) +# # soloud_add_demo(env ${SOURCE_PATH}/env/main.cpp) +# # soloud_add_demo(megademo +# # ${SOURCE_PATH}/megademo/3dtest.cpp +# # ${SOURCE_PATH}/megademo/main.cpp +# # ${SOURCE_PATH}/megademo/mixbusses.cpp +# # ${SOURCE_PATH}/megademo/monotone.cpp +# # ${SOURCE_PATH}/megademo/multimusic.cpp +# # ${SOURCE_PATH}/megademo/pewpew.cpp +# # ${SOURCE_PATH}/megademo/radiogaga.cpp +# # ${SOURCE_PATH}/megademo/space.cpp +# # ${SOURCE_PATH}/megademo/speechfilter.cpp +# # ${SOURCE_PATH}/megademo/tedsid.cpp +# # ${SOURCE_PATH}/megademo/virtualvoices.cpp +# # ) +# soloud_add_demo(null ${SOURCE_PATH}/null/main.cpp) +# # soloud_add_demo(piano +# # ${SOURCE_PATH}/piano/main.cpp +# # ${SOURCE_PATH}/piano/soloud_basicwave.cpp +# # ${SOURCE_PATH}/piano/soloud_padsynth.cpp +# # ) +# soloud_add_demo(simplest ${SOURCE_PATH}/simplest/main.cpp) +# soloud_add_demo(welcome ${SOURCE_PATH}/welcome/main.cpp) + + diff --git a/contrib/src.cmake b/contrib/src.cmake index 0bda84e5..3c0ab42d 100644 --- a/contrib/src.cmake +++ b/contrib/src.cmake @@ -1,123 +1,130 @@ -set (TARGET_NAME soloud) - -set (HEADER_PATH ../include) -set (SOURCE_PATH ../src) - -set (LINK_LIBRARIES) - -# Headers -set (TARGET_HEADERS - ${HEADER_PATH}/soloud.h - ${HEADER_PATH}/soloud_audiosource.h - ${HEADER_PATH}/soloud_bassboostfilter.h - ${HEADER_PATH}/soloud_biquadresonantfilter.h - ${HEADER_PATH}/soloud_bus.h - ${HEADER_PATH}/soloud_c.h - ${HEADER_PATH}/soloud_dcremovalfilter.h - ${HEADER_PATH}/soloud_echofilter.h - ${HEADER_PATH}/soloud_error.h - ${HEADER_PATH}/soloud_fader.h - ${HEADER_PATH}/soloud_fft.h - ${HEADER_PATH}/soloud_fftfilter.h - ${HEADER_PATH}/soloud_file.h - ${HEADER_PATH}/soloud_file_hack_off.h - ${HEADER_PATH}/soloud_file_hack_on.h - ${HEADER_PATH}/soloud_filter.h - ${HEADER_PATH}/soloud_flangerfilter.h - ${HEADER_PATH}/soloud_internal.h - ${HEADER_PATH}/soloud_lofifilter.h - ${HEADER_PATH}/soloud_monotone.h - ${HEADER_PATH}/soloud_openmpt.h - ${HEADER_PATH}/soloud_queue.h - ${HEADER_PATH}/soloud_robotizefilter.h - ${HEADER_PATH}/soloud_sfxr.h - ${HEADER_PATH}/soloud_speech.h - ${HEADER_PATH}/soloud_tedsid.h - ${HEADER_PATH}/soloud_thread.h - ${HEADER_PATH}/soloud_vic.h - ${HEADER_PATH}/soloud_vizsn.h - ${HEADER_PATH}/soloud_wav.h - ${HEADER_PATH}/soloud_waveshaperfilter.h - ${HEADER_PATH}/soloud_wavstream.h +set(SOLOUD_PUBLIC_HEADERS_DIR ${SOLOUD_ROOT_DIRECTORY}/include) +set(SOLOUD_SOURCE_PATH_DIR ${SOLOUD_ROOT_DIRECTORY}/src) + +#Stub the existence of the libraries +add_library(soloud STATIC) +add_library(soloud-dynamic SHARED) + +function(apply_to_soloud_libraries FUNCTION_NAME) + cmake_language(CALL ${FUNCTION_NAME} soloud ${ARGN}) + cmake_language(CALL ${FUNCTION_NAME} soloud-dynamic ${ARGN}) +endfunction() + +set(LINK_LIBRARIES) +set(SOLOUD_SOURCES) +###################################### +#Core +###################################### +set(SOLOUD_CORE_SOURCES + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_audiosource.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_audiosource.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_bassboostfilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_biquadresonantfilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_bus.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_bus.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_c.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_3d.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_basicops.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_faderops.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_filterops.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_getters.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_setters.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_voicegroup.cpp + ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_voiceops.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_dcremovalfilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_echofilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_error.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fader.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_fader.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fft.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_fft.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fftfilter.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_fft_lut.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_file.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file_hack_off.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file_hack_on.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_filter.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_filter.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_flangerfilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_internal.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_lofifilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_monotone.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_openmpt.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_queue.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_queue.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_robotizefilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_sfxr.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_speech.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_tedsid.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_thread.h + ${SOLOUD_SOURCE_PATH_DIR}/soloud_thread.cpp + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_vic.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_vizsn.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_wav.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_waveshaperfilter.h + ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_wavstream.h ) - - -# Core -set (CORE_PATH ${SOURCE_PATH}/core) -set (CORE_SOURCES - ${CORE_PATH}/soloud.cpp - ${CORE_PATH}/soloud_audiosource.cpp - ${CORE_PATH}/soloud_bus.cpp - ${CORE_PATH}/soloud_core_3d.cpp - ${CORE_PATH}/soloud_core_basicops.cpp - ${CORE_PATH}/soloud_core_faderops.cpp - ${CORE_PATH}/soloud_core_filterops.cpp - ${CORE_PATH}/soloud_core_getters.cpp - ${CORE_PATH}/soloud_core_setters.cpp - ${CORE_PATH}/soloud_core_voicegroup.cpp - ${CORE_PATH}/soloud_core_voiceops.cpp - ${CORE_PATH}/soloud_fader.cpp - ${CORE_PATH}/soloud_fft.cpp - ${CORE_PATH}/soloud_fft_lut.cpp - ${CORE_PATH}/soloud_file.cpp - ${CORE_PATH}/soloud_filter.cpp - ${CORE_PATH}/soloud_queue.cpp - ${CORE_PATH}/soloud_thread.cpp +source_group ("Core" FILES ${SOLOUD_CORE_SOURCES}) +list(APPEND SOLOUD_SOURCES ${SOLOUD_CORE_SOURCES}) + +###################################### +#Audiosources +###################################### +set(SOLOUD_AUDIOSOURCES_DIR ${SOLOUD_SOURCE_PATH_DIR}/audiosource) +set(SOLOUD_AUDIOSOURCES_SOURCES + ${SOLOUD_AUDIOSOURCES_DIR}/monotone/soloud_monotone.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/openmpt/soloud_openmpt.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/openmpt/soloud_openmpt_dll.c + ${SOLOUD_AUDIOSOURCES_DIR}/sfxr/soloud_sfxr.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/speech/darray.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/speech/klatt.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/speech/resonator.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/speech/soloud_speech.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/speech/tts.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/tedsid/sid.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/tedsid/soloud_tedsid.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/tedsid/ted.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/vic/soloud_vic.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/vizsn/soloud_vizsn.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/wav/dr_impl.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/wav/soloud_wav.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/wav/soloud_wavstream.cpp + ${SOLOUD_AUDIOSOURCES_DIR}/wav/stb_vorbis.c ) - - -# Audiosources -set (AUDIOSOURCES_PATH ${SOURCE_PATH}/audiosource) -set (AUDIOSOURCES_SOURCES - ${AUDIOSOURCES_PATH}/monotone/soloud_monotone.cpp - ${AUDIOSOURCES_PATH}/openmpt/soloud_openmpt.cpp - ${AUDIOSOURCES_PATH}/openmpt/soloud_openmpt_dll.c - ${AUDIOSOURCES_PATH}/sfxr/soloud_sfxr.cpp - ${AUDIOSOURCES_PATH}/speech/darray.cpp - ${AUDIOSOURCES_PATH}/speech/klatt.cpp - ${AUDIOSOURCES_PATH}/speech/resonator.cpp - ${AUDIOSOURCES_PATH}/speech/soloud_speech.cpp - ${AUDIOSOURCES_PATH}/speech/tts.cpp - ${AUDIOSOURCES_PATH}/tedsid/sid.cpp - ${AUDIOSOURCES_PATH}/tedsid/soloud_tedsid.cpp - ${AUDIOSOURCES_PATH}/tedsid/ted.cpp - ${AUDIOSOURCES_PATH}/vic/soloud_vic.cpp - ${AUDIOSOURCES_PATH}/vizsn/soloud_vizsn.cpp - ${AUDIOSOURCES_PATH}/wav/dr_impl.cpp - ${AUDIOSOURCES_PATH}/wav/soloud_wav.cpp - ${AUDIOSOURCES_PATH}/wav/soloud_wavstream.cpp - ${AUDIOSOURCES_PATH}/wav/stb_vorbis.c +source_group ("AudioSources" FILES ${SOLOUD_AUDIOSOURCES_SOURCES}) +list(APPEND SOLOUD_SOURCES ${SOLOUD_AUDIOSOURCES_SOURCES}) + +###################################### +#Filters +###################################### +set (SOLOUD_FILTERS_PATH_DIR ${SOURCE_PATH}/filter) +set (SOLOUD_FILTERS_SOURCES + ${SOLOUD_FILTERS_PATH_DIR}/soloud_bassboostfilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_biquadresonantfilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_dcremovalfilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_echofilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_fftfilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_flangerfilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_lofifilter.cpp ) +source_group ("Filters" FILES ${SOLOUD_FILTERS_SOURCES}) +list(APPEND SOLOUD_SOURCES ${SOLOUD_FILTERS_SOURCES}) +############################################ +#Backends +############################################ +set(SOLOUD_BACKENDS_SOURCE_DIR ${SOLOUD_SOURCE_PATH_DIR}/backend) +set(SOLOUD_BACKENDS_SOURCES) -# Backends -set (BACKENDS_PATH ${SOURCE_PATH}/backend) -set (BACKENDS_SOURCES) +if(SOLOUD_ENABLE_BACKEND_NULL) -if (SOLOUD_BACKEND_NULL) - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/null/soloud_null.cpp - ) add_definitions(-DWITH_NULL) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/null/soloud_null.cpp) endif() -if (SOLOUD_BACKEND_SDL2) - find_package (SDL2 REQUIRED) - include_directories (${SDL2_INCLUDE_DIR}) - add_definitions (-DWITH_SDL2_STATIC) - - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/sdl2_static/soloud_sdl2_static.cpp - ) - - set (LINK_LIBRARIES - ${LINK_LIBRARIES} - ${SDL2_LIBRARY} - ) - -endif() if (SOLOUD_BACKEND_COREAUDIO) if (NOT APPLE) @@ -126,10 +133,7 @@ if (SOLOUD_BACKEND_COREAUDIO) add_definitions (-DWITH_COREAUDIO) - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/coreaudio/soloud_coreaudio.cpp - ) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/coreaudio/soloud_coreaudio.cpp) find_library (AUDIOTOOLBOX_FRAMEWORK AudioToolbox) set (LINK_LIBRARIES @@ -142,10 +146,7 @@ endif() if (SOLOUD_BACKEND_OPENSLES) add_definitions (-DWITH_OPENSLES) - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/opensles/soloud_opensles.cpp - ) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/opensles/soloud_opensles.cpp) find_library (OPENSLES_LIBRARY OpenSLES) set (LINK_LIBRARIES @@ -157,67 +158,34 @@ endif() if (SOLOUD_BACKEND_XAUDIO2) add_definitions (-DWITH_XAUDIO2) - - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/xaudio2/soloud_xaudio2.cpp - ) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/xaudio2/soloud_xaudio2.cpp) endif() if (SOLOUD_BACKEND_WINMM) add_definitions (-DWITH_WINMM) - - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/winmm/soloud_winmm.cpp - ) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/winmm/soloud_winmm.cpp) endif() if (SOLOUD_BACKEND_WASAPI) add_definitions (-DWITH_WASAPI) - - set (BACKENDS_SOURCES - ${BACKENDS_SOURCES} - ${BACKENDS_PATH}/wasapi/soloud_wasapi.cpp - ) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/wasapi/soloud_wasapi.cpp) endif() -# Filters -set (FILTERS_PATH ${SOURCE_PATH}/filter) -set (FILTERS_SOURCES - ${FILTERS_PATH}/soloud_bassboostfilter.cpp - ${FILTERS_PATH}/soloud_biquadresonantfilter.cpp - ${FILTERS_PATH}/soloud_dcremovalfilter.cpp - ${FILTERS_PATH}/soloud_echofilter.cpp - ${FILTERS_PATH}/soloud_fftfilter.cpp - ${FILTERS_PATH}/soloud_flangerfilter.cpp - ${FILTERS_PATH}/soloud_lofifilter.cpp -) - -# All together -source_group ("Includes" FILES ${TARGET_HEADERS}) -source_group ("Core" FILES ${CORE_SOURCES}) -source_group ("Audiosources" FILES ${AUDIOSOURCES_SOURCES}) -source_group ("Backends" FILES ${BACKENDS_SOURCES}) -source_group ("Filters" FILES ${FILTERS_SOURCES}) +if (SOLOUD_BACKEND_SDL2) + find_package (SDL2 REQUIRED) + # target_include_directories(${TARGET_NAME} PUBLIC ${SDL2_INCLUDE_DIR}) + # target_compile_definitions(${TARGET_NAME} PUBLIC WITH_SDL2_STATIC=1) + # target_link_libraries(${TARGET_NAME} PUBLIC ${SDL2_LIBRARY}) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/sdl2_static/soloud_sdl2_static.cpp) +endif() -set (TARGET_SOURCES - ${CORE_SOURCES} - ${AUDIOSOURCES_SOURCES} - ${BACKENDS_SOURCES} - ${FILTERS_SOURCES} -) -if (SOLOUD_DYNAMIC) - add_library(${TARGET_NAME} ${TARGET_SOURCES}) -endif () +source_group ("Backends" FILES ${SOLOUD_BACKENDS_SOURCES}) +list(APPEND SOLOUD_SOURCES ${SOLOUD_BACKENDS_SOURCES}) +apply_to_soloud_libraries(target_sources ${SOLOUD_SOURCES}) -if (SOLOUD_STATIC) - add_library(${TARGET_NAME} STATIC ${TARGET_SOURCES}) -endif() -target_link_libraries (${TARGET_NAME} ${LINK_LIBRARIES}) +target_link_libraries (${TARGET_NAME} PUBLIC ${LINK_LIBRARIES}) +target_include_directories(${TARGET_NAME} PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) -include (Install) -INSTALL(FILES ${TARGET_HEADERS} DESTINATION include/${TARGET_NAME}) From 96f387aa3b9718b18acf17c8a30477c835e86fc8 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 21:28:06 -0700 Subject: [PATCH 02/15] cmake demos work --- contrib/CMakeLists.txt | 10 +++-- contrib/demos.cmake | 78 ++++++++++++++++++++++++++++++++--- contrib/src.cmake | 94 ++++++++++++++++++++++++++---------------- 3 files changed, 138 insertions(+), 44 deletions(-) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 8dd5ca8e..dc13638a 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -1,7 +1,8 @@ cmake_minimum_required (VERSION 3.0) project (SoLoud) -set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") +#set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set (CMAKE_POSITION_INDEPENDENT_CODE ON) include (OptionDependentOnPackage) @@ -14,15 +15,18 @@ option (SOLOUD_STATIC "Set to ON to build static SoLoud" ON) print_option_status (SOLOUD_STATIC "Build static library") # TODO: -option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) +option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" ON) print_option_status (SOLOUD_BUILD_DEMOS "Build demos") option (SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" ON) print_option_status (SOLOUD_ENABLE_BACKEND_NULL "NULL backend") -option (SOLOUD_BACKEND_SDL2 "Set to ON for building SDL2 backend" OFF) +option (SOLOUD_ENABLE_BACKEND_SDL2 "Set to ON for building SDL2 backend" ON) print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") +option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" ON) +print_option_status (SOLOUD_ENABLE_BACKEND_ALSA "ALSA backend") + option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") diff --git a/contrib/demos.cmake b/contrib/demos.cmake index 594849f8..2b8a902d 100644 --- a/contrib/demos.cmake +++ b/contrib/demos.cmake @@ -2,16 +2,82 @@ set(SOLOUD_DEMO_DIRECTORY ${SOLOUD_ROOT_DIRECTORY}/demos) ############################## -#Simplest Demo +#Backing libraries for Demo ############################## -set(SOLOUD_DEMO_SIMPLEST_SOURCES ${SOLOUD_DEMO_DIRECTORY}/simplest/main.cpp) -add_executable(simplest ${SOLOUD_DEMO_SIMPLEST_SOURCES}) +set(SOLOUD_DEMO_COMMON ${SOLOUD_DEMO_DIRECTORY}/common) + +find_package(OpenGL) + +set(SOLOUD_DEMO_GLEW_DIR ${SOLOUD_DEMO_COMMON}/glew/GL) +set(SOLOUD_DEMO_GLEW_SOURCES + ${SOLOUD_DEMO_GLEW_DIR}/glew.c + ${SOLOUD_DEMO_GLEW_DIR}/glew.h + ${SOLOUD_DEMO_GLEW_DIR}/glxew.h + ${SOLOUD_DEMO_GLEW_DIR}/wglew.h +) +add_library(soloud-demo-glew STATIC ${SOLOUD_DEMO_GLEW_SOURCES}) + +set(SOLOUD_DEMO_IMGUI_DIR ${SOLOUD_DEMO_COMMON}/imgui) +set(SOLOUD_IMGUI_SOURCES + ${SOLOUD_DEMO_IMGUI_DIR}/imconfig.h + ${SOLOUD_DEMO_IMGUI_DIR}/imgui.cpp + ${SOLOUD_DEMO_IMGUI_DIR}/imgui_demo.cpp + ${SOLOUD_DEMO_IMGUI_DIR}/imgui_draw.cpp + ${SOLOUD_DEMO_IMGUI_DIR}/imgui.h + ${SOLOUD_DEMO_IMGUI_DIR}/imgui_internal.h + ${SOLOUD_DEMO_IMGUI_DIR}/stb_rect_pack.h + ${SOLOUD_DEMO_IMGUI_DIR}/stb_textedit.h + ${SOLOUD_DEMO_IMGUI_DIR}/stb_truetype.h + ) +add_library(soloud-imgui STATIC ${SOLOUD_IMGUI_SOURCES}) +target_include_directories(soloud-imgui PUBLIC ${SOLOUD_DEMO_COMMON}/imgui) + + +set(SOLOUD_DEMO_FRAMEWORK_SOURCES + ${SOLOUD_DEMO_COMMON}/soloud_demo_framework.cpp + ${SOLOUD_DEMO_COMMON}/soloud_demo_framework.h + ${SOLOUD_DEMO_COMMON}/stb_image.h + ) +add_library(soloud-demo-framework STATIC ${SOLOUD_DEMO_FRAMEWORK_SOURCES}) +target_include_directories(soloud-demo-framework PUBLIC ${SOLOUD_DEMO_COMMON}) +target_link_libraries(soloud-demo-framework PUBLIC soloud-imgui soloud-demo-glew OpenGL::GL) + +############################## +#Demo +############################## + +#Simplest +add_executable(simplest ${SOLOUD_DEMO_DIRECTORY}/simplest/main.cpp) target_link_libraries(simplest PUBLIC soloud) +#C API test +add_executable(ctest ${SOLOUD_DEMO_DIRECTORY}/c_test/main.c) +target_link_libraries(ctest PUBLIC soloud) + +#Welcome test +add_executable(welcome ${SOLOUD_DEMO_DIRECTORY}/welcome/main.cpp) +target_link_libraries(welcome PUBLIC soloud) -#set(SOLOUD_DEMO_CTEST_SOURCES ${SOLOUD_DEMO_DIRECTORY}/c_test/main.c) -#add_executable(ctest ${SOLOUD_DEMO_CTEST_SOURCES}) -#target_link_libraries(ctest PUBLIC soloud) +#MegaDemo +set(SOLOUD_DEMO_MEGADEMO_SOURCE_DIR ${SOLOUD_DEMO_DIRECTORY}/megademo) +set(SOLOUD_DEMO_MEGADEMO_SOURCES + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/3dtest.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/main.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/mixbusses.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/monotone.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/multimusic.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/pewpew.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/radiogaga.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/space.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/speechfilter.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/tedsid.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/virtualvoices.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/wavformats.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/speakers.cpp + ${SOLOUD_DEMO_MEGADEMO_SOURCE_DIR}/thebutton.cpp +) +add_executable(megademo ${SOLOUD_DEMO_MEGADEMO_SOURCES}) +target_link_libraries(megademo PUBLIC soloud soloud-demo-framework) # set (HEADER_PATH ../include) # set (SOURCE_PATH ../demos) diff --git a/contrib/src.cmake b/contrib/src.cmake index 3c0ab42d..216ef7d4 100644 --- a/contrib/src.cmake +++ b/contrib/src.cmake @@ -15,52 +15,53 @@ set(SOLOUD_SOURCES) ###################################### #Core ###################################### +set(SOLOUD_CORE_SOURCE_DIR ${SOLOUD_SOURCE_PATH_DIR}/core) set(SOLOUD_CORE_SOURCES ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_audiosource.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_audiosource.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_audiosource.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_bassboostfilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_biquadresonantfilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_bus.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_bus.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_bus.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_c.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_3d.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_basicops.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_faderops.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_filterops.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_getters.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_setters.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_voicegroup.cpp - ${SOLOUD_SOURCE_PATH_DIR}/soloud_core_voiceops.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_3d.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_basicops.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_faderops.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_filterops.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_getters.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_setters.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_voicegroup.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_core_voiceops.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_dcremovalfilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_echofilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_error.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fader.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_fader.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_fader.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fft.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_fft.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_fft.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_fftfilter.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_fft_lut.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_fft_lut.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_file.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_file.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file_hack_off.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_file_hack_on.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_filter.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_filter.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_filter.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_flangerfilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_internal.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_lofifilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_monotone.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_openmpt.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_queue.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_queue.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_queue.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_robotizefilter.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_sfxr.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_speech.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_tedsid.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_thread.h - ${SOLOUD_SOURCE_PATH_DIR}/soloud_thread.cpp + ${SOLOUD_CORE_SOURCE_DIR}/soloud_thread.cpp ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_vic.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_vizsn.h ${SOLOUD_PUBLIC_HEADERS_DIR}/soloud_wav.h @@ -100,7 +101,7 @@ list(APPEND SOLOUD_SOURCES ${SOLOUD_AUDIOSOURCES_SOURCES}) ###################################### #Filters ###################################### -set (SOLOUD_FILTERS_PATH_DIR ${SOURCE_PATH}/filter) +set (SOLOUD_FILTERS_PATH_DIR ${SOLOUD_SOURCE_PATH_DIR}/filter) set (SOLOUD_FILTERS_SOURCES ${SOLOUD_FILTERS_PATH_DIR}/soloud_bassboostfilter.cpp ${SOLOUD_FILTERS_PATH_DIR}/soloud_biquadresonantfilter.cpp @@ -109,10 +110,22 @@ set (SOLOUD_FILTERS_SOURCES ${SOLOUD_FILTERS_PATH_DIR}/soloud_fftfilter.cpp ${SOLOUD_FILTERS_PATH_DIR}/soloud_flangerfilter.cpp ${SOLOUD_FILTERS_PATH_DIR}/soloud_lofifilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_robotizefilter.cpp + ${SOLOUD_FILTERS_PATH_DIR}/soloud_waveshaperfilter.cpp ) source_group ("Filters" FILES ${SOLOUD_FILTERS_SOURCES}) list(APPEND SOLOUD_SOURCES ${SOLOUD_FILTERS_SOURCES}) +############################################ +#C API +############################################ +set(SOLOUD_C_API_SOURCE_DIR ${SOLOUD_SOURCE_PATH_DIR}/c_api) +set(SOLOUD_C_API_SOURCES + ${SOLOUD_C_API_SOURCE_DIR}/soloud_c.cpp + ) +source_group("C API" FILES ${SOLOUD_C_API_SOURCES}) +list(APPEND SOLOUD_SOURCES ${SOLOUD_C_API_SOURCES}) + ############################################ #Backends ############################################ @@ -120,16 +133,33 @@ set(SOLOUD_BACKENDS_SOURCE_DIR ${SOLOUD_SOURCE_PATH_DIR}/backend) set(SOLOUD_BACKENDS_SOURCES) if(SOLOUD_ENABLE_BACKEND_NULL) - - add_definitions(-DWITH_NULL) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/null/soloud_null.cpp) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_NULL=1) +endif() + +if(SOLOUD_ENABLE_BACKEND_SDL2) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/sdl2_static/soloud_sdl2_static.cpp) + + find_package (SDL2 REQUIRED) + apply_to_soloud_libraries(target_include_directories PUBLIC ${SDL2_INCLUDE_DIR}) + apply_to_soloud_libraries(target_link_libraries PUBLIC ${SDL2_LIBRARY}) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_SDL2_STATIC=1) +endif() + +if(SOLOUD_ENABLE_BACKEND_ALSA) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/alsa/soloud_alsa.cpp) + find_package(ALSA REQUIRED) + apply_to_soloud_libraries(target_include_directories PUBLIC ${ALSA_INCLUDE_DIRS}) + apply_to_soloud_libraries(target_link_libraries PUBLIC ${ALSA_LIBRARIES}) + + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_ALSA=1) endif() if (SOLOUD_BACKEND_COREAUDIO) - if (NOT APPLE) - message (FATAL_ERROR "CoreAudio backend can be enabled only on Apple!") - endif () + if(NOT APPLE) + message(FATAL_ERROR "CoreAudio backend can be enabled only on Apple!") + endif() add_definitions (-DWITH_COREAUDIO) @@ -172,20 +202,14 @@ if (SOLOUD_BACKEND_WASAPI) endif() -if (SOLOUD_BACKEND_SDL2) - find_package (SDL2 REQUIRED) - # target_include_directories(${TARGET_NAME} PUBLIC ${SDL2_INCLUDE_DIR}) - # target_compile_definitions(${TARGET_NAME} PUBLIC WITH_SDL2_STATIC=1) - # target_link_libraries(${TARGET_NAME} PUBLIC ${SDL2_LIBRARY}) - list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/sdl2_static/soloud_sdl2_static.cpp) -endif() - source_group ("Backends" FILES ${SOLOUD_BACKENDS_SOURCES}) list(APPEND SOLOUD_SOURCES ${SOLOUD_BACKENDS_SOURCES}) -apply_to_soloud_libraries(target_sources ${SOLOUD_SOURCES}) +#Apply the source filess +apply_to_soloud_libraries(target_sources PUBLIC ${SOLOUD_SOURCES}) +apply_to_soloud_libraries(target_include_directories PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) -target_link_libraries (${TARGET_NAME} PUBLIC ${LINK_LIBRARIES}) -target_include_directories(${TARGET_NAME} PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) +# target_link_libraries (${TARGET_NAME} PUBLIC ${LINK_LIBRARIES}) +# target_include_directories(${TARGET_NAME} PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) From 4bc3288fc2680167d5443cf0fd35bdc7e4929121 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 21:46:25 -0700 Subject: [PATCH 03/15] Added piano and other demos --- contrib/CMakeLists.txt.user | 191 ------------------------------------ contrib/demos.cmake | 68 +++++-------- 2 files changed, 25 insertions(+), 234 deletions(-) delete mode 100644 contrib/CMakeLists.txt.user diff --git a/contrib/CMakeLists.txt.user b/contrib/CMakeLists.txt.user deleted file mode 100644 index 44382ded..00000000 --- a/contrib/CMakeLists.txt.user +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - EnvironmentId - {af0185a3-201a-4f6b-8226-4757c69239b2} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - false - true - false - 0 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - Builtin.BuildSystem - - true - true - Builtin.DefaultTidyAndClazy - 16 - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop - Desktop - {50604b53-b979-42df-8f68-eb2479760347} - 0 - 0 - 0 - - Debug - -GUnix Makefiles --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - /home/brad/dev/rush/soloud/build-contrib-Desktop-Debug - - - -j 30 - - all - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - clean - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - simplest - CMakeProjectManager.CMakeRunConfiguration.simplest - simplest - false - true - true - false - true - /home/brad/dev/rush/soloud/build-contrib-Desktop-Debug - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/contrib/demos.cmake b/contrib/demos.cmake index 2b8a902d..50de2b8e 100644 --- a/contrib/demos.cmake +++ b/contrib/demos.cmake @@ -16,6 +16,7 @@ set(SOLOUD_DEMO_GLEW_SOURCES ${SOLOUD_DEMO_GLEW_DIR}/wglew.h ) add_library(soloud-demo-glew STATIC ${SOLOUD_DEMO_GLEW_SOURCES}) +target_include_directories(soloud-demo-glew PUBLIC ${SOLOUD_DEMO_COMMON}/glew) set(SOLOUD_DEMO_IMGUI_DIR ${SOLOUD_DEMO_COMMON}/imgui) set(SOLOUD_IMGUI_SOURCES @@ -43,7 +44,7 @@ target_include_directories(soloud-demo-framework PUBLIC ${SOLOUD_DEMO_COMMON}) target_link_libraries(soloud-demo-framework PUBLIC soloud-imgui soloud-demo-glew OpenGL::GL) ############################## -#Demo +#Demos ############################## #Simplest @@ -54,10 +55,32 @@ target_link_libraries(simplest PUBLIC soloud) add_executable(ctest ${SOLOUD_DEMO_DIRECTORY}/c_test/main.c) target_link_libraries(ctest PUBLIC soloud) -#Welcome test +#Welcome add_executable(welcome ${SOLOUD_DEMO_DIRECTORY}/welcome/main.cpp) target_link_libraries(welcome PUBLIC soloud) +#env +add_executable(env ${SOLOUD_DEMO_DIRECTORY}/env/main.cpp) +target_link_libraries(env PUBLIC soloud soloud-demo-framework) + +#null +add_executable(null ${SOLOUD_DEMO_DIRECTORY}/null/main.cpp) +target_link_libraries(null PUBLIC soloud) + +#piana +set(SOLOUD_DEMO_PIANO_SOURCE_DIR ${SOLOUD_DEMO_DIRECTORY}/piano) +set(SOLOUD_DEMO_PIANO_SOURCES + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/main.cpp + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/RtMidi.cpp + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/RtMidi.h + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/soloud_basicwave.cpp + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/soloud_basicwave.h + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/soloud_padsynth.cpp + ${SOLOUD_DEMO_PIANO_SOURCE_DIR}/soloud_padsynth.h + ) +add_executable(piano ${SOLOUD_DEMO_PIANO_SOURCES}) +target_link_libraries(piano PUBLIC soloud soloud-demo-framework) + #MegaDemo set(SOLOUD_DEMO_MEGADEMO_SOURCE_DIR ${SOLOUD_DEMO_DIRECTORY}/megademo) set(SOLOUD_DEMO_MEGADEMO_SOURCES @@ -78,44 +101,3 @@ set(SOLOUD_DEMO_MEGADEMO_SOURCES ) add_executable(megademo ${SOLOUD_DEMO_MEGADEMO_SOURCES}) target_link_libraries(megademo PUBLIC soloud soloud-demo-framework) - -# set (HEADER_PATH ../include) -# set (SOURCE_PATH ../demos) - -# function (soloud_add_demo name sources) -# set (TARGET_NAME SoLoud_${name}) -# add_executable (${TARGET_NAME} ${sources}) -# target_link_libraries (${TARGET_NAME} soloud) -# include (Install) -# endfunction() - -# include_directories (${SOURCE_PATH}/common) -# include_directories (${SOURCE_PATH}/common/imgui) - - -# # soloud_add_demo(c_test ${SOURCE_PATH}/c_test/main.c) -# soloud_add_demo(enumerate ${SOURCE_PATH}/enumerate/main.cpp) -# # soloud_add_demo(env ${SOURCE_PATH}/env/main.cpp) -# # soloud_add_demo(megademo -# # ${SOURCE_PATH}/megademo/3dtest.cpp -# # ${SOURCE_PATH}/megademo/main.cpp -# # ${SOURCE_PATH}/megademo/mixbusses.cpp -# # ${SOURCE_PATH}/megademo/monotone.cpp -# # ${SOURCE_PATH}/megademo/multimusic.cpp -# # ${SOURCE_PATH}/megademo/pewpew.cpp -# # ${SOURCE_PATH}/megademo/radiogaga.cpp -# # ${SOURCE_PATH}/megademo/space.cpp -# # ${SOURCE_PATH}/megademo/speechfilter.cpp -# # ${SOURCE_PATH}/megademo/tedsid.cpp -# # ${SOURCE_PATH}/megademo/virtualvoices.cpp -# # ) -# soloud_add_demo(null ${SOURCE_PATH}/null/main.cpp) -# # soloud_add_demo(piano -# # ${SOURCE_PATH}/piano/main.cpp -# # ${SOURCE_PATH}/piano/soloud_basicwave.cpp -# # ${SOURCE_PATH}/piano/soloud_padsynth.cpp -# # ) -# soloud_add_demo(simplest ${SOURCE_PATH}/simplest/main.cpp) -# soloud_add_demo(welcome ${SOURCE_PATH}/welcome/main.cpp) - - From 679c91af851c863e0477b67f20a753e7c60ac158 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 21:54:39 -0700 Subject: [PATCH 04/15] Ignore cmakelists.txt.user files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 08319ee3..0208e9ab 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ scripts/soloud_codegen.py glue/rpgmaker_soloud.rb *.lastcodeanalysissucceeded *.bak +CMakeLists.txt.user From d981c790b206833b721b51294bdd5cf638186245 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 21:55:40 -0700 Subject: [PATCH 05/15] Allow for custom window sizes --- demos/common/soloud_demo_framework.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/demos/common/soloud_demo_framework.cpp b/demos/common/soloud_demo_framework.cpp index 826dcd2f..7e9b5517 100644 --- a/demos/common/soloud_demo_framework.cpp +++ b/demos/common/soloud_demo_framework.cpp @@ -53,6 +53,9 @@ #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" +const int cgWindowWidth = 800; +const int cgWindowsHeight = 400; + int gPressed[256], gWasPressed[256]; int gMouseX = 0; int gMouseY = 0; @@ -550,7 +553,7 @@ void UpdateImGui() ImGuiIO& io = ImGui::GetIO(); // Setup resolution (every frame to accommodate for window resizing) - io.DisplaySize = ImVec2((float)800, (float)400); + io.DisplaySize = ImVec2((float)cgWindowWidth, (float)cgWindowsHeight); // Setup time step static double time = 0.0f; @@ -609,8 +612,8 @@ void DemoInit() "", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - 800, - 400, + cgWindowWidth, + cgWindowsHeight, flags); SDL_GLContext glcontext = SDL_GL_CreateContext(gSDLWindow); @@ -618,7 +621,7 @@ void DemoInit() SDL_GL_SetSwapInterval(1); - glViewport(0, 0, 800, 400); + glViewport(0, 0, cgWindowWidth, cgWindowsHeight); // set window title SDL_SetWindowTitle(gSDLWindow, "http://soloud-audio.com"); @@ -714,7 +717,7 @@ void DemoUpdateStart() } glClearColor(0.2f, 0.2f, 0.4f, 0); glClear(GL_COLOR_BUFFER_BIT); - DemoTexQuad(desktop_tex, 0, 0, 800, 400); + DemoTexQuad(desktop_tex, 0, 0, cgWindowWidth, cgWindowsHeight); UpdateImGui(); gMouseX = gUIState.mousex; From f7c410d8c8994a8116af77f973a5d8dc37903030 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Thu, 8 Jun 2023 23:55:58 -0700 Subject: [PATCH 06/15] allow dynamic vs static building --- contrib/CMakeLists.txt | 4 ++-- contrib/src.cmake | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index dc13638a..665a909f 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -18,13 +18,13 @@ print_option_status (SOLOUD_STATIC "Build static library") option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" ON) print_option_status (SOLOUD_BUILD_DEMOS "Build demos") -option (SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" ON) +option (SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" OFF) print_option_status (SOLOUD_ENABLE_BACKEND_NULL "NULL backend") option (SOLOUD_ENABLE_BACKEND_SDL2 "Set to ON for building SDL2 backend" ON) print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") -option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" ON) +option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" OFF) print_option_status (SOLOUD_ENABLE_BACKEND_ALSA "ALSA backend") option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) diff --git a/contrib/src.cmake b/contrib/src.cmake index 216ef7d4..67609677 100644 --- a/contrib/src.cmake +++ b/contrib/src.cmake @@ -2,12 +2,21 @@ set(SOLOUD_PUBLIC_HEADERS_DIR ${SOLOUD_ROOT_DIRECTORY}/include) set(SOLOUD_SOURCE_PATH_DIR ${SOLOUD_ROOT_DIRECTORY}/src) #Stub the existence of the libraries -add_library(soloud STATIC) -add_library(soloud-dynamic SHARED) +if(SOLOUD_STATIC) + add_library(soloud STATIC) +endif() + +if(SOLOUD_DYNAMIC) + add_library(soloud-dynamic SHARED) +endif() function(apply_to_soloud_libraries FUNCTION_NAME) +if(SOLOUD_STATIC) cmake_language(CALL ${FUNCTION_NAME} soloud ${ARGN}) +endif() +if(SOLOUD_DYNAMIC) cmake_language(CALL ${FUNCTION_NAME} soloud-dynamic ${ARGN}) +endif() endfunction() set(LINK_LIBRARIES) From 27ae78512a69949405a515809309d424e0b8f6a2 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Sat, 10 Jun 2023 22:47:25 -0700 Subject: [PATCH 07/15] Removed install target --- contrib/CMakeLists.txt | 75 +++++++++++++++---------------- contrib/cmake/FindOpenSLES.cmake | 28 ++++++++++++ contrib/cmake/Install.cmake | 22 --------- contrib/cmake/InstallExport.cmake | 38 ---------------- contrib/demos.cmake | 1 + contrib/src.cmake | 64 ++++++++++---------------- 6 files changed, 89 insertions(+), 139 deletions(-) create mode 100644 contrib/cmake/FindOpenSLES.cmake delete mode 100644 contrib/cmake/Install.cmake delete mode 100644 contrib/cmake/InstallExport.cmake diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 665a909f..e8ec8d7c 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -1,67 +1,64 @@ cmake_minimum_required (VERSION 3.0) -project (SoLoud) +project(SoLoud) -#set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -set (CMAKE_POSITION_INDEPENDENT_CODE ON) -include (OptionDependentOnPackage) -include (PrintOptionStatus) +include(OptionDependentOnPackage) +include(PrintOptionStatus) -option (SOLOUD_DYNAMIC "Set to ON to build dynamic SoLoud" OFF) +option(SOLOUD_DYNAMIC "Set to ON to build dynamic SoLoud" OFF) print_option_status (SOLOUD_DYNAMIC "Build dynamic library") -option (SOLOUD_STATIC "Set to ON to build static SoLoud" ON) +option(SOLOUD_STATIC "Set to ON to build static SoLoud" ON) print_option_status (SOLOUD_STATIC "Build static library") -# TODO: -option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" ON) -print_option_status (SOLOUD_BUILD_DEMOS "Build demos") +option(SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) +option(SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" ON) +option(SOLOUD_ENABLE_BACKEND_SDL2 "Set to ON for building SDL2 backend" OFF) +option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" OFF) +option(SOLOUD_ENABLE_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) +option(SOLOUD_ENABLE_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) +option(SOLOUD_ENABLE_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) +option(SOLOUD_ENABLE_BACKEND_WINMM "Set to ON for building WINMM backend" OFF) +option(SOLOUD_ENABLE_BACKEND_WASAPI "Set to ON for building WASAPI backend" OFF) +option(SOLOUD_AUTO_DETECT_BACKENDS "Attempt to enable backends based on what is available" ON) + +if(SOLOUD_AUTO_DETECT_BACKENDS) + find_package(SDL2) + set(SOLOUD_ENABLE_BACKEND_SDL2 ${SDL2_FOUND}) + find_package(ALSA) + set(SOLOUD_ENABLE_BACKEND_ALSA ${ALSA_FOUND}) + + if(APPLE) + set(SOLOUD_BACKEND_COREAUDIO ON) + endif() + + find_package(OpenSLES) + set(SOLOUD_ENABLE_BACKEND_OPENSLES ${OPENSLES_FOUND}) +endif() + +if(SOLOUD_BUILD_DEMOS) + set(SOLOUD_STATIC ON) +endif() -option (SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" OFF) +print_option_status (SOLOUD_BUILD_DEMOS "Build demos") +print_option_status (SOLOUD_AUTO_DETECT_BACKENDS "Auto Detect Backends") print_option_status (SOLOUD_ENABLE_BACKEND_NULL "NULL backend") - -option (SOLOUD_ENABLE_BACKEND_SDL2 "Set to ON for building SDL2 backend" ON) print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") - -option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" OFF) print_option_status (SOLOUD_ENABLE_BACKEND_ALSA "ALSA backend") - -option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") - -option (SOLOUD_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) print_option_status (SOLOUD_BACKEND_OPENSLES "OpenSLES backend") - -option (SOLOUD_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) print_option_status (SOLOUD_BACKEND_XAUDIO2 "XAudio2 backend") - -option (SOLOUD_BACKEND_WINMM "Set to ON for building WINMM backend" OFF) print_option_status (SOLOUD_BACKEND_WINMM "WINMM backend") - -option (SOLOUD_BACKEND_WASAPI "Set to ON for building WASAPI backend" OFF) print_option_status (SOLOUD_BACKEND_WASAPI "WASAPI backend") #Establish some basic mappings to filesystem directories get_filename_component(SOLOUD_ROOT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE) -#INCLUDE (InstallIncludes.cmake) -#INCLUDE (InstallStaticData.cmake) - -if (UNIX AND NOT WIN32 AND NOT APPLE) - if (CMAKE_SIZEOF_VOID_P MATCHES "8") - set (LIB_POSTFIX "64" CACHE STRING "suffix for 32/64 dir placement") - mark_as_advanced (LIB_POSTFIX) - endif () -endif () -if (NOT DEFINED LIB_POSTFIX) - set (LIB_POSTFIX "") -endif () - include (src.cmake) # Demos -IF (SOLOUD_BUILD_DEMOS) +if(SOLOUD_BUILD_DEMOS) include (demos.cmake) endif () diff --git a/contrib/cmake/FindOpenSLES.cmake b/contrib/cmake/FindOpenSLES.cmake new file mode 100644 index 00000000..e27539a7 --- /dev/null +++ b/contrib/cmake/FindOpenSLES.cmake @@ -0,0 +1,28 @@ +# - Find OpenSLES +# Find the OpenSLES includes and libraries +# +# OPENSLES_INCLUDE_DIR - where to find dsound.h +# OPENSLES_LIBRARIES - List of libraries when using dsound. +# OPENSLES_FOUND - True if dsound found. + +get_property(_FIND_LIBRARY_USE_LIB64_PATHS GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS) +set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS 1) + +find_path(OpenSLES_INCLUDE_DIR SLES/OpenSLES.h) +find_library(OpenSLES_LIBRARY NAMES OpenSLES) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenSLES DEFAULT_MSG OpenSLES_INCLUDE_DIR OpenSLES_LIBRARY) + +if(OpenSLES_FOUND) + set(OpenSLES_INCLUDE_DIRS ${OPENSLES_INCLUDE_DIR}) + set(OpenSLES_LIBRARIES ${OPENSLES_LIBRARY}) +else(OpenSLES_FOUND) + if (OpenSLES_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find OPENSLES") + endif() +endif(OpenSLES_FOUND) + +mark_as_advanced(OpenSLES_INCLUDE_DIR OpenSLES_LIBRARY) + +set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${_FIND_LIBRARY_USE_LIB64_PATHS}) diff --git a/contrib/cmake/Install.cmake b/contrib/cmake/Install.cmake deleted file mode 100644 index bc2d6527..00000000 --- a/contrib/cmake/Install.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# Required Vars: -# ${TARGET_NAME} - -SET (INSTALL_BINDIR bin) -IF(WIN32) - SET(INSTALL_LIBDIR bin) - SET(INSTALL_ARCHIVEDIR lib) -ELSE(WIN32) - SET(INSTALL_LIBDIR lib${LIB_POSTFIX}) - SET(INSTALL_ARCHIVEDIR lib${LIB_POSTFIX}) -ENDIF(WIN32) - -SET (PROJECT_NAME_LOWERCASE) -STRING (TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE) -INSTALL ( - TARGETS ${TARGET_NAME} - EXPORT ${PROJECT_NAME_LOWERCASE}-config - RUNTIME DESTINATION ${INSTALL_BINDIR} - BUNDLE DESTINATION ${INSTALL_BINDIR} - LIBRARY DESTINATION ${INSTALL_LIBDIR} - ARCHIVE DESTINATION ${INSTALL_ARCHIVEDIR} -) diff --git a/contrib/cmake/InstallExport.cmake b/contrib/cmake/InstallExport.cmake deleted file mode 100644 index a9fa0a8a..00000000 --- a/contrib/cmake/InstallExport.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# Installs export targets (i.e. cmake config files) into location -# specified for OS. -# Installs ${PROJECT_NAME}-SetThirdParties.cmake too if such file -# is found in ${PROJECT_SOURCE_DIR}. - -SET (EV_CMAKE_EXPORT_DIR share/${PROJECT_NAME}/cmake) - -IF (WIN32) - SET (EV_CMAKE_EXPORT_DIR cmake) -ENDIF () - -SET (PROJECT_NAME_LOWERCASE) -STRING (TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE) -INSTALL ( - EXPORT ${PROJECT_NAME_LOWERCASE}-config - DESTINATION ${EV_CMAKE_EXPORT_DIR} -) - -SET (EV_STP_FILENAME ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}-SetThirdParties.cmake) -IF (EXISTS ${EV_STP_FILENAME}) - INSTALL ( - FILES ${EV_STP_FILENAME} - DESTINATION ${EV_CMAKE_EXPORT_DIR} - ) -ENDIF () - -SET (EV_SETTINGS_FILENAME ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}-Settings.cmake) -IF (NOT EXISTS ${EV_SETTINGS_FILENAME}) - # This file may be configured => it placed in binary dir - SET (EV_SETTINGS_FILENAME ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-Settings.cmake) -ENDIF () - -IF (EXISTS ${EV_SETTINGS_FILENAME}) - INSTALL ( - FILES ${EV_SETTINGS_FILENAME} - DESTINATION ${EV_CMAKE_EXPORT_DIR} - ) -ENDIF () diff --git a/contrib/demos.cmake b/contrib/demos.cmake index 50de2b8e..b7a31424 100644 --- a/contrib/demos.cmake +++ b/contrib/demos.cmake @@ -6,6 +6,7 @@ set(SOLOUD_DEMO_DIRECTORY ${SOLOUD_ROOT_DIRECTORY}/demos) ############################## set(SOLOUD_DEMO_COMMON ${SOLOUD_DEMO_DIRECTORY}/common) +set(OpenGL_GL_PREFERENCE "GLVND") find_package(OpenGL) set(SOLOUD_DEMO_GLEW_DIR ${SOLOUD_DEMO_COMMON}/glew/GL) diff --git a/contrib/src.cmake b/contrib/src.cmake index 67609677..bbc6609b 100644 --- a/contrib/src.cmake +++ b/contrib/src.cmake @@ -5,21 +5,22 @@ set(SOLOUD_SOURCE_PATH_DIR ${SOLOUD_ROOT_DIRECTORY}/src) if(SOLOUD_STATIC) add_library(soloud STATIC) endif() - if(SOLOUD_DYNAMIC) add_library(soloud-dynamic SHARED) + set_target_properties(soloud-dynamic + PROPERTIES + POSITION_INDEPENDENT_CODE ON) endif() function(apply_to_soloud_libraries FUNCTION_NAME) -if(SOLOUD_STATIC) - cmake_language(CALL ${FUNCTION_NAME} soloud ${ARGN}) -endif() -if(SOLOUD_DYNAMIC) - cmake_language(CALL ${FUNCTION_NAME} soloud-dynamic ${ARGN}) -endif() + if(SOLOUD_STATIC) + cmake_language(CALL ${FUNCTION_NAME} soloud ${ARGN}) + endif() + if(SOLOUD_DYNAMIC) + cmake_language(CALL ${FUNCTION_NAME} soloud-dynamic ${ARGN}) + endif() endfunction() -set(LINK_LIBRARIES) set(SOLOUD_SOURCES) ###################################### #Core @@ -157,68 +158,51 @@ endif() if(SOLOUD_ENABLE_BACKEND_ALSA) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/alsa/soloud_alsa.cpp) + find_package(ALSA REQUIRED) apply_to_soloud_libraries(target_include_directories PUBLIC ${ALSA_INCLUDE_DIRS}) apply_to_soloud_libraries(target_link_libraries PUBLIC ${ALSA_LIBRARIES}) - apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_ALSA=1) endif() - -if (SOLOUD_BACKEND_COREAUDIO) +if (SOLOUD_ENABLE_BACKEND_COREAUDIO) if(NOT APPLE) message(FATAL_ERROR "CoreAudio backend can be enabled only on Apple!") endif() - add_definitions (-DWITH_COREAUDIO) - list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/coreaudio/soloud_coreaudio.cpp) find_library (AUDIOTOOLBOX_FRAMEWORK AudioToolbox) - set (LINK_LIBRARIES - ${LINK_LIBRARIES} - ${AUDIOTOOLBOX_FRAMEWORK} - ) + apply_to_soloud_libraries(target_link_libraries PUBLIC ${AUDIOTOOLBOX_FRAMEWORK}) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_COREAUDIO=1) endif() - -if (SOLOUD_BACKEND_OPENSLES) - add_definitions (-DWITH_OPENSLES) - +if (SOLOUD_ENABLE_BACKEND_OPENSLES) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/opensles/soloud_opensles.cpp) find_library (OPENSLES_LIBRARY OpenSLES) - set (LINK_LIBRARIES - ${LINK_LIBRARIES} - ${OPENSLES_LIBRARY} - ) + apply_to_soloud_libraries(target_link_libraries PUBLIC ${OPENSLES_LIBRARY}) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_OPENSLES=1) endif() - -if (SOLOUD_BACKEND_XAUDIO2) - add_definitions (-DWITH_XAUDIO2) +if (SOLOUD_ENABLE_BACKEND_XAUDIO2) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/xaudio2/soloud_xaudio2.cpp) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_XAUDIO2=1) endif() -if (SOLOUD_BACKEND_WINMM) - add_definitions (-DWITH_WINMM) +if (SOLOUD_ENABLE_BACKEND_WINMM) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/winmm/soloud_winmm.cpp) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_WINMM=1) endif() -if (SOLOUD_BACKEND_WASAPI) - add_definitions (-DWITH_WASAPI) +if (SOLOUD_ENABLE_BACKEND_WASAPI) list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/wasapi/soloud_wasapi.cpp) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_WASAPI=1) endif() - - source_group ("Backends" FILES ${SOLOUD_BACKENDS_SOURCES}) list(APPEND SOLOUD_SOURCES ${SOLOUD_BACKENDS_SOURCES}) -#Apply the source filess + +#Apply the source files apply_to_soloud_libraries(target_sources PUBLIC ${SOLOUD_SOURCES}) apply_to_soloud_libraries(target_include_directories PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) - - -# target_link_libraries (${TARGET_NAME} PUBLIC ${LINK_LIBRARIES}) -# target_include_directories(${TARGET_NAME} PUBLIC ${SOLOUD_ROOT_DIRECTORY}/include) - From a7562b6302dfa9acf26c16ad3a13b1ac04d773d4 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 15:37:45 -0700 Subject: [PATCH 08/15] Add to the authors file --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8f9a7e17..b9a255bf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,3 +28,4 @@ Danny Angelo Carminati Grein https://github.com/fungos Igor Ivanov https://github.com/laptabrok Matthew O'Connell https://github.com/matthew-oconnell Boris Carvajal https://github.com/BorisCarvajal +Bradley Clemetson https://github.com/bradc6 \ No newline at end of file From fbd8d10af7b25ef034cbb0ec3cd12963845a2830 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 16:22:43 -0700 Subject: [PATCH 09/15] Pipewire now plays with a basic tone --- contrib/CMakeLists.txt | 4 + contrib/cmake/FindPipeWire.cmake | 122 ++++++++++++++++++ contrib/src.cmake | 8 ++ include/soloud.h | 7 +- include/soloud_c.h | 3 +- include/soloud_internal.h | 5 +- src/backend/pipewire/soloud_pipewire.cpp | 154 +++++++++++++++++++++++ src/core/soloud.cpp | 19 +++ 8 files changed, 317 insertions(+), 5 deletions(-) create mode 100644 contrib/cmake/FindPipeWire.cmake create mode 100644 src/backend/pipewire/soloud_pipewire.cpp diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index e8ec8d7c..d010f860 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -16,6 +16,7 @@ option(SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) option(SOLOUD_ENABLE_BACKEND_NULL "Set to ON for building NULL backend" ON) option(SOLOUD_ENABLE_BACKEND_SDL2 "Set to ON for building SDL2 backend" OFF) option(SOLOUD_ENABLE_BACKEND_ALSA "Set to ON for building the ALSA backend" OFF) +option(SOLOUD_ENABLE_BACKEND_PIPEWIRE "Set to ON for building PIPEWIRE backend" OFF) option(SOLOUD_ENABLE_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) option(SOLOUD_ENABLE_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) option(SOLOUD_ENABLE_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) @@ -28,6 +29,8 @@ if(SOLOUD_AUTO_DETECT_BACKENDS) set(SOLOUD_ENABLE_BACKEND_SDL2 ${SDL2_FOUND}) find_package(ALSA) set(SOLOUD_ENABLE_BACKEND_ALSA ${ALSA_FOUND}) + find_package(PipeWire) + set(SOLOUD_ENABLE_BACKEND_PIPEWIRE ${PipeWire_FOUND}) if(APPLE) set(SOLOUD_BACKEND_COREAUDIO ON) @@ -46,6 +49,7 @@ print_option_status (SOLOUD_AUTO_DETECT_BACKENDS "Auto Detect Backends") print_option_status (SOLOUD_ENABLE_BACKEND_NULL "NULL backend") print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") print_option_status (SOLOUD_ENABLE_BACKEND_ALSA "ALSA backend") +print_option_status (SOLOUD_ENABLE_BACKEND_PIPEWIRE "PipeWire backend") print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") print_option_status (SOLOUD_BACKEND_OPENSLES "OpenSLES backend") print_option_status (SOLOUD_BACKEND_XAUDIO2 "XAudio2 backend") diff --git a/contrib/cmake/FindPipeWire.cmake b/contrib/cmake/FindPipeWire.cmake new file mode 100644 index 00000000..c90c3e08 --- /dev/null +++ b/contrib/cmake/FindPipeWire.cmake @@ -0,0 +1,122 @@ +#.rst: +# FindPipeWire +# ------- +# +# Try to find PipeWire on a Unix system. +# +# This will define the following variables: +# +# ``PipeWire_FOUND`` +# True if (the requested version of) PipeWire is available +# ``PipeWire_VERSION`` +# The version of PipeWire +# ``PipeWire_LIBRARIES`` +# This can be passed to target_link_libraries() instead of the ``PipeWire::PipeWire`` +# target +# ``PipeWire_INCLUDE_DIRS`` +# This should be passed to target_include_directories() if the target is not +# used for linking +# ``PipeWire_DEFINITIONS`` +# This should be passed to target_compile_options() if the target is not +# used for linking +# +# If ``PipeWire_FOUND`` is TRUE, it will also define the following imported target: +# +# ``PipeWire::PipeWire`` +# The PipeWire library +# +# In general we recommend using the imported target, as it is easier to use. +# Bear in mind, however, that if the target is in the link interface of an +# exported library, it must be made available by the package config file. + +#============================================================================= +# Copyright 2014 Alex Merry +# Copyright 2014 Martin Gräßlin +# Copyright 2018-2020 Jan Grulich +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +# Use pkg-config to get the directories and then use these values +# in the FIND_PATH() and FIND_LIBRARY() calls +find_package(PkgConfig QUIET) + +pkg_search_module(PKG_PipeWire QUIET libpipewire-0.3 libpipewire-0.2) +pkg_search_module(PKG_Spa QUIET libspa-0.2 libspa-0.1) + +set(PipeWire_DEFINITIONS "${PKG_PipeWire_CFLAGS}" "${PKG_Spa_CFLAGS}") +set(PipeWire_VERSION "${PKG_PipeWire_VERSION}") + +find_path(PipeWire_INCLUDE_DIRS + NAMES + pipewire/pipewire.h + HINTS + ${PKG_PipeWire_INCLUDE_DIRS} + ${PKG_PipeWire_INCLUDE_DIRS}/pipewire-0.3 +) + +find_path(Spa_INCLUDE_DIRS + NAMES + spa/param/props.h + HINTS + ${PKG_Spa_INCLUDE_DIRS} + ${PKG_Spa_INCLUDE_DIRS}/spa-0.2 +) + +find_library(PipeWire_LIBRARIES + NAMES + pipewire-0.3 + pipewire-0.2 + HINTS + ${PKG_PipeWire_LIBRARY_DIRS} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PipeWire + FOUND_VAR + PipeWire_FOUND + REQUIRED_VARS + PipeWire_LIBRARIES + PipeWire_INCLUDE_DIRS + Spa_INCLUDE_DIRS + VERSION_VAR + PipeWire_VERSION +) + +if(PipeWire_FOUND AND NOT TARGET PipeWire::PipeWire) + add_library(PipeWire::PipeWire UNKNOWN IMPORTED) + set_target_properties(PipeWire::PipeWire PROPERTIES + IMPORTED_LOCATION "${PipeWire_LIBRARIES}" + INTERFACE_COMPILE_OPTIONS "${PipeWire_DEFINITIONS}" + INTERFACE_INCLUDE_DIRECTORIES "${PipeWire_INCLUDE_DIRS};${Spa_INCLUDE_DIRS}" + ) +endif() + +mark_as_advanced(PipeWire_LIBRARIES PipeWire_INCLUDE_DIRS) + +include(FeatureSummary) +set_package_properties(PipeWire PROPERTIES + URL "https://www.pipewire.org" + DESCRIPTION "PipeWire - multimedia processing" +) \ No newline at end of file diff --git a/contrib/src.cmake b/contrib/src.cmake index bbc6609b..b5e74296 100644 --- a/contrib/src.cmake +++ b/contrib/src.cmake @@ -165,6 +165,14 @@ if(SOLOUD_ENABLE_BACKEND_ALSA) apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_ALSA=1) endif() +if(SOLOUD_ENABLE_BACKEND_PIPEWIRE) + list(APPEND SOLOUD_BACKENDS_SOURCES ${SOLOUD_BACKENDS_SOURCE_DIR}/pipewire/soloud_pipewire.cpp) + + find_package(PipeWire REQUIRED) + apply_to_soloud_libraries(target_link_libraries PUBLIC PipeWire::PipeWire) + apply_to_soloud_libraries(target_compile_definitions PUBLIC WITH_PIPEWIRE=1) +endif() + if (SOLOUD_ENABLE_BACKEND_COREAUDIO) if(NOT APPLE) message(FATAL_ERROR "CoreAudio backend can be enabled only on Apple!") diff --git a/include/soloud.h b/include/soloud.h index c759ee41..727c79fc 100644 --- a/include/soloud.h +++ b/include/soloud.h @@ -175,17 +175,18 @@ namespace SoLoud WINMM, XAUDIO2, WASAPI, - ALSA, + ALSA, OSS, OPENAL, COREAUDIO, OPENSLES, VITA_HOMEBREW, NULLDRIVER, - BACKEND_MAX, + PIPEWIRE, + BACKEND_MAX, }; - enum FLAGS + enum FLAGS { // Use round-off clipper CLIP_ROUNDOFF = 1, diff --git a/include/soloud_c.h b/include/soloud_c.h index c9b9f91b..01b374a2 100644 --- a/include/soloud_c.h +++ b/include/soloud_c.h @@ -52,7 +52,8 @@ enum SOLOUD_ENUMS SOLOUD_OPENSLES = 11, SOLOUD_VITA_HOMEBREW = 12, SOLOUD_NULLDRIVER = 13, - SOLOUD_BACKEND_MAX = 14, + SOLOUD_PIPEWIRE = 14, + SOLOUD_BACKEND_MAX = 15, SOLOUD_CLIP_ROUNDOFF = 1, SOLOUD_ENABLE_VISUALIZATION = 2, SOLOUD_LEFT_HANDED_3D = 4, diff --git a/include/soloud_internal.h b/include/soloud_internal.h index 7502c11a..ec049bfd 100644 --- a/include/soloud_internal.h +++ b/include/soloud_internal.h @@ -71,6 +71,9 @@ namespace SoLoud // ALSA back-end initialization call result alsa_init(SoLoud::Soloud *aSoloud, unsigned int aFlags = Soloud::CLIP_ROUNDOFF, unsigned int aSamplerate = 44100, unsigned int aBuffer = 2048, unsigned int aChannels = 2); + // PipeWire back-end initialization call + result pipewire_init(SoLoud::Soloud *aSoloud, unsigned int aFlags = Soloud::CLIP_ROUNDOFF, unsigned int aSamplerate = 44100, unsigned int aBuffer = 2048, unsigned int aChannels = 2); + // null driver back-end initialization call result null_init(SoLoud::Soloud *aSoloud, unsigned int aFlags = Soloud::CLIP_ROUNDOFF, unsigned int aSamplerate = 44100, unsigned int aBuffer = 2048, unsigned int aChannels = 2); @@ -118,4 +121,4 @@ namespace SoLoud h_++; \ } -#endif \ No newline at end of file +#endif diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp new file mode 100644 index 00000000..272a34ac --- /dev/null +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -0,0 +1,154 @@ +/* +SoLoud audio engine +Copyright (c) 2013-2015 Jari Komppa + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#include + +#include "soloud.h" + +#if !defined(WITH_PIPEWIRE) + +namespace SoLoud +{ + result sdl2static_init(SoLoud::Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer) + { + return NOT_IMPLEMENTED; + } +} + +#else + +#include "pipewire/pipewire.h" + +#include + +#include + +#define M_PI_M2 ( M_PI + M_PI ) + +#define DEFAULT_RATE 44100 +#define DEFAULT_CHANNELS 2 +#define DEFAULT_VOLUME 0.7 + +struct data { + struct pw_main_loop *loop; + struct pw_stream *stream; + double accumulator; +}; + +/* [on_process] */ +static void on_process(void *userdata) +{ + struct data *data = reinterpret_cast(userdata); + struct pw_buffer *b; + struct spa_buffer *buf; + int i, c, n_frames, stride; + int16_t *dst, val; + + if ((b = pw_stream_dequeue_buffer(data->stream)) == NULL) { + pw_log_warn("out of buffers: %m"); + return; + } + + buf = b->buffer; + if ((dst = reinterpret_cast(buf->datas[0].data)) == NULL) + return; + + stride = sizeof(int16_t) * DEFAULT_CHANNELS; + n_frames = buf->datas[0].maxsize / stride; + + for (i = 0; i < n_frames; i++) { + data->accumulator += M_PI_M2 * 440 / DEFAULT_RATE; + if (data->accumulator >= M_PI_M2) + data->accumulator -= M_PI_M2; + + val = sin(data->accumulator) * DEFAULT_VOLUME * 16767.f; + for (c = 0; c < DEFAULT_CHANNELS; c++) + *dst++ = val; + } + + buf->datas[0].chunk->offset = 0; + buf->datas[0].chunk->stride = stride; + buf->datas[0].chunk->size = n_frames * stride; + + pw_stream_queue_buffer(data->stream, b); +} +/* [on_process] */ + +static const struct pw_stream_events stream_events = { + PW_VERSION_STREAM_EVENTS, + .process = on_process, +}; + +int pwDemo(int argc, char *argv[]) +{ + struct data data = { 0, }; + const struct spa_pod *params[1]; + uint8_t buffer[1024]; + struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer)); + + pw_init(&argc, &argv); + + data.loop = pw_main_loop_new(NULL); + + data.stream = pw_stream_new_simple( + pw_main_loop_get_loop(data.loop), + "audio-src", + pw_properties_new( + PW_KEY_MEDIA_TYPE, "Audio", + PW_KEY_MEDIA_CATEGORY, "Playback", + PW_KEY_MEDIA_ROLE, "Music", + NULL), + &stream_events, + &data); + + spa_audio_info_raw dummy = SPA_AUDIO_INFO_RAW_INIT();// = SPA_AUDIO_INFO_RAW_INIT(.format = SPA_AUDIO_FORMAT_S16, .channels = DEFAULT_CHANNELS, .rate = DEFAULT_RATE ); + dummy.format = SPA_AUDIO_FORMAT_S16; + dummy.channels = DEFAULT_CHANNELS; + dummy.rate = DEFAULT_RATE; + params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, + &dummy); + + pw_stream_connect(data.stream, + PW_DIRECTION_OUTPUT, + PW_ID_ANY, + static_cast(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS), + params, + 1); + + pw_main_loop_run(data.loop); + + pw_stream_destroy(data.stream); + pw_main_loop_destroy(data.loop); + + return 0; +} + +namespace SoLoud +{ + result pipewire_init(Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer, unsigned int aChannels) + { + pwDemo(0, nullptr); + return NOT_IMPLEMENTED; + } +} +#endif diff --git a/src/core/soloud.cpp b/src/core/soloud.cpp index 922409bc..28cfb2d8 100644 --- a/src/core/soloud.cpp +++ b/src/core/soloud.cpp @@ -384,6 +384,25 @@ namespace SoLoud } #endif +#if defined(WITH_PIPEWIRE) + if (!inited && + (aBackend == Soloud::PIPEWIRE || + aBackend == Soloud::AUTO)) + { + if (aBufferSize == Soloud::AUTO) buffersize = 2048; + + int ret = pipewire_init(this, aFlags, samplerate, buffersize, aChannels); + if (ret == 0) + { + inited = 1; + mBackendID = Soloud::PIPEWIRE; + } + + if (ret != 0 && aBackend != Soloud::AUTO) + return ret; + } +#endif + #if defined(WITH_OSS) if (!inited && (aBackend == Soloud::OSS || From a7d33fbf4edb1e8a0abb23f3bf96c6d57a29143e Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 17:39:30 -0700 Subject: [PATCH 10/15] Got my mucky demo working --- src/backend/pipewire/soloud_pipewire.cpp | 184 ++++++++++++++++++++++- 1 file changed, 177 insertions(+), 7 deletions(-) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index 272a34ac..5b217db6 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -38,17 +38,18 @@ namespace SoLoud #else #include "pipewire/pipewire.h" +#include +#include #include - #include -#define M_PI_M2 ( M_PI + M_PI ) +#define ENABLE_DEMO 0 +#if ENABLE_DEMO #define DEFAULT_RATE 44100 #define DEFAULT_CHANNELS 2 #define DEFAULT_VOLUME 0.7 - struct data { struct pw_main_loop *loop; struct pw_stream *stream; @@ -76,6 +77,7 @@ static void on_process(void *userdata) stride = sizeof(int16_t) * DEFAULT_CHANNELS; n_frames = buf->datas[0].maxsize / stride; + constexpr const float M_PI_M2 = ( M_PI + M_PI ); for (i = 0; i < n_frames; i++) { data->accumulator += M_PI_M2 * 440 / DEFAULT_RATE; if (data->accumulator >= M_PI_M2) @@ -125,8 +127,7 @@ int pwDemo(int argc, char *argv[]) dummy.format = SPA_AUDIO_FORMAT_S16; dummy.channels = DEFAULT_CHANNELS; dummy.rate = DEFAULT_RATE; - params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, - &dummy); + params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &dummy); pw_stream_connect(data.stream, PW_DIRECTION_OUTPUT, @@ -142,13 +143,182 @@ int pwDemo(int argc, char *argv[]) return 0; } - +#endif namespace SoLoud { + static void PipewireMixSoloudData(void *userdata); + static const struct pw_stream_events cs_StreamSoloudData ={ + PW_VERSION_STREAM_EVENTS, + .process = PipewireMixSoloudData, + }; + + class PipeWireBackendState + { + public: + PipeWireBackendState() = default; + ~PipeWireBackendState() + { + StopStream(); + } + + bool SetSoloudEngineInstance(Soloud* connectedEngine) + { + m_SoundLoadEngineInstance = connectedEngine; + return true; + } + + bool SetAudioBufferSize(const std::size_t newSize) + { + m_MixedBuffer.resize(newSize); + m_MixedBuffer.shrink_to_fit(); + //Reinitialize the POD Wrapper + m_MixedBufferPipewirePODWrapper = spa_pod_builder(); + m_MixedBufferPipewirePODWrapper.data = m_MixedBuffer.data(); + m_MixedBufferPipewirePODWrapper.size = m_MixedBuffer.size(); + + return true; + } + + bool SetOutputStream(unsigned int newNumberOfChannels, unsigned int newSampleRate) + { + m_OutputAudioStreamInformation = SPA_AUDIO_INFO_RAW_INIT(); + m_OutputAudioStreamInformation.format = SPA_AUDIO_FORMAT_S16; + m_OutputAudioStreamInformation.channels = newNumberOfChannels; + m_OutputAudioStreamInformation.rate = newSampleRate; + return true; + } + + bool StartSteam() + { + //Ensure that a previous stream is not already running + StopStream(); + m_PipewireLoop = pw_main_loop_new(nullptr); + m_PipewirePlaybackProperties = pw_properties_new(PW_KEY_MEDIA_TYPE, "Audio", + PW_KEY_MEDIA_CATEGORY, "Playback", + PW_KEY_MEDIA_ROLE, "Game", + PW_KEY_MODULE_NAME, "Soloud", + nullptr); + + m_OutputAudioStream = pw_stream_new_simple(pw_main_loop_get_loop(m_PipewireLoop), + "audio-src", + m_PipewirePlaybackProperties, + &cs_StreamSoloudData, + this); + + m_PODParameters.emplace_back(spa_format_audio_raw_build(&m_MixedBufferPipewirePODWrapper, SPA_PARAM_EnumFormat, &m_OutputAudioStreamInformation)); + + int errorCode = pw_stream_connect(m_OutputAudioStream, + PW_DIRECTION_OUTPUT, + PW_ID_ANY, + static_cast(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS), + m_PODParameters.data(), + m_PODParameters.size()); + + if(errorCode != 0) + { + printf("WRC"); + } + + pw_main_loop_run(m_PipewireLoop); + + return false; + } + + bool StopStream() + { + if(m_OutputAudioStream != nullptr) + { + pw_stream_destroy(m_OutputAudioStream); + m_OutputAudioStream = nullptr; + } + + if(m_PipewireLoop) + { + pw_main_loop_destroy(m_PipewireLoop); + m_PipewireLoop = nullptr; + } + + return true; + } + + //protected: + + std::vector m_MixedBuffer; + struct spa_pod_builder m_MixedBufferPipewirePODWrapper; + struct pw_main_loop *m_PipewireLoop{nullptr}; //Used to grab data to run + + struct pw_properties *m_PipewirePlaybackProperties{nullptr}; + + struct pw_stream *m_OutputAudioStream{nullptr}; + struct spa_audio_info_raw m_OutputAudioStreamInformation{}; + std::vector m_PODParameters; + + Soloud* m_SoundLoadEngineInstance{nullptr}; + + double m_PipewireDemoAccumulator{0}; + + }; + + static void PipewireMixSoloudData(void *userdata) + { + PipeWireBackendState* soloudPipewireState = reinterpret_cast(userdata); + +#if 1 + struct pw_buffer *b; + struct spa_buffer *buf; + int i, c, n_frames, stride; + int16_t *dst, val; + + if ((b = pw_stream_dequeue_buffer(soloudPipewireState->m_OutputAudioStream)) == NULL) { + pw_log_warn("out of buffers: %m"); + return; + } + + buf = b->buffer; + if ((dst = reinterpret_cast(buf->datas[0].data)) == NULL) + return; + + stride = sizeof(int16_t) * soloudPipewireState->m_OutputAudioStreamInformation.channels; + n_frames = buf->datas[0].maxsize / stride; + + constexpr const float M_PI_M2 = ( M_PI + M_PI ); + for (i = 0; i < n_frames; i++) { + soloudPipewireState->m_PipewireDemoAccumulator += M_PI_M2 * 440 / soloudPipewireState->m_OutputAudioStreamInformation.rate; + if (soloudPipewireState->m_PipewireDemoAccumulator >= M_PI_M2) + soloudPipewireState->m_PipewireDemoAccumulator -= M_PI_M2; + + constexpr const float c_DefaultVolume = 0.7; + val = sin(soloudPipewireState->m_PipewireDemoAccumulator) * c_DefaultVolume * 16767.f; + for (c = 0; c < soloudPipewireState->m_OutputAudioStreamInformation.channels; c++) + *dst++ = val; + } + + buf->datas[0].chunk->offset = 0; + buf->datas[0].chunk->stride = stride; + buf->datas[0].chunk->size = n_frames * stride; + + int output = pw_stream_queue_buffer(soloudPipewireState->m_OutputAudioStream, b); +#endif + + } + + static std::unique_ptr s_PipewireState; + result pipewire_init(Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer, unsigned int aChannels) { +#if ENABLE_DEMO pwDemo(0, nullptr); - return NOT_IMPLEMENTED; +#else + pw_init(nullptr, nullptr); //Initialize the pipewire api + s_PipewireState = std::make_unique(); + s_PipewireState->SetSoloudEngineInstance(aSoloud); + //Set the Audio Buffer size + s_PipewireState->SetAudioBufferSize(aBuffer); + s_PipewireState->SetOutputStream(aChannels, aSamplerate); + s_PipewireState->StartSteam(); + +#endif + return SO_NO_ERROR; } } #endif From 705449733a39ed5561c155686af22499ef836841 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 18:18:40 -0700 Subject: [PATCH 11/15] Fake soloud into thinking data is moving --- src/backend/pipewire/soloud_pipewire.cpp | 135 ++++------------------- 1 file changed, 21 insertions(+), 114 deletions(-) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index 5b217db6..c358415e 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -24,6 +24,7 @@ freely, subject to the following restrictions: #include #include "soloud.h" +#include "soloud_thread.h" #if !defined(WITH_PIPEWIRE) @@ -44,106 +45,6 @@ namespace SoLoud #include #include -#define ENABLE_DEMO 0 - -#if ENABLE_DEMO -#define DEFAULT_RATE 44100 -#define DEFAULT_CHANNELS 2 -#define DEFAULT_VOLUME 0.7 -struct data { - struct pw_main_loop *loop; - struct pw_stream *stream; - double accumulator; -}; - -/* [on_process] */ -static void on_process(void *userdata) -{ - struct data *data = reinterpret_cast(userdata); - struct pw_buffer *b; - struct spa_buffer *buf; - int i, c, n_frames, stride; - int16_t *dst, val; - - if ((b = pw_stream_dequeue_buffer(data->stream)) == NULL) { - pw_log_warn("out of buffers: %m"); - return; - } - - buf = b->buffer; - if ((dst = reinterpret_cast(buf->datas[0].data)) == NULL) - return; - - stride = sizeof(int16_t) * DEFAULT_CHANNELS; - n_frames = buf->datas[0].maxsize / stride; - - constexpr const float M_PI_M2 = ( M_PI + M_PI ); - for (i = 0; i < n_frames; i++) { - data->accumulator += M_PI_M2 * 440 / DEFAULT_RATE; - if (data->accumulator >= M_PI_M2) - data->accumulator -= M_PI_M2; - - val = sin(data->accumulator) * DEFAULT_VOLUME * 16767.f; - for (c = 0; c < DEFAULT_CHANNELS; c++) - *dst++ = val; - } - - buf->datas[0].chunk->offset = 0; - buf->datas[0].chunk->stride = stride; - buf->datas[0].chunk->size = n_frames * stride; - - pw_stream_queue_buffer(data->stream, b); -} -/* [on_process] */ - -static const struct pw_stream_events stream_events = { - PW_VERSION_STREAM_EVENTS, - .process = on_process, -}; - -int pwDemo(int argc, char *argv[]) -{ - struct data data = { 0, }; - const struct spa_pod *params[1]; - uint8_t buffer[1024]; - struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer)); - - pw_init(&argc, &argv); - - data.loop = pw_main_loop_new(NULL); - - data.stream = pw_stream_new_simple( - pw_main_loop_get_loop(data.loop), - "audio-src", - pw_properties_new( - PW_KEY_MEDIA_TYPE, "Audio", - PW_KEY_MEDIA_CATEGORY, "Playback", - PW_KEY_MEDIA_ROLE, "Music", - NULL), - &stream_events, - &data); - - spa_audio_info_raw dummy = SPA_AUDIO_INFO_RAW_INIT();// = SPA_AUDIO_INFO_RAW_INIT(.format = SPA_AUDIO_FORMAT_S16, .channels = DEFAULT_CHANNELS, .rate = DEFAULT_RATE ); - dummy.format = SPA_AUDIO_FORMAT_S16; - dummy.channels = DEFAULT_CHANNELS; - dummy.rate = DEFAULT_RATE; - params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &dummy); - - pw_stream_connect(data.stream, - PW_DIRECTION_OUTPUT, - PW_ID_ANY, - static_cast(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS), - params, - 1); - - pw_main_loop_run(data.loop); - - pw_stream_destroy(data.stream); - pw_main_loop_destroy(data.loop); - - return 0; -} -#endif namespace SoLoud { static void PipewireMixSoloudData(void *userdata); @@ -192,14 +93,14 @@ namespace SoLoud { //Ensure that a previous stream is not already running StopStream(); - m_PipewireLoop = pw_main_loop_new(nullptr); + m_PipewireLoop = pw_thread_loop_new("SoLoud Pipewire Thread", nullptr); m_PipewirePlaybackProperties = pw_properties_new(PW_KEY_MEDIA_TYPE, "Audio", PW_KEY_MEDIA_CATEGORY, "Playback", PW_KEY_MEDIA_ROLE, "Game", PW_KEY_MODULE_NAME, "Soloud", nullptr); - m_OutputAudioStream = pw_stream_new_simple(pw_main_loop_get_loop(m_PipewireLoop), + m_OutputAudioStream = pw_stream_new_simple(pw_thread_loop_get_loop(m_PipewireLoop), "audio-src", m_PipewirePlaybackProperties, &cs_StreamSoloudData, @@ -214,12 +115,7 @@ namespace SoLoud m_PODParameters.data(), m_PODParameters.size()); - if(errorCode != 0) - { - printf("WRC"); - } - - pw_main_loop_run(m_PipewireLoop); + pw_thread_loop_start(m_PipewireLoop); return false; } @@ -234,7 +130,7 @@ namespace SoLoud if(m_PipewireLoop) { - pw_main_loop_destroy(m_PipewireLoop); + pw_thread_loop_stop(m_PipewireLoop); m_PipewireLoop = nullptr; } @@ -245,7 +141,7 @@ namespace SoLoud std::vector m_MixedBuffer; struct spa_pod_builder m_MixedBufferPipewirePODWrapper; - struct pw_main_loop *m_PipewireLoop{nullptr}; //Used to grab data to run + struct pw_thread_loop *m_PipewireLoop{nullptr}; //Used to grab data to run struct pw_properties *m_PipewirePlaybackProperties{nullptr}; @@ -264,6 +160,19 @@ namespace SoLoud PipeWireBackendState* soloudPipewireState = reinterpret_cast(userdata); #if 1 + //Fake out soloud to think stuff is happening + static bool firstRun{true}; + static std::vector fakeBuffer; + if(firstRun) + { + firstRun = false; + //fakeBuffer.resize(soloudPipewireState->m_MixedBuffer.size()); + fakeBuffer.resize(soloudPipewireState->m_MixedBuffer.size() * soloudPipewireState->m_OutputAudioStreamInformation.channels); + fakeBuffer.shrink_to_fit(); + } + + soloudPipewireState->m_SoundLoadEngineInstance->mix(fakeBuffer.data(), soloudPipewireState->m_MixedBuffer.size()); + struct pw_buffer *b; struct spa_buffer *buf; int i, c, n_frames, stride; @@ -306,18 +215,16 @@ namespace SoLoud result pipewire_init(Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer, unsigned int aChannels) { -#if ENABLE_DEMO - pwDemo(0, nullptr); -#else pw_init(nullptr, nullptr); //Initialize the pipewire api s_PipewireState = std::make_unique(); s_PipewireState->SetSoloudEngineInstance(aSoloud); //Set the Audio Buffer size s_PipewireState->SetAudioBufferSize(aBuffer); s_PipewireState->SetOutputStream(aChannels, aSamplerate); + + aSoloud->postinit(aSamplerate, aBuffer * aChannels, aFlags, aChannels); s_PipewireState->StartSteam(); -#endif return SO_NO_ERROR; } } From a5a85077c5e5ed056b46e3058db38ec01cfca1cf Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 18:54:20 -0700 Subject: [PATCH 12/15] Pipewire makes noise but runs slowly --- src/backend/pipewire/soloud_pipewire.cpp | 57 +++++++----------------- 1 file changed, 16 insertions(+), 41 deletions(-) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index c358415e..22ae5472 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -83,7 +83,8 @@ namespace SoLoud bool SetOutputStream(unsigned int newNumberOfChannels, unsigned int newSampleRate) { m_OutputAudioStreamInformation = SPA_AUDIO_INFO_RAW_INIT(); - m_OutputAudioStreamInformation.format = SPA_AUDIO_FORMAT_S16; + ; + m_OutputAudioStreamInformation.format = SPA_AUDIO_FORMAT_F32; m_OutputAudioStreamInformation.channels = newNumberOfChannels; m_OutputAudioStreamInformation.rate = newSampleRate; return true; @@ -101,7 +102,7 @@ namespace SoLoud nullptr); m_OutputAudioStream = pw_stream_new_simple(pw_thread_loop_get_loop(m_PipewireLoop), - "audio-src", + "Soloud", m_PipewirePlaybackProperties, &cs_StreamSoloudData, this); @@ -139,7 +140,7 @@ namespace SoLoud //protected: - std::vector m_MixedBuffer; + std::vector m_MixedBuffer; struct spa_pod_builder m_MixedBufferPipewirePODWrapper; struct pw_thread_loop *m_PipewireLoop{nullptr}; //Used to grab data to run @@ -159,60 +160,34 @@ namespace SoLoud { PipeWireBackendState* soloudPipewireState = reinterpret_cast(userdata); -#if 1 - //Fake out soloud to think stuff is happening - static bool firstRun{true}; - static std::vector fakeBuffer; - if(firstRun) - { - firstRun = false; - //fakeBuffer.resize(soloudPipewireState->m_MixedBuffer.size()); - fakeBuffer.resize(soloudPipewireState->m_MixedBuffer.size() * soloudPipewireState->m_OutputAudioStreamInformation.channels); - fakeBuffer.shrink_to_fit(); - } - - soloudPipewireState->m_SoundLoadEngineInstance->mix(fakeBuffer.data(), soloudPipewireState->m_MixedBuffer.size()); - struct pw_buffer *b; - struct spa_buffer *buf; - int i, c, n_frames, stride; - int16_t *dst, val; + int n_frames, stride; + float *dst, val; if ((b = pw_stream_dequeue_buffer(soloudPipewireState->m_OutputAudioStream)) == NULL) { pw_log_warn("out of buffers: %m"); return; } - buf = b->buffer; - if ((dst = reinterpret_cast(buf->datas[0].data)) == NULL) + if ((dst = reinterpret_cast(b->buffer->datas[0].data)) == NULL) return; - stride = sizeof(int16_t) * soloudPipewireState->m_OutputAudioStreamInformation.channels; - n_frames = buf->datas[0].maxsize / stride; - - constexpr const float M_PI_M2 = ( M_PI + M_PI ); - for (i = 0; i < n_frames; i++) { - soloudPipewireState->m_PipewireDemoAccumulator += M_PI_M2 * 440 / soloudPipewireState->m_OutputAudioStreamInformation.rate; - if (soloudPipewireState->m_PipewireDemoAccumulator >= M_PI_M2) - soloudPipewireState->m_PipewireDemoAccumulator -= M_PI_M2; + const int maxDatas = b->buffer->n_datas; + const int maxSize = b->buffer->datas->maxsize; + stride = sizeof(float) * soloudPipewireState->m_OutputAudioStreamInformation.channels; + n_frames = b->buffer->datas[0].maxsize / stride; - constexpr const float c_DefaultVolume = 0.7; - val = sin(soloudPipewireState->m_PipewireDemoAccumulator) * c_DefaultVolume * 16767.f; - for (c = 0; c < soloudPipewireState->m_OutputAudioStreamInformation.channels; c++) - *dst++ = val; - } + memset(dst, 0, b->buffer->datas[0].maxsize); + soloudPipewireState->m_SoundLoadEngineInstance->mix(dst, n_frames); - buf->datas[0].chunk->offset = 0; - buf->datas[0].chunk->stride = stride; - buf->datas[0].chunk->size = n_frames * stride; + b->buffer->datas[0].chunk->offset = 0; + b->buffer->datas[0].chunk->stride = stride; + b->buffer->datas[0].chunk->size = n_frames * stride; int output = pw_stream_queue_buffer(soloudPipewireState->m_OutputAudioStream, b); -#endif - } static std::unique_ptr s_PipewireState; - result pipewire_init(Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer, unsigned int aChannels) { pw_init(nullptr, nullptr); //Initialize the pipewire api From 6f39272d566906dcf464410052f586629053f4d2 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 21:36:05 -0700 Subject: [PATCH 13/15] Cleaned up the Pipewire backend --- contrib/CMakeLists.txt | 4 +- src/backend/pipewire/soloud_pipewire.cpp | 171 +++++++++++++---------- src/core/soloud.cpp | 39 +++--- 3 files changed, 118 insertions(+), 96 deletions(-) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index d010f860..4c07a893 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -29,8 +29,8 @@ if(SOLOUD_AUTO_DETECT_BACKENDS) set(SOLOUD_ENABLE_BACKEND_SDL2 ${SDL2_FOUND}) find_package(ALSA) set(SOLOUD_ENABLE_BACKEND_ALSA ${ALSA_FOUND}) - find_package(PipeWire) - set(SOLOUD_ENABLE_BACKEND_PIPEWIRE ${PipeWire_FOUND}) + find_package(PipeWire) + set(SOLOUD_ENABLE_BACKEND_PIPEWIRE ${PipeWire_FOUND}) if(APPLE) set(SOLOUD_BACKEND_COREAUDIO ON) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index 22ae5472..391a592d 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -21,11 +21,7 @@ freely, subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include - #include "soloud.h" -#include "soloud_thread.h" - #if !defined(WITH_PIPEWIRE) namespace SoLoud @@ -37,63 +33,50 @@ namespace SoLoud } #else +#include "soloud_thread.h" #include "pipewire/pipewire.h" -#include -#include - -#include #include namespace SoLoud { - static void PipewireMixSoloudData(void *userdata); - static const struct pw_stream_events cs_StreamSoloudData ={ - PW_VERSION_STREAM_EVENTS, - .process = PipewireMixSoloudData, - }; - class PipeWireBackendState { public: - PipeWireBackendState() = default; - ~PipeWireBackendState() + PipeWireBackendState() { - StopStream(); + m_PipewireParameterPODWrapper = spa_pod_builder(); + m_PipewireParameterPODWrapper.data = m_PipewireParameterBuffer; + m_PipewireParameterPODWrapper.size = c_PipewireParameterBufferSize; + + m_PODParameters[0] = nullptr; } - bool SetSoloudEngineInstance(Soloud* connectedEngine) + ~PipeWireBackendState() { - m_SoundLoadEngineInstance = connectedEngine; - return true; + StopProcessing(); } - bool SetAudioBufferSize(const std::size_t newSize) + bool SetSoloudEngineInstance(Soloud* connectedEngine) { - m_MixedBuffer.resize(newSize); - m_MixedBuffer.shrink_to_fit(); - //Reinitialize the POD Wrapper - m_MixedBufferPipewirePODWrapper = spa_pod_builder(); - m_MixedBufferPipewirePODWrapper.data = m_MixedBuffer.data(); - m_MixedBufferPipewirePODWrapper.size = m_MixedBuffer.size(); - + m_SoundLoadEngineInstance = connectedEngine; return true; } bool SetOutputStream(unsigned int newNumberOfChannels, unsigned int newSampleRate) { m_OutputAudioStreamInformation = SPA_AUDIO_INFO_RAW_INIT(); - ; m_OutputAudioStreamInformation.format = SPA_AUDIO_FORMAT_F32; m_OutputAudioStreamInformation.channels = newNumberOfChannels; m_OutputAudioStreamInformation.rate = newSampleRate; return true; } - bool StartSteam() + bool StartProcessing() { + //Ensure that a previous stream is not already running - StopStream(); + StopProcessing(); m_PipewireLoop = pw_thread_loop_new("SoLoud Pipewire Thread", nullptr); m_PipewirePlaybackProperties = pw_properties_new(PW_KEY_MEDIA_TYPE, "Audio", PW_KEY_MEDIA_CATEGORY, "Playback", @@ -107,21 +90,23 @@ namespace SoLoud &cs_StreamSoloudData, this); - m_PODParameters.emplace_back(spa_format_audio_raw_build(&m_MixedBufferPipewirePODWrapper, SPA_PARAM_EnumFormat, &m_OutputAudioStreamInformation)); + m_PODParameters[0] = spa_format_audio_raw_build(&m_PipewireParameterPODWrapper, + SPA_PARAM_EnumFormat, + &m_OutputAudioStreamInformation); int errorCode = pw_stream_connect(m_OutputAudioStream, PW_DIRECTION_OUTPUT, PW_ID_ANY, static_cast(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS), - m_PODParameters.data(), - m_PODParameters.size()); + m_PODParameters, + c_PODParametersSize); pw_thread_loop_start(m_PipewireLoop); return false; } - bool StopStream() + bool StopProcessing() { if(m_OutputAudioStream != nullptr) { @@ -135,70 +120,106 @@ namespace SoLoud m_PipewireLoop = nullptr; } + if(m_PipewirePlaybackProperties) + { + pw_properties_free(m_PipewirePlaybackProperties); + m_PipewirePlaybackProperties = nullptr; + } + + m_PODParameters[0] = nullptr; + return true; } - //protected: + bool clear() + { + m_SoundLoadEngineInstance = nullptr; + m_DesiredBufferSize = 0; + return true; + } + + bool SetDesiredBufferSize(unsigned int newDesiredBufferSize) + { + m_DesiredBufferSize = newDesiredBufferSize; + return true; + } + + const uint32_t& GetNumerOfPlaybackChannels() const + { + return m_OutputAudioStreamInformation.channels; + } - std::vector m_MixedBuffer; - struct spa_pod_builder m_MixedBufferPipewirePODWrapper; - struct pw_thread_loop *m_PipewireLoop{nullptr}; //Used to grab data to run + static void PipewireMixSoloudData(void *userdata) + { + PipeWireBackendState* soloudPipewireState = reinterpret_cast(userdata); - struct pw_properties *m_PipewirePlaybackProperties{nullptr}; + struct pw_buffer *pipewireBuffer; + int numberOfFrames, stride; + float* destinationBuffer; - struct pw_stream *m_OutputAudioStream{nullptr}; - struct spa_audio_info_raw m_OutputAudioStreamInformation{}; - std::vector m_PODParameters; + if ((pipewireBuffer = pw_stream_dequeue_buffer(soloudPipewireState->m_OutputAudioStream)) == NULL) + { + pw_log_warn("out of buffers: %m"); + return; + } - Soloud* m_SoundLoadEngineInstance{nullptr}; + if ((destinationBuffer = reinterpret_cast(pipewireBuffer->buffer->datas[0].data)) == NULL) + return; - double m_PipewireDemoAccumulator{0}; + stride = sizeof(float) * soloudPipewireState->GetNumerOfPlaybackChannels(); + numberOfFrames = soloudPipewireState->m_DesiredBufferSize / stride; - }; + soloudPipewireState->m_SoundLoadEngineInstance->mix(destinationBuffer, numberOfFrames); - static void PipewireMixSoloudData(void *userdata) - { - PipeWireBackendState* soloudPipewireState = reinterpret_cast(userdata); + pipewireBuffer->buffer->datas[0].chunk->offset = 0; + pipewireBuffer->buffer->datas[0].chunk->stride = stride; + pipewireBuffer->buffer->datas[0].chunk->size = numberOfFrames * stride; - struct pw_buffer *b; - int n_frames, stride; - float *dst, val; + int output = pw_stream_queue_buffer(soloudPipewireState->m_OutputAudioStream, pipewireBuffer); + } + + constexpr static const struct pw_stream_events cs_StreamSoloudData ={ + PW_VERSION_STREAM_EVENTS, + .process = PipewireMixSoloudData, + }; - if ((b = pw_stream_dequeue_buffer(soloudPipewireState->m_OutputAudioStream)) == NULL) { - pw_log_warn("out of buffers: %m"); - return; - } + protected: + static const size_t c_PipewireParameterBufferSize = 1024; + uint8_t m_PipewireParameterBuffer[c_PipewireParameterBufferSize]; + struct spa_pod_builder m_PipewireParameterPODWrapper; + struct pw_thread_loop *m_PipewireLoop{nullptr}; //Used to grab data to run - if ((dst = reinterpret_cast(b->buffer->datas[0].data)) == NULL) - return; + struct pw_properties *m_PipewirePlaybackProperties{nullptr}; - const int maxDatas = b->buffer->n_datas; - const int maxSize = b->buffer->datas->maxsize; - stride = sizeof(float) * soloudPipewireState->m_OutputAudioStreamInformation.channels; - n_frames = b->buffer->datas[0].maxsize / stride; + struct pw_stream *m_OutputAudioStream{nullptr}; + struct spa_audio_info_raw m_OutputAudioStreamInformation{}; - memset(dst, 0, b->buffer->datas[0].maxsize); - soloudPipewireState->m_SoundLoadEngineInstance->mix(dst, n_frames); + static const unsigned int c_PODParametersSize = 1; + const struct spa_pod* m_PODParameters[c_PODParametersSize]; - b->buffer->datas[0].chunk->offset = 0; - b->buffer->datas[0].chunk->stride = stride; - b->buffer->datas[0].chunk->size = n_frames * stride; + Soloud* m_SoundLoadEngineInstance{nullptr}; + unsigned int m_DesiredBufferSize{0}; + }; - int output = pw_stream_queue_buffer(soloudPipewireState->m_OutputAudioStream, b); + static PipeWireBackendState s_PipewireState; + + static void pipewire_init_deinit(SoLoud::Soloud *aSoloud) + { + s_PipewireState.StopProcessing(); } - static std::unique_ptr s_PipewireState; result pipewire_init(Soloud *aSoloud, unsigned int aFlags, unsigned int aSamplerate, unsigned int aBuffer, unsigned int aChannels) { pw_init(nullptr, nullptr); //Initialize the pipewire api - s_PipewireState = std::make_unique(); - s_PipewireState->SetSoloudEngineInstance(aSoloud); - //Set the Audio Buffer size - s_PipewireState->SetAudioBufferSize(aBuffer); - s_PipewireState->SetOutputStream(aChannels, aSamplerate); + s_PipewireState.SetSoloudEngineInstance(aSoloud); + s_PipewireState.SetDesiredBufferSize(aBuffer); + s_PipewireState.SetOutputStream(aChannels, aSamplerate); aSoloud->postinit(aSamplerate, aBuffer * aChannels, aFlags, aChannels); - s_PipewireState->StartSteam(); + aSoloud->mBackendCleanupFunc = pipewire_init_deinit; + aSoloud->mBackendString = "Pipewire"; + //aSoloud->mBackendData; + s_PipewireState.StartProcessing(); return SO_NO_ERROR; } diff --git a/src/core/soloud.cpp b/src/core/soloud.cpp index 28cfb2d8..fa114852 100644 --- a/src/core/soloud.cpp +++ b/src/core/soloud.cpp @@ -365,6 +365,26 @@ namespace SoLoud } #endif +#if defined(WITH_PIPEWIRE) + if (!inited && + (aBackend == Soloud::PIPEWIRE || + aBackend == Soloud::AUTO)) + { + if (aBufferSize == Soloud::AUTO) + buffersize = 2048; + + int ret = pipewire_init(this, aFlags, samplerate, buffersize, aChannels); + if (ret == 0) + { + inited = 1; + mBackendID = Soloud::PIPEWIRE; + } + + if (ret != 0 && aBackend != Soloud::AUTO) + return ret; + } +#endif + #if defined(WITH_ALSA) if (!inited && (aBackend == Soloud::ALSA || @@ -384,25 +404,6 @@ namespace SoLoud } #endif -#if defined(WITH_PIPEWIRE) - if (!inited && - (aBackend == Soloud::PIPEWIRE || - aBackend == Soloud::AUTO)) - { - if (aBufferSize == Soloud::AUTO) buffersize = 2048; - - int ret = pipewire_init(this, aFlags, samplerate, buffersize, aChannels); - if (ret == 0) - { - inited = 1; - mBackendID = Soloud::PIPEWIRE; - } - - if (ret != 0 && aBackend != Soloud::AUTO) - return ret; - } -#endif - #if defined(WITH_OSS) if (!inited && (aBackend == Soloud::OSS || From 8c2b7ec973aac7b5f4b40d6478a574a8b9de03e7 Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 21:43:05 -0700 Subject: [PATCH 14/15] more cleanup --- src/backend/pipewire/soloud_pipewire.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index 391a592d..653607c5 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -74,7 +74,6 @@ namespace SoLoud bool StartProcessing() { - //Ensure that a previous stream is not already running StopProcessing(); m_PipewireLoop = pw_thread_loop_new("SoLoud Pipewire Thread", nullptr); From fff35e132a2fe219e7b83394fe53a7931f16539c Mon Sep 17 00:00:00 2001 From: Bradley Clemetson Date: Wed, 21 Jun 2023 21:57:35 -0700 Subject: [PATCH 15/15] Compilation fix --- src/backend/pipewire/soloud_pipewire.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backend/pipewire/soloud_pipewire.cpp b/src/backend/pipewire/soloud_pipewire.cpp index 653607c5..7ecf03b5 100644 --- a/src/backend/pipewire/soloud_pipewire.cpp +++ b/src/backend/pipewire/soloud_pipewire.cpp @@ -178,8 +178,17 @@ namespace SoLoud } constexpr static const struct pw_stream_events cs_StreamSoloudData ={ - PW_VERSION_STREAM_EVENTS, + .destroy = nullptr, + .state_changed = nullptr, + .control_info = nullptr, + .io_changed = nullptr, + .param_changed = nullptr, + .add_buffer = nullptr, + .remove_buffer = nullptr, .process = PipewireMixSoloudData, + .drained = nullptr, + .command = nullptr, + .trigger_done = nullptr }; protected: