aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--alc/alc.cpp40
-rw-r--r--alc/inprogext.h9
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