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:
Chris Robinson 2011-05-07 03:54:46 -07:00
parent 7972f7a2da
commit db3cb23c1d
3 changed files with 11 additions and 3 deletions

View File

@ -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();

View File

@ -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]);

View File

@ -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
}