From 14a8ca579b20137e10ced47987a34ed8de9f8da6 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 12 Sep 2024 02:54:58 -0700 Subject: [PATCH] Set AL_METERS_PER_UNIT for the listener's DistanceFactor --- src/dsoundoal.cpp | 11 ++++++++++- src/dsoundoal.h | 1 + src/primarybuffer.cpp | 10 +++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/dsoundoal.cpp b/src/dsoundoal.cpp index 4351422..7681b17 100644 --- a/src/dsoundoal.cpp +++ b/src/dsoundoal.cpp @@ -187,6 +187,7 @@ ds::expected,HRESULT> CreateDeviceShare(const GUID }; const std::array sExtensionList{ ExtensionEntry{"EAX5.0", EXT_EAX}, + ExtensionEntry{"ALC_EXT_EFX", EXT_EFX}, ExtensionEntry{"AL_EXT_FLOAT32", EXT_FLOAT32}, ExtensionEntry{"AL_EXT_MCFORMATS", EXT_MCFORMATS}, ExtensionEntry{"AL_EXT_STATIC_BUFFER", EXT_STATIC_BUFFER} @@ -195,7 +196,15 @@ ds::expected,HRESULT> CreateDeviceShare(const GUID std::bitset extensions{}; for(auto &ext : sExtensionList) { - if(alIsExtensionPresent(ext.name)) + if(std::string_view{ext.name}.substr(0,3) == "ALC") + { + if(alcIsExtensionPresent(aldev.get(), ext.name)) + { + extensions.set(ext.flag); + TRACE("CreateDeviceShare Found extension %s\n", ext.name); + } + } + else if(alIsExtensionPresent(ext.name)) { extensions.set(ext.flag); TRACE("CreateDeviceShare Found extension %s\n", ext.name); diff --git a/src/dsoundoal.h b/src/dsoundoal.h index cd700cb..8db03b6 100644 --- a/src/dsoundoal.h +++ b/src/dsoundoal.h @@ -25,6 +25,7 @@ struct BufferSubList; enum Extensions : uint8_t { EXT_EAX, + EXT_EFX, EXT_FLOAT32, EXT_MCFORMATS, EXT_STATIC_BUFFER, diff --git a/src/primarybuffer.cpp b/src/primarybuffer.cpp index 66ff7f2..da309b9 100644 --- a/src/primarybuffer.cpp +++ b/src/primarybuffer.cpp @@ -631,7 +631,11 @@ void PrimaryBuffer::setParams(const DS3DLISTENER ¶ms, const std::bitsetmContext}; + alcSuspendContext(self->mContext); self->mImmediate.flDistanceFactor = distanceFactor; - alSpeedOfSound(343.3f/distanceFactor); + alSpeedOfSound(343.3f / distanceFactor); + if(self->mParent.haveExtension(EXT_EFX)) + alListenerf(AL_METERS_PER_UNIT, distanceFactor); alGetError(); + alcProcessContext(self->mContext); } return S_OK;