diff options
Diffstat (limited to 'alc/alc.cpp')
-rw-r--r-- | alc/alc.cpp | 40 |
1 files changed, 32 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); } |