Introduce -DUSE_OPENAL=0 CMake option which prevents inclusion of OpenAL

This commit is contained in:
mcc 2018-08-20 16:33:16 -04:00
parent 1f00948da0
commit 883883f0fa
5 changed files with 136 additions and 19 deletions

View File

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

View File

@ -1,15 +1,18 @@
#include "audio/source.h"
#include "audio/microphone.h"
#include "lib/vec/vec.h"
#ifdef USE_OPENAL
#include <AL/al.h>
#include <AL/alc.h>
#include <AL/alext.h>
#endif
#include <stdbool.h>
#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);

View File

@ -1,11 +1,14 @@
#include "util.h"
#include "data/soundData.h"
#if USE_OPENAL
#include <AL/al.h>
#include <AL/alc.h>
#endif
#include <stdbool.h>
#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);

89
src/audio/null.c Normal file
View File

@ -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; }

View File

@ -1,8 +1,10 @@
#include "data/audioStream.h"
#include "data/soundData.h"
#include "util.h"
#ifdef USE_OPENAL
#include <AL/al.h>
#include <AL/alc.h>
#endif
#include <stdbool.h>
#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);