diff options
-rw-r--r-- | alc/alc.cpp | 40 | ||||
-rw-r--r-- | alc/inprogext.h | 9 |
2 files changed, 41 insertions, 8 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp index 2745869d..be2bf938 100644 --- a/alc/alc.cpp +++ b/alc/alc.cpp @@ -524,6 +524,11 @@ constexpr struct { DECL(ALC_OUTPUT_LIMITER_SOFT), + DECL(ALC_OUTPUT_MODE_SOFT), + DECL(ALC_NORMAL_SOFT), + DECL(ALC_STEREO_UHJ_SOFT), + DECL(ALC_ANY_SOFT), + DECL(ALC_NO_ERROR), DECL(ALC_INVALID_DEVICE), DECL(ALC_INVALID_CONTEXT), @@ -933,6 +938,7 @@ constexpr ALCchar alcExtensionList[] = "ALC_SOFT_loopback " "ALC_SOFT_loopback_bformat " "ALC_SOFT_output_limiter " + "ALC_SOFTX_output_mode " "ALC_SOFT_pause_device " "ALC_SOFTX_reopen_device"; constexpr int alcMajorVersion{1}; @@ -1608,9 +1614,9 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) case ALC_HRTF_SOFT: TRACE_ATTR(ALC_HRTF_SOFT, attrList[attrIdx + 1]); if(attrList[attrIdx + 1] == ALC_FALSE) - opthrtf = al::make_optional(false); + opthrtf = false; else if(attrList[attrIdx + 1] == ALC_TRUE) - opthrtf = al::make_optional(true); + opthrtf = true; else opthrtf = al::nullopt; break; @@ -1625,6 +1631,18 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) TRACE_ATTR(ALC_OUTPUT_LIMITER_SOFT, gainLimiter); break; + case ALC_OUTPUT_MODE_SOFT: + TRACE_ATTR(ALC_HRTF_SOFT, attrList[attrIdx + 1]); + if(attrList[attrIdx + 1] == ALC_HRTF_SOFT) + stereomode = StereoEncoding::Hrtf; + else if(attrList[attrIdx + 1] == ALC_STEREO_UHJ_SOFT) + stereomode = StereoEncoding::Uhj; + else if(attrList[attrIdx + 1] == ALC_NORMAL_SOFT) + stereomode = StereoEncoding::Normal; + else + stereomode = al::nullopt; + break; + default: TRACE("0x%04X = %d (0x%x)\n", attrList[attrIdx], attrList[attrIdx + 1], attrList[attrIdx + 1]); @@ -1664,10 +1682,7 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) UpdateClockBase(device); if(!stereomode && opthrtf) - { - auto mode = *opthrtf ? StereoEncoding::Hrtf : StereoEncoding::Normal; - stereomode = al::make_optional(mode); - } + stereomode = *opthrtf ? StereoEncoding::Hrtf : StereoEncoding::Normal; if(loopback) { @@ -1773,11 +1788,11 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) { const char *hrtf{hrtfopt->c_str()}; if(al::strcasecmp(hrtf, "true") == 0) - stereomode = al::make_optional(StereoEncoding::Hrtf); + stereomode = StereoEncoding::Hrtf; else if(al::strcasecmp(hrtf, "false") == 0) { if(!stereomode || *stereomode == StereoEncoding::Hrtf) - stereomode = al::make_optional(StereoEncoding::Normal); + stereomode = StereoEncoding::Normal; } else if(al::strcasecmp(hrtf, "auto") != 0) ERR("Unexpected hrtf value: %s\n", hrtf); @@ -2709,6 +2724,15 @@ static size_t GetIntegerv(ALCdevice *device, ALCenum param, const al::span<int> values[0] = MaxAmbiOrder; return 1; + case ALC_OUTPUT_MODE_SOFT: + if(device->mHrtf) + values[0] = ALC_HRTF_SOFT; + else if(device->mUhjEncoder) + values[0] = ALC_STEREO_UHJ_SOFT; + else + values[0] = ALC_NORMAL_SOFT; + return 1; + default: alcSetError(device, ALC_INVALID_ENUM); } diff --git a/alc/inprogext.h b/alc/inprogext.h index 781ccfd3..3a7344bc 100644 --- a/alc/inprogext.h +++ b/alc/inprogext.h @@ -94,6 +94,15 @@ ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device, const ALCchar *de #define AL_STOP_SOURCES_ON_DISCONNECT_SOFT 0x19AB #endif +#ifndef ALC_SOFT_output_mode +#define ALC_SOFT_output_mode +#define ALC_OUTPUT_MODE_SOFT 0x19AC +#define ALC_NORMAL_SOFT 0x19AD +#define ALC_STEREO_UHJ_SOFT 0x19AE +/*#define ALC_HRTF_SOFT 0x1992*/ +#define ALC_ANY_SOFT 0x19AF +#endif + #ifdef __cplusplus } /* extern "C" */ #endif |