]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/soundmgr_openal.cxx
I don't understand why FreeBSD doesn't see isnan() after including math.h
[simgear.git] / simgear / sound / soundmgr_openal.cxx
index 2578f1ccad87c67c0d01a11ca4b23f00b12e609e..0785edb5a63c7193a8fe74ca15cd4ab5ae468041 100644 (file)
@@ -5,7 +5,7 @@
 //
 // C++-ified by Curtis Olson, started March 2001.
 //
-// Copyright (C) 2001  Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2001  Curtis L. Olson - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 //
 // $Id$
 
-#include <iostream>
+#include <simgear/compiler.h>
 
-#include <AL/al.h>
-#include <AL/alut.h>
-#include <AL/alc.h>
+#if defined(__APPLE__)
+# include <OpenAL/al.h>
+# include <OpenAL/alut.h>
+# include <OpenAL/alc.h>
+#else
+# include <AL/al.h>
+# include <AL/alut.h>
+# 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
+
+#if defined (__FreeBSD__)
+inline int isnan(double r) { return !(r < 0 || r > 0); }
+#endif
+
+#include STL_IOSTREAM
 
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -42,7 +65,7 @@
 // constructor
 SGSoundMgr::SGSoundMgr() {
 
-    SG_LOG( SG_GENERAL, SG_ALERT, "Initializing OpenAL sound manager" );
+    SG_LOG( SG_GENERAL, SG_INFO, "Initializing OpenAL sound manager" );
 
     // initialize OpenAL
     alutInit( 0, NULL );
@@ -77,6 +100,10 @@ SGSoundMgr::SGSoundMgr() {
        SG_LOG( SG_GENERAL, SG_ALERT,
                 "Oops AL error after audio initialization!" );
     }
+
+    // exaggerate the ear candy?
+    alDopplerFactor(1.0);
+    alDopplerVelocity(340.0);  // speed of sound in meters per second.
 }
 
 // destructor
@@ -261,3 +288,35 @@ bool SGSoundMgr::stop( const string& refname ) {
         return true;
     }
 }
+
+
+// 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 ) {
+       SGSoundSample *sample = sample_current->second;
+        sample->set_source_pos( 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 ) {
+       SGSoundSample *sample = sample_current->second;
+        sample->set_source_vel( vel );
+    }
+}