aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2008-08-08 07:32:21 -0700
committerChris Robinson <[email protected]>2008-08-08 07:32:21 -0700
commitef59901e7c5b8813214fde6ee090d835c67277fd (patch)
tree24407563ad5ab63d8081844696e8d58b4f6a0eaf
parentcfe620ccb5496f8e928cdba0c74fd26b5fd87f34 (diff)
Set FPU mode to round toward zero for mixing
-rw-r--r--Alc/ALu.c17
-rw-r--r--CMakeLists.txt4
2 files changed, 20 insertions, 1 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 404dea66..4454b8d4 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -650,9 +650,20 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
ALuint loop;
ALint64 DataSize64,DataPos64;
FILTER *Filter;
+ int fpuState;
SuspendContext(ALContext);
+#if defined(HAVE_FESETROUND)
+ fpuState = fegetround();
+ fesetround(FE_TOWARDZERO);
+#elif defined(HAVE__CONTROLFP)
+ fpuState = _controlfp(0, 0);
+ _controlfp(_RC_CHOP, _MCW_RC);
+#else
+ (void)fpuState;
+#endif
+
//Figure output format variables
BlockAlign = aluChannelsFromFormat(format);
BlockAlign *= aluBytesFromFormat(format);
@@ -1206,5 +1217,11 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
size -= SamplesToDo;
}
+#if defined(HAVE_FESETROUND)
+ fesetround(fpuState);
+#elif defined(HAVE__CONTROLFP)
+ _controlfp(fpuState, 0xfffff);
+#endif
+
ProcessContext(ALContext);
}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 870edb0b..4ed1f898 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -112,10 +112,12 @@ ENDIF()
CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
-IF(HAVE_SQRTF OR HAVE_ACOSF)
+CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
+IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
SET(EXTRA_LIBS m ${EXTRA_LIBS})
ENDIF()
CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
+CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
IF(NOT HAVE_STRCASECMP)