implement openal hrtf audio support
- upgrade openal version
- add support to create openal context with hrtf enabled
- add option in audio settings for hrtf enablement
- add static property on Audio class for runtime toggling of hrtf
- fix bug with left/right and front/back being reversed
This commit is contained in:
@@ -17,10 +17,11 @@
|
||||
//#define AL_LIBTYPE_STATIC
|
||||
#include <OpenAL/al.h>
|
||||
#include <OpenAL/alc.h>
|
||||
#include <OpenAL/alext.h>
|
||||
|
||||
#define ALC_MULTIPLE_LISTENERS 0
|
||||
|
||||
#define FLAX_POS_TO_OAL(vec) ((ALfloat)vec.X * -0.01f), ((ALfloat)vec.Y * 0.01f), ((ALfloat)vec.Z * -0.01f)
|
||||
#define FLAX_POS_TO_OAL(vec) ((ALfloat)vec.X * -0.01f), ((ALfloat)vec.Y * 0.01f), ((ALfloat)vec.Z * 0.01f)
|
||||
#if BUILD_RELEASE
|
||||
#define ALC_CHECK_ERROR(method)
|
||||
#else
|
||||
@@ -55,7 +56,6 @@
|
||||
namespace ALC
|
||||
{
|
||||
ALCdevice* Device = nullptr;
|
||||
bool AL_EXT_float32 = false;
|
||||
Array<ALCcontext*, FixedAllocation<AUDIO_MAX_LISTENERS>> Contexts;
|
||||
|
||||
bool IsExtensionSupported(const char* extension)
|
||||
@@ -156,7 +156,7 @@ namespace ALC
|
||||
|
||||
void RebuildContexts(bool isChangingDevice)
|
||||
{
|
||||
LOG(Info, "Rebuild audio contexts");
|
||||
LOG(Info, "Audio: Rebuilding audio contexts");
|
||||
|
||||
if (!isChangingDevice)
|
||||
{
|
||||
@@ -180,7 +180,18 @@ namespace ALC
|
||||
}
|
||||
#else
|
||||
Contexts.Resize(1);
|
||||
Contexts[0] = alcCreateContext(Device, nullptr);
|
||||
|
||||
if (Audio::GetUseHRTFWhenAvailable())
|
||||
{
|
||||
LOG(Info, "Audio: Enabling OpenAL HRTF");
|
||||
|
||||
ALCint attrs[] = { ALC_HRTF_SOFT, ALC_TRUE };
|
||||
Contexts[0] = alcCreateContext(Device, attrs);
|
||||
}
|
||||
else
|
||||
{
|
||||
Contexts[0] = alcCreateContext(Device, nullptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
// If only one context is available keep it active as an optimization.
|
||||
@@ -315,6 +326,11 @@ void AudioBackendOAL::Listener_TransformChanged(AudioListener* listener)
|
||||
alListener3f(AL_POSITION, FLAX_POS_TO_OAL(position));
|
||||
}
|
||||
|
||||
void AudioBackendOAL::Listener_ReinitializeAll()
|
||||
{
|
||||
ALC::RebuildContexts(false);
|
||||
}
|
||||
|
||||
void AudioBackendOAL::Source_OnAdd(AudioSource* source)
|
||||
{
|
||||
ALC::Source::Rebuild(source);
|
||||
@@ -567,7 +583,7 @@ void AudioBackendOAL::Buffer_Write(uint32 bufferId, byte* samples, const AudioDa
|
||||
{
|
||||
if (info.BitDepth > 16)
|
||||
{
|
||||
if (ALC::AL_EXT_float32)
|
||||
if (ALC::IsExtensionSupported("AL_EXT_float32"))
|
||||
{
|
||||
const uint32 bufferSize = info.NumSamples * sizeof(float);
|
||||
float* sampleBufferFloat = (float*)Allocator::Allocate(bufferSize);
|
||||
@@ -688,7 +704,6 @@ void AudioBackendOAL::Base_OnActiveDeviceChanged()
|
||||
}
|
||||
|
||||
// Setup
|
||||
ALC::AL_EXT_float32 = ALC::IsExtensionSupported("AL_EXT_float32");
|
||||
ALC::RebuildContexts(true);
|
||||
}
|
||||
|
||||
@@ -800,7 +815,6 @@ bool AudioBackendOAL::Base_Init()
|
||||
}
|
||||
|
||||
// Init
|
||||
ALC::AL_EXT_float32 = ALC::IsExtensionSupported("AL_EXT_float32");
|
||||
SetDopplerFactor(AudioSettings::Get()->DopplerFactor);
|
||||
ALC::RebuildContexts(true);
|
||||
Audio::SetActiveDeviceIndex(activeDeviceIndex);
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
void Listener_OnRemove(AudioListener* listener) override;
|
||||
void Listener_VelocityChanged(AudioListener* listener) override;
|
||||
void Listener_TransformChanged(AudioListener* listener) override;
|
||||
void Listener_ReinitializeAll() override;
|
||||
void Source_OnAdd(AudioSource* source) override;
|
||||
void Source_OnRemove(AudioSource* source) override;
|
||||
void Source_VelocityChanged(AudioSource* source) override;
|
||||
|
||||
Reference in New Issue
Block a user