]> git.mxchange.org Git - simgear.git/commitdiff
test for implementations with 'bad' doppler effects and adjust for it.
authorehofman <ehofman>
Mon, 23 Nov 2009 10:32:26 +0000 (10:32 +0000)
committerTim Moore <timoore@redhat.com>
Tue, 24 Nov 2009 13:17:54 +0000 (14:17 +0100)
simgear/sound/sample_group.cxx
simgear/sound/soundmgr_openal.cxx
simgear/sound/soundmgr_openal.hxx

index 9f486413faee02d7aef4890bb57728828efc872c..1c76bfa6bd63c9ffe0e6e1700c91f9e3d73167a2 100644 (file)
@@ -359,6 +359,10 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
         velocity = sample->get_velocity();
     }
 
+    if (_smgr->bad_doppler_effect()) {
+        velocity *= 100.0f;
+    }
+
 #if 0
     if (length(position) > 20000)
         printf("%s source and listener distance greater than 20km!\n",
index ebd3a4b42c1f51b690b98fe03503d72644d01c95..ce415e295a5644be753076bc02b19bd88ab64df1 100644 (file)
@@ -69,7 +69,8 @@ SGSoundMgr::SGSoundMgr() :
     _geod_pos(SGGeod::fromCart(SGVec3d::zeros())),
     _velocity(SGVec3d::zeros()),
     _orientation(SGQuatd::zeros()),
-    _devname(NULL)
+    _devname(NULL), 
+    _bad_doppler(false)
 {
 #if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
     if (_alut_init == 0) {
@@ -155,6 +156,11 @@ void SGSoundMgr::init() {
         else break;
     }
 
+    const char *renderer = (char *)alGetString(AL_RENDERER);
+    if (  strcmp(renderer, "OpenAL Sample Implementation") ) {
+       _bad_doppler = true;
+    }
+
     if (_free_sources.size() == 0) {
         SG_LOG(SG_GENERAL, SG_ALERT, "Unable to grab any OpenAL sources!");
     }
index f3163018c4d35be15f25f522a3ba15283c3f03cb..30801665ccdc0f2f38cc7134aad037e88cacd869 100644 (file)
@@ -260,6 +260,14 @@ public:
      */
     inline bool has_changed() { return _changed; }
 
+    /**
+     * Some implementations seem to need the velocity miltyplied by a
+     * factor of 100 to make them distinct. I've not found if this is
+     * a problem in the implementation or in out code. Until then
+     * this function is used to detect the problematic implementations.
+     */
+    inline bool bad_doppler_effect() { return _bad_doppler; }
+
     /**
      * Load a sample file and return it's configuration and data.
      * @param samplepath Path to the file to load
@@ -304,6 +312,7 @@ private:
     vector<ALuint> _sources_in_use;
 
     char *_devname;
+    bool _bad_doppler;
 
     bool testForALError(string s);
     bool testForALCError(string s);