From 8bbb092497d7d356c9a80c39089701aba89928cd Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 10 Feb 2021 13:18:12 -0700 Subject: [PATCH] Start phonon spatializer; --- CMakeLists.txt | 13 ++++++++ Tupfile | 1 + Tuprules.tup | 7 +++++ src/modules/audio/audio.c | 3 ++ src/modules/audio/spatializer.h | 3 ++ src/modules/audio/spatializer_phonon.c | 41 ++++++++++++++++++++++++++ tup.config.default | 2 ++ 7 files changed, 70 insertions(+) create mode 100644 src/modules/audio/spatializer_phonon.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ddb007e..b5332340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ option(LOVR_USE_OCULUS "Enable the LibOVR backend for the headset module (be sur option(LOVR_USE_VRAPI "Enable the VrApi backend for the headset module" OFF) option(LOVR_USE_PICO "Enable the Pico backend for the headset module" OFF) option(LOVR_USE_DESKTOP_HEADSET "Enable the keyboard/mouse backend for the headset module" ON) +option(LOVR_USE_STEAM_AUDIO "Enable the Steam Audio spatializer (be sure to also set LOVR_STEAM_AUDIO_PATH)" OFF) option(LOVR_USE_OCULUS_AUDIO "Enable the Oculus Audio spatializer (be sure to also set LOVR_OCULUS_AUDIO_PATH)" OFF) option(LOVR_USE_LINUX_EGL "Use the EGL graphics extension on Linux" OFF) @@ -249,6 +250,14 @@ if(LOVR_ENABLE_THREAD AND NOT (WIN32 OR EMSCRIPTEN)) set(LOVR_PTHREADS Threads::Threads) endif() +# Steam Audio +if(LOVR_USE_STEAM_AUDIO) + if(NOT LOVR_STEAM_AUDIO_PATH) + message(FATAL_ERROR "LOVR_USE_STEAM_AUDIO requires the LOVR_STEAM_AUDIO_PATH to be set to the location of the Steam Audio folder") + endif() + include_directories("${STEAM_AUDIO_PATH}/include") +endif() + # Oculus Audio if(LOVR_USE_OCULUS_AUDIO) if(NOT LOVR_OCULUS_AUDIO_PATH) @@ -349,6 +358,10 @@ if(LOVR_ENABLE_AUDIO) src/api/l_audio_source.c ) + if(LOVR_USE_STEAM_AUDIO) + target_compile_definitions(lovr PRIVATE LOVR_ENABLE_PHONON) + target_sources(lovr PRIVATE src/modules/audio/spatializer_phonon.c) + endif() if(LOVR_USE_OCULUS_AUDIO) target_compile_definitions(lovr PRIVATE LOVR_ENABLE_OCULUS_AUDIO) diff --git a/Tupfile b/Tupfile index 09263abc..732878a4 100644 --- a/Tupfile +++ b/Tupfile @@ -13,6 +13,7 @@ SRC += src/core/zip.c # modules SRC_@(AUDIO) += src/modules/audio/audio.c SRC_@(AUDIO) += src/modules/audio/spatializer_simple.c +SRC_@(AUDIO)@(STEAM_AUDIO) += src/modules/audio/spatializer_phonon.c SRC_@(AUDIO)@(OCULUS_AUDIO) += src/modules/audio/spatializer_oculus.c SRC_@(DATA) += src/modules/data/*.c SRC_@(EVENT) += src/modules/event/*.c diff --git a/Tuprules.tup b/Tuprules.tup index afed5f53..3de3aa66 100644 --- a/Tuprules.tup +++ b/Tuprules.tup @@ -51,6 +51,7 @@ CFLAGS_@(WEBXR) += -DLOVR_USE_WEBXR ## Spatializer backends CFLAGS_@(OCULUS_AUDIO) += -DLOVR_ENABLE_OCULUS_AUDIO +CFLAGS_@(STEAM_AUDIO) += -DLOVR_ENABLE_PHONON ifeq (@(PLATFORM),) PLATFORM = @(TUP_PLATFORM) @@ -245,6 +246,12 @@ ifneq (@(CMAKE_DEPS),) LIB_@(OCULUS_AUDIO)_$(win32) += @(OCULUS_AUDIO_PATH)/Lib/x64/ovraudio64.dll LIB_@(OCULUS_AUDIO)_$(linux) += @(OCULUS_AUDIO_PATH)/Lib/Linux64/libovraudio64.so LIB_@(OCULUS_AUDIO)_$(android) += @(OCULUS_AUDIO_PATH)/Lib/Android/arm64-v8a/libovraudio64.so + + # Phonon + CFLAGS_@(STEAM_AUDIO) += -I@(STEAM_AUDIO_PATH)/include + LIBS_@(STEAM_AUDIO)_$(win32) += @(STEAM_AUDIO_PATH)/lib/Windows/x64/phonon.dll + LIBS_@(STEAM_AUDIO)_$(linux) += @(STEAM_AUDIO_PATH)/lib/Linux/x64/libphonon.so + LIBS_@(STEAM_AUDIO)_$(android) += @(STEAM_AUDIO_PATH)/lib/Android/x64/libphonon.so endif LIBS += $(LIBS_y) $(LIBS_y_y) diff --git a/src/modules/audio/audio.c b/src/modules/audio/audio.c index a4ff7795..71753092 100644 --- a/src/modules/audio/audio.c +++ b/src/modules/audio/audio.c @@ -174,6 +174,9 @@ static void onCapture(ma_device* device, void* output, const void* input, uint32 static const ma_device_callback_proc callbacks[] = { onPlayback, onCapture }; static Spatializer* spatializers[] = { +#ifdef LOVR_ENABLE_PHONON + &phononSpatializer, +#endif #ifdef LOVR_ENABLE_OCULUS_AUDIO &oculusSpatializer, #endif diff --git a/src/modules/audio/spatializer.h b/src/modules/audio/spatializer.h index e5f7675b..f59af723 100644 --- a/src/modules/audio/spatializer.h +++ b/src/modules/audio/spatializer.h @@ -24,6 +24,9 @@ typedef struct { const char* name; } Spatializer; +#ifdef LOVR_ENABLE_PHONON +extern Spatializer phononSpatializer; +#endif #ifdef LOVR_ENABLE_OCULUS_AUDIO extern Spatializer oculusSpatializer; #endif diff --git a/src/modules/audio/spatializer_phonon.c b/src/modules/audio/spatializer_phonon.c new file mode 100644 index 00000000..78ae40f1 --- /dev/null +++ b/src/modules/audio/spatializer_phonon.c @@ -0,0 +1,41 @@ +#include "spatializer.h" +#include + +bool phonon_init(SpatializerConfig config) { + return false; +} + +void phonon_destroy() { + // +} + +uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_t frames, uint32_t _frames) { + return 0; +} + +uint32_t phonon_tail(float* scratch, float* output, uint32_t frames) { + return 0; +} + +void phonon_setListenerPose(float position[4], float orientation[4]) { + // +} + +void phonon_sourceCreate(Source* source) { + // +} + +void phonon_sourceDestroy(Source* source) { + // +} + +Spatializer phononSpatializer = { + .init = phonon_init, + .destroy = phonon_destroy, + .apply = phonon_apply, + .tail = phonon_tail, + .setListenerPose = phonon_setListenerPose, + .sourceCreate = phonon_sourceCreate, + .sourceDestroy = phonon_sourceDestroy, + .name = "phonon" +}; diff --git a/tup.config.default b/tup.config.default index 63dd788b..28da702e 100644 --- a/tup.config.default +++ b/tup.config.default @@ -49,6 +49,8 @@ CONFIG_WEBXR=n CONFIG_OCULUS_PATH= ## Spatializer backends +CONFIG_STEAM_AUDIO=n +CONFIG_STEAM_AUDIO_PATH= CONFIG_OCULUS_AUDIO=n CONFIG_OCULUS_AUDIO_PATH=