If we pass in a position or velocity of nan, openal will generate an assertion.

Under rare circumstances we could encounter a non-cooperative external fdm
that could trigger this condition.  This patch catches the problem and returns
rather than letting FG get killed.
This commit is contained in:
curt
2004-07-01 19:05:37 +00:00
parent 5034346b67
commit a7b35c6e22

View File

@@ -23,7 +23,7 @@
//
// $Id$
#include <iostream>
#include <simgear/compiler.h>
#if defined(__APPLE__)
# include <OpenAL/al.h>
@@ -35,6 +35,19 @@
# include <AL/alc.h>
#endif
#if defined (__APPLE__)
// any C++ header file undefines isinf and isnan
// so this should be included before <iostream>
inline int (isinf)(double r) { return isinf(r); }
inline int (isnan)(double r) { return isnan(r); }
#endif
#if defined(__MINGW32__)
#define isnan(x) _isnan(x)
#endif
#include STL_IOSTREAM
#include <simgear/debug/logstream.hxx>
#include <simgear/misc/sg_path.hxx>
@@ -275,6 +288,11 @@ bool SGSoundMgr::stop( const string& refname ) {
// set source position of all managed sounds
void SGSoundMgr::set_source_pos_all( ALfloat *pos ) {
if ( isnan(pos[0]) || isnan(pos[1]) || isnan(pos[2]) ) {
// bail if a bad position is passed in
return;
}
sample_map_iterator sample_current = samples.begin();
sample_map_iterator sample_end = samples.end();
for ( ; sample_current != sample_end; ++sample_current ) {
@@ -286,6 +304,11 @@ void SGSoundMgr::set_source_pos_all( ALfloat *pos ) {
// set source velocity of all managed sounds
void SGSoundMgr::set_source_vel_all( ALfloat *vel ) {
if ( isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2]) ) {
// bail if a bad velocity is passed in
return;
}
sample_map_iterator sample_current = samples.begin();
sample_map_iterator sample_end = samples.end();
for ( ; sample_current != sample_end; ++sample_current ) {