Add an option to reverse Z panning of mono sources
Applications that are not built around OpenAL's orientation system need to convert their given vectors to it. Depending on how this is done, it can lead to proper stereo (left-right) panning with improper surround sound (front-back) panning, which thusly sounds correct with stereo output and incorrect with 4+ channel output. This option is intended to help fix playback of such applications on surround sound systems, without having to resort to forcing stereo output.
This commit is contained in:
parent
7972f7a2da
commit
db3cb23c1d
@ -393,6 +393,9 @@ static FILE *LogFile;
|
||||
// Cone scalar
|
||||
ALdouble ConeScale = 0.5;
|
||||
|
||||
// Localized Z scalar for mono sources
|
||||
ALdouble ZScale = 1.0;
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@ -466,6 +469,10 @@ static void alc_init(void)
|
||||
if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
|
||||
ConeScale = 1.0;
|
||||
|
||||
str = getenv("__ALSOFT_REVERSE_Z");
|
||||
if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
|
||||
ZScale = -1.0;
|
||||
|
||||
InitializeCriticalSection(&g_csMutex);
|
||||
ALTHUNK_INIT();
|
||||
ReadALConfig();
|
||||
|
@ -822,8 +822,8 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
||||
{
|
||||
const ALshort *hrtf_left, *hrtf_right;
|
||||
|
||||
GetHrtfCoeffs(atan2(Position[1], -Position[2]) * (180.0/M_PI),
|
||||
atan2(Position[0], -Position[2]) * (180.0/M_PI),
|
||||
GetHrtfCoeffs(atan2(Position[1], -Position[2]*ZScale) * (180.0/M_PI),
|
||||
atan2(Position[0], -Position[2]*ZScale) * (180.0/M_PI),
|
||||
&hrtf_left, &hrtf_right);
|
||||
for(i = 0;i < HRTF_LENGTH;i++)
|
||||
{
|
||||
@ -835,7 +835,7 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
||||
}
|
||||
else
|
||||
{
|
||||
pos = aluCart2LUTpos(-Position[2], Position[0]);
|
||||
pos = aluCart2LUTpos(-Position[2]*ZScale, Position[0]);
|
||||
SpeakerGain = &Device->PanningLUT[MAXCHANNELS * pos];
|
||||
|
||||
DirGain = aluSqrt(Position[0]*Position[0] + Position[2]*Position[2]);
|
||||
|
@ -604,6 +604,7 @@ void al_print(const char *fname, unsigned int line, const char *fmt, ...)
|
||||
#define AL_PRINT(...) al_print(__FILE__, __LINE__, __VA_ARGS__)
|
||||
|
||||
extern ALdouble ConeScale;
|
||||
extern ALdouble ZScale;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user