From 883883f0fae02125fa79b9b9a1ad70727c155da7 Mon Sep 17 00:00:00 2001 From: mcc Date: Mon, 20 Aug 2018 16:33:16 -0400 Subject: [PATCH] Introduce -DUSE_OPENAL=0 CMake option which prevents inclusion of OpenAL --- CMakeLists.txt | 45 ++++++++++++--------- src/audio/audio.h | 7 ++++ src/audio/microphone.h | 6 +++ src/audio/null.c | 89 ++++++++++++++++++++++++++++++++++++++++++ src/audio/source.h | 8 ++++ 5 files changed, 136 insertions(+), 19 deletions(-) create mode 100644 src/audio/null.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b0594545..15248eba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,28 +164,37 @@ else() endif() # OpenAL +set(USE_OPENAL ON CACHE BOOL "If set to OFF, OpenAL is excluded and the behavior of lovr.audio is undefined") set(ALSOFT_UTILS OFF CACHE BOOL "") set(ALSOFT_EXAMPLES OFF CACHE BOOL "") set(ALSOFT_TESTS OFF CACHE BOOL "") -if(EMSCRIPTEN) - include_directories(deps/openal-soft/include) -elseif(WIN32) - add_subdirectory(deps/openal-soft openal) - include_directories(deps/openal-soft/include) - set_target_properties(OpenAL PROPERTIES COMPILE_FLAGS "/wd4005 /wd4098") - set(LOVR_OPENAL OpenAL) -else() - pkg_search_module(OPENAL openal-soft) - if (NOT OPENAL_FOUND) - pkg_search_module(OPENAL openal) + +if(USE_OPENAL) + add_definitions(-DUSE_OPENAL) + set(LOVR_AUDIO_SRC src/audio/audio.c src/audio/source.c src/audio/microphone.c) + + if(EMSCRIPTEN) + include_directories(deps/openal-soft/include) + elseif(WIN32) + add_subdirectory(deps/openal-soft openal) + include_directories(deps/openal-soft/include) + set_target_properties(OpenAL PROPERTIES COMPILE_FLAGS "/wd4005 /wd4098") + set(LOVR_OPENAL OpenAL) + else() + pkg_search_module(OPENAL openal-soft) if (NOT OPENAL_FOUND) - message(FATAL_ERROR "OpenAL not found.") + pkg_search_module(OPENAL openal) + if (NOT OPENAL_FOUND) + message(FATAL_ERROR "OpenAL not found.") + endif() endif() + include_directories(${OPENAL_INCLUDE_DIRS}) + string(REPLACE ";" " " OPENAL_LDFLAGS_STR "${OPENAL_LDFLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENAL_LDFLAGS_STR}") + set(LOVR_OPENAL ${OPENAL_LIBRARIES}) endif() - include_directories(${OPENAL_INCLUDE_DIRS}) - string(REPLACE ";" " " OPENAL_LDFLAGS_STR "${OPENAL_LDFLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENAL_LDFLAGS_STR}") - set(LOVR_OPENAL ${OPENAL_LIBRARIES}) +else() + set(LOVR_AUDIO_SRC src/audio/null.c) endif() # OpenGL @@ -258,9 +267,6 @@ set(LOVR_SRC src/api/types/transform.c src/api/types/vertexData.c src/api/types/world.c - src/audio/audio.c - src/audio/microphone.c - src/audio/source.c src/data/audioStream.c src/data/blob.c src/data/modelData.c @@ -304,6 +310,7 @@ set(LOVR_SRC src/resources/shaders.c src/timer/timer.c src/util.c + ${LOVR_AUDIO_SRC} ) # Conditional sources diff --git a/src/audio/audio.h b/src/audio/audio.h index e9c7181f..f9a0a713 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -1,15 +1,18 @@ #include "audio/source.h" #include "audio/microphone.h" #include "lib/vec/vec.h" +#ifdef USE_OPENAL #include #include #include +#endif #include #pragma once #define MAX_MICROPHONES 8 +#ifdef USE_OPENAL typedef struct { bool initialized; ALCdevice* device; @@ -20,6 +23,10 @@ typedef struct { float position[3]; float velocity[3]; } AudioState; +#else +typedef unsigned int AudioState; +typedef unsigned int ALenum; +#endif ALenum lovrAudioConvertFormat(int bitDepth, int channelCount); diff --git a/src/audio/microphone.h b/src/audio/microphone.h index 79484d99..faa611ae 100644 --- a/src/audio/microphone.h +++ b/src/audio/microphone.h @@ -1,11 +1,14 @@ #include "util.h" #include "data/soundData.h" +#if USE_OPENAL #include #include +#endif #include #pragma once +#ifdef USE_OPENAL typedef struct { Ref ref; ALCdevice* device; @@ -15,6 +18,9 @@ typedef struct { int bitDepth; int channelCount; } Microphone; +#else +typedef unsigned int Microphone; +#endif Microphone* lovrMicrophoneCreate(const char* name, int samples, int sampleRate, int bitDepth, int channelCount); void lovrMicrophoneDestroy(void* ref); diff --git a/src/audio/null.c b/src/audio/null.c new file mode 100644 index 00000000..c2f85cb9 --- /dev/null +++ b/src/audio/null.c @@ -0,0 +1,89 @@ +// "Null" implementation of all audio code for no-OpenAL mode +// Currently, some of these functions may lead to crashes (IE by returning null values) + +// audio.c + +#include "audio/audio.h" + +ALenum lovrAudioConvertFormat(int bitDepth, int channelCount) { return 0; } +void lovrAudioInit() {} +void lovrAudioDestroy() {} +void lovrAudioUpdate() {} +void lovrAudioAdd(Source* source) {} +void lovrAudioGetDopplerEffect(float* factor, float* speedOfSound) {} +void lovrAudioGetMicrophoneNames(const char* names[MAX_MICROPHONES], uint8_t* count) {} +void lovrAudioGetOrientation(float* angle, float* ax, float* ay, float* az) {} +void lovrAudioGetPosition(float* x, float* y, float* z) {} +void lovrAudioGetVelocity(float* x, float* y, float* z) {} +float lovrAudioGetVolume() { return 0; } +bool lovrAudioHas(Source* source) { return false; } +bool lovrAudioIsSpatialized() { return false; } +void lovrAudioPause() {} +void lovrAudioResume() {} +void lovrAudioRewind() {} +void lovrAudioSetDopplerEffect(float factor, float speedOfSound) {} +void lovrAudioSetOrientation(float angle, float ax, float ay, float az) {} +void lovrAudioSetPosition(float x, float y, float z) {} +void lovrAudioSetVelocity(float x, float y, float z) {} +void lovrAudioSetVolume(float volume) {} +void lovrAudioStop() {} + +// microphone.c + +#include "audio/microphone.h" + +Microphone* lovrMicrophoneCreate(const char* name, int samples, int sampleRate, int bitDepth, int channelCount) { return 0; } +void lovrMicrophoneDestroy(void* ref) {} +int lovrMicrophoneGetBitDepth(Microphone* microphone) { return 0; } +int lovrMicrophoneGetChannelCount(Microphone* microphone) { return 0; } +SoundData* lovrMicrophoneGetData(Microphone* microphone) { return NULL; } +const char* lovrMicrophoneGetName(Microphone* microphone) { return NULL; } +int lovrMicrophoneGetSampleCount(Microphone* microphone) { return 0; } +int lovrMicrophoneGetSampleRate(Microphone* microphone) { return 0; } +bool lovrMicrophoneIsRecording(Microphone* microphone) { return false; } +void lovrMicrophoneStartRecording(Microphone* microphone) {} +void lovrMicrophoneStopRecording(Microphone* microphone) {} + +// source.c + +#include "audio/source.h" + +Source* lovrSourceCreateStatic(SoundData* soundData) { return NULL; } +Source* lovrSourceCreateStream(AudioStream* stream) { return NULL; } +void lovrSourceDestroy(void* ref) {} +SourceType lovrSourceGetType(Source* source) { return SOURCE_STATIC; } +int lovrSourceGetBitDepth(Source* source) { return 0; } +int lovrSourceGetChannelCount(Source* source) { return 0; } +void lovrSourceGetCone(Source* source, float* innerAngle, float* outerAngle, float* outerGain) {} +void lovrSourceGetDirection(Source* source, float* x, float* y, float* z) {} +int lovrSourceGetDuration(Source* source) { return 0; } +void lovrSourceGetFalloff(Source* source, float* reference, float* max, float* rolloff) {} +float lovrSourceGetPitch(Source* source) { return 0; } +void lovrSourceGetPosition(Source* source, float* x, float* y, float* z) {} +void lovrSourceGetVelocity(Source* source, float* x, float* y, float* z) {} +int lovrSourceGetSampleRate(Source* source) { return 0; } +float lovrSourceGetVolume(Source* source) { return 0; } +void lovrSourceGetVolumeLimits(Source* source, float* min, float* max) {} +bool lovrSourceIsLooping(Source* source) { return false; } +bool lovrSourceIsPaused(Source* source) { return false; } +bool lovrSourceIsPlaying(Source* source) { return false; } +bool lovrSourceIsRelative(Source* source) { return false; } +bool lovrSourceIsStopped(Source* source) { return false; } +void lovrSourcePause(Source* source) {} +void lovrSourcePlay(Source* source) {} +void lovrSourceResume(Source* source) {} +void lovrSourceRewind(Source* source) {} +void lovrSourceSeek(Source* source, int sample) {} +void lovrSourceSetCone(Source* source, float inner, float outer, float outerGain) {} +void lovrSourceSetDirection(Source* source, float x, float y, float z) {} +void lovrSourceSetFalloff(Source* source, float reference, float max, float rolloff) {} +void lovrSourceSetLooping(Source* source, bool isLooping) {} +void lovrSourceSetPitch(Source* source, float pitch) {} +void lovrSourceSetPosition(Source* source, float x, float y, float z) {} +void lovrSourceSetRelative(Source* source, bool isRelative) {} +void lovrSourceSetVelocity(Source* source, float x, float y, float z) {} +void lovrSourceSetVolume(Source* source, float volume) {} +void lovrSourceSetVolumeLimits(Source* source, float min, float max) {} +void lovrSourceStop(Source* source) {} +void lovrSourceStream(Source* source, ALuint* buffers, int count) {} +int lovrSourceTell(Source* source) { return 0; } diff --git a/src/audio/source.h b/src/audio/source.h index 87bfaa91..e0c43a2e 100644 --- a/src/audio/source.h +++ b/src/audio/source.h @@ -1,8 +1,10 @@ #include "data/audioStream.h" #include "data/soundData.h" #include "util.h" +#ifdef USE_OPENAL #include #include +#endif #include #pragma once @@ -19,6 +21,7 @@ typedef enum { UNIT_SAMPLES } TimeUnit; +#ifdef USE_OPENAL typedef struct { Ref ref; SourceType type; @@ -28,6 +31,11 @@ typedef struct { ALuint buffers[SOURCE_BUFFERS]; bool isLooping; } Source; +#else +typedef struct { Ref ref; } Source; +typedef unsigned int ALuint; +#define ALC_HRTF_SOFT 0 +#endif Source* lovrSourceCreateStatic(SoundData* soundData); Source* lovrSourceCreateStream(AudioStream* stream);