diff --git a/al/buffer.cpp b/al/buffer.cpp index 8f4228a8..abad6236 100644 --- a/al/buffer.cpp +++ b/al/buffer.cpp @@ -1090,6 +1090,26 @@ START_API_FUNC albuf->PackAlign = static_cast(value); break; + case AL_AMBISONIC_LAYOUT_SOFT: + if UNLIKELY(ReadRef(albuf->ref) != 0) + context->setError(AL_INVALID_OPERATION, "Modifying in-use buffer %u's ambisonic layout", + buffer); + else if UNLIKELY(value != AL_FUMA_SOFT && value != AL_ACN_SOFT) + context->setError(AL_INVALID_VALUE, "Invalid unpack ambisonic layout %04x", value); + else + albuf->AmbiLayout = value; + break; + + case AL_AMBISONIC_SCALING_SOFT: + if UNLIKELY(ReadRef(albuf->ref) != 0) + context->setError(AL_INVALID_OPERATION, "Modifying in-use buffer %u's ambisonic scaling", + buffer); + else if UNLIKELY(value != AL_FUMA_SOFT && value != AL_SN3D_SOFT && value != AL_N3D_SOFT) + context->setError(AL_INVALID_VALUE, "Invalid unpack ambisonic scaling %04x", value); + else + albuf->AmbiScaling = value; + break; + default: context->setError(AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); } @@ -1125,6 +1145,8 @@ START_API_FUNC { case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: case AL_PACK_BLOCK_ALIGNMENT_SOFT: + case AL_AMBISONIC_LAYOUT_SOFT: + case AL_AMBISONIC_SCALING_SOFT: alBufferi(buffer, param, values[0]); return; } @@ -1277,6 +1299,14 @@ START_API_FUNC *value = static_cast(albuf->PackAlign); break; + case AL_AMBISONIC_LAYOUT_SOFT: + *value = albuf->AmbiLayout; + break; + + case AL_AMBISONIC_SCALING_SOFT: + *value = albuf->AmbiScaling; + break; + default: context->setError(AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); } @@ -1317,6 +1347,8 @@ START_API_FUNC case AL_SAMPLE_LENGTH_SOFT: case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: case AL_PACK_BLOCK_ALIGNMENT_SOFT: + case AL_AMBISONIC_LAYOUT_SOFT: + case AL_AMBISONIC_SCALING_SOFT: alGetBufferi(buffer, param, values); return; } diff --git a/al/buffer.h b/al/buffer.h index d41eec5d..ad7aeb35 100644 --- a/al/buffer.h +++ b/al/buffer.h @@ -79,6 +79,9 @@ struct ALbuffer { ALuint OriginalSize{0}; ALuint OriginalAlign{0}; + ALenum AmbiLayout{AL_FUMA_SOFT}; + ALenum AmbiScaling{AL_FUMA_SOFT}; + ALuint LoopStart{0u}; ALuint LoopEnd{0u}; diff --git a/alc/alc.cpp b/alc/alc.cpp index 0a90a14f..05f90d38 100644 --- a/alc/alc.cpp +++ b/alc/alc.cpp @@ -825,6 +825,7 @@ constexpr ALchar alExtList[] = "AL_EXT_SOURCE_RADIUS " "AL_EXT_STEREO_ANGLES " "AL_LOKI_quadriphonic " + "AL_SOFTX_bformat_ex " "AL_SOFT_block_alignment " "AL_SOFT_deferred_updates " "AL_SOFT_direct_channels " diff --git a/alc/inprogext.h b/alc/inprogext.h index ad3ea288..d1890e70 100644 --- a/alc/inprogext.h +++ b/alc/inprogext.h @@ -77,6 +77,21 @@ AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values); #define AL_EFFECTSLOT_TARGET_SOFT 0xf000 #endif +#ifndef AL_SOFT_bformat_ex +#define AL_SOFT_bformat_ex +#define AL_AMBISONIC_LAYOUT_SOFT 0x1997 +#define AL_AMBISONIC_SCALING_SOFT 0x1998 + +/* Ambisonic layouts */ +#define AL_FUMA_SOFT 0x0000 +#define AL_ACN_SOFT 0x0001 + +/* Ambisonic scalings (normalization) */ +/*#define AL_FUMA_SOFT*/ +#define AL_SN3D_SOFT 0x0001 +#define AL_N3D_SOFT 0x0002 +#endif + #ifdef __cplusplus } /* extern "C" */ #endif