Hi all,
here is a new patch for the Doppler effect, which should work on every OS.
Please report, if you get any error messages or hear any unexpected sound.

(Due to some debug-error-messages not intended to go into cvs)

Maik


Maik Justus schrieb am 28.06.2007 20:22:
Hi Erik,

Erik Hofman schrieb am 28.06.2007 08:50:
Maik Justus wrote:
  > That would be the best. But how to know, that 1.2 would work? It looks

If version 1.2 still contains this bug it will be noticed rather quickly and changing the test would be easy.

ok, I will test for the 1.2 and use the OpenAL Doppler calculation if successful.
like, if the OpenAL Doppler effect bugs are a never ending story. And they do not work correctly at Linux (at least not on every build). For a short while I thought it would be the best, to use always the own calculation. But then I learned, that some (all?) Linux versions of OpenAL report them self as version 1.1 (in the header file), but do limit the allowed pitch range of a sound, which is in contrary to the
As I understand it implementations are free to limit the pitch range and I know almost for sure that Creative implementations don't allow pitch settings above 2.0 due to hardware limits.
Yes, the driver is allowed to clamp the pitch, but the allowed range to pass to OpenAL is (0.0f,any], therefore I wouldn't expect an error reported by alGetError(). But no problem, I just will ignore if alGetError() returns an error after setting the pitch value.

I will try to make a patch for all reported bugs (up to know).
Erik

Maik

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel


Index: sound/sample_openal.cxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/sound/sample_openal.cxx,v
retrieving revision 1.27
diff -u -p -r1.27 sample_openal.cxx
--- sound/sample_openal.cxx     21 Jun 2007 21:46:21 -0000      1.27
+++ sound/sample_openal.cxx     28 Jun 2007 19:22:14 -0000
@@ -75,12 +75,17 @@ SGSoundSample::SGSoundSample() :
     reference_dist(500.0),
     max_dist(3000.),
     loop(AL_FALSE),
-    playing(false)
+#ifdef USE_SOFTWARE_DOPPLER
+    doppler_pitch_factor(1),
+    doppler_volume_factor(1),
+#endif
+    playing(false),
+    no_Doppler_effect(true)
 {
 }
 
 // constructor
-SGSoundSample::SGSoundSample( const char *path, const char *file) :
+SGSoundSample::SGSoundSample( const char *path, const char *file , bool 
_no_Doppler_effect ) :
     buffer(0),
     source(0),
     pitch(1.0),
@@ -88,8 +93,13 @@ SGSoundSample::SGSoundSample( const char
     reference_dist(500.0),
     max_dist(3000.),
     loop(AL_FALSE),
-    playing(false)
-{
+#ifdef USE_SOFTWARE_DOPPLER
+    doppler_pitch_factor(1),
+    doppler_volume_factor(1),
+#endif
+    playing(false),
+    no_Doppler_effect(_no_Doppler_effect)
+    {
     SGPath samplepath( path );
     if ( strlen(file) ) {
         samplepath.append( file );
@@ -145,7 +155,7 @@ SGSoundSample::SGSoundSample( const char
 }
 
 // constructor
-SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
+SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq , bool 
_no_Doppler_effect ) :
     buffer(0),
     source(0),
     pitch(1.0),
@@ -153,7 +163,12 @@ SGSoundSample::SGSoundSample( unsigned c
     reference_dist(500.0),
     max_dist(3000.),
     loop(AL_FALSE),
-    playing(false)
+#ifdef USE_SOFTWARE_DOPPLER
+    doppler_pitch_factor(1),
+    doppler_volume_factor(1),
+#endif
+    playing(false),
+    no_Doppler_effect(_no_Doppler_effect)
 {
     SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" );
 
@@ -247,14 +262,23 @@ SGSoundSample::bind_source() {
     }
 
     alSourcei( source, AL_BUFFER, buffer );
+#ifndef USE_SOFTWARE_DOPPLER
     alSourcef( source, AL_PITCH, pitch );
     alSourcef( source, AL_GAIN, volume );
+#else
+    print_openal_error("bind_sources return");
+    alSourcef( source, AL_PITCH, pitch *doppler_pitch_factor );
+    alGetError(); //ignore if the pitch is clamped by the driver
+    alSourcef( source, AL_GAIN, volume *doppler_volume_factor );
+#endif
     alSourcefv( source, AL_POSITION, source_pos );
     alSourcefv( source, AL_DIRECTION, direction );
     alSourcef( source, AL_CONE_INNER_ANGLE, inner );
     alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
     alSourcef( source, AL_CONE_OUTER_GAIN, outergain);
+#ifdef USE_OPEN_AL_DOPPLER
     alSourcefv( source, AL_VELOCITY, source_vel );
+#endif
     alSourcei( source, AL_LOOPING, loop );
 
     alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE );
@@ -273,8 +297,13 @@ SGSoundSample::set_pitch( double p ) {
     if ( p > 2.0 ) { p = 2.0; }
     pitch = p;
     if (playing) {
+#ifndef USE_SOFTWARE_DOPPLER
         alSourcef( source, AL_PITCH, pitch );
         print_openal_error("set_pitch");
+#else
+        alSourcef( source, AL_PITCH, pitch * doppler_pitch_factor );
+        alGetError(); //ignore if the pitch is clamped by the driver
+#endif
     }
 }
 
@@ -282,7 +311,11 @@ void
 SGSoundSample::set_volume( double v ) {
     volume = v;
     if (playing) {
+#ifndef USE_SOFTWARE_DOPPLER
         alSourcef( source, AL_GAIN, volume );
+#else
+        alSourcef( source, AL_GAIN, volume * doppler_volume_factor );
+#endif
         print_openal_error("set_volume");
     }
 }
@@ -313,6 +346,7 @@ SGSoundSample::set_source_pos( ALfloat *
         sgAddVec3( final_pos, source_pos, offset_pos );
 
         alSourcefv( source, AL_POSITION, final_pos );
+        print_openal_error("set_source_pos");
     }
 }
 
@@ -327,6 +361,7 @@ SGSoundSample::set_offset_pos( ALfloat *
         sgAddVec3( final_pos, source_pos, offset_pos );
 
         alSourcefv( source, AL_POSITION, final_pos );
+        print_openal_error("set_offset_pos");
     }
 }
 
@@ -350,13 +385,88 @@ SGSoundSample::set_orientation( ALfloat 
 }
 
 void
-SGSoundSample::set_source_vel( ALfloat *vel ) {
-    source_vel[0] = vel[0];
-    source_vel[1] = vel[1];
-    source_vel[2] = vel[2];
+SGSoundSample::set_source_vel( ALfloat *vel , ALfloat *listener_vel ) {
+    if (no_Doppler_effect) {
+        source_vel[0] = listener_vel[0];
+        source_vel[1] = listener_vel[1];
+        source_vel[2] = listener_vel[2];
+    } else {
+        source_vel[0] = vel[0];
+        source_vel[1] = vel[1];
+        source_vel[2] = vel[2];
+    }
+#ifdef USE_OPEN_AL_DOPPLER
     if (playing) {
         alSourcefv( source, AL_VELOCITY, source_vel );
     }
+#elif defined (USE_OPEN_AL_DOPPLER_WITH_FIXED_LISTENER)
+    if (playing) {
+        sgVec3 relative_vel;
+        sgSubVec3( relative_vel, source_vel, listener_vel );
+        alSourcefv( source, AL_VELOCITY, relative_vel );
+    }
+#else
+    if (no_Doppler_effect) {
+        doppler_pitch_factor = 1;
+        doppler_volume_factor = 1;
+        return;
+    }
+    double doppler, mfp;
+    sgVec3 final_pos;
+    sgAddVec3( final_pos, source_pos, offset_pos );
+    mfp = sgLengthVec3(final_pos);
+    if (mfp > 1e-6) {
+        double vls = - sgScalarProductVec3( listener_vel, final_pos ) / mfp;
+        double vss = - sgScalarProductVec3( source_vel, final_pos ) / mfp;
+        if (fabs(340 - vss) > 1e-6)
+        {
+            doppler = (340 - vls) / (340 - vss);
+            doppler = ( doppler > 0) ? ( ( doppler < 10) ? doppler : 10 ) : 0;
+        }
+        else
+            doppler = 0;
+    }
+    else
+        doppler = 1;
+    /* the OpenAL documentation of the Doppler calculation
+    SS: AL_SPEED_OF_SOUND = speed of sound (default value 343.3)
+    DF: AL_DOPPLER_FACTOR = Doppler factor (default 1.0)
+    vls: Listener velocity scalar (scalar, projected on source-to-listener 
vector)
+    vss: Source velocity scalar (scalar, projected on source-to-listener 
vector)
+    SL = source to listener vector
+    SV = Source Velocity vector
+    LV = Listener Velocity vector
+    vls = DotProduct(SL, LV) / Mag(SL)
+    vss = DotProduct(SL, SV) / Mag(SL)
+    Dopper Calculation:
+    vss = min(vss, SS/DF)
+    vls = min(vls, SS/DF)
+    f' = f * (SS - DF*vls) / (SS - DF*vss)
+    */
+    if (doppler > 0.1) {
+        if (doppler < 10) {
+            doppler_pitch_factor = doppler;
+            doppler_volume_factor = 1;
+        }
+        else {
+            doppler_pitch_factor = (doppler < 11) ? doppler : 11;
+            doppler_volume_factor = (doppler < 11) ? 11-doppler : 0;
+        }
+    }
+    else {
+        doppler_pitch_factor = 0.1;
+        doppler_volume_factor = (doppler > 0) ? doppler * 10 : 0;
+    }
+    if (playing) {
+        alSourcef( source, AL_GAIN, volume * doppler_volume_factor );
+        //print_openal_error("set_source_vel: volume");
+        char t[256];
+        sprintf(t,"set_source_vel: vol: %6.2f dvf: 
%6.2f",volume,doppler_volume_factor);
+        print_openal_error(t);
+        alSourcef( source, AL_PITCH, pitch * doppler_pitch_factor );
+        alGetError(); //ignore if the pitch is clamped
+    }
+#endif
 }
 
 void
Index: sound/sample_openal.hxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/sound/sample_openal.hxx,v
retrieving revision 1.17
diff -u -p -r1.17 sample_openal.hxx
--- sound/sample_openal.hxx     8 Mar 2006 18:16:09 -0000       1.17
+++ sound/sample_openal.hxx     28 Jun 2007 19:22:14 -0000
@@ -52,6 +52,17 @@
 # include <AL/alut.h>
 #endif
 
+#ifndef HAVE_WINDOWS_H
+ #ifdef AL_VERSION_1_2
+  #define USE_OPEN_AL_DOPPLER should work
+ #else
+  #define USE_OPEN_AL_DOPPLER_WITH_FIXED_LISTENER better than nothing
+ #endif
+#else
+//the Open_AL Doppler calculation seem to be buggy on windows
+ #define USE_SOFTWARE_DOPPLER seem to be necessary
+#endif
+
 SG_USING_STD(string);
 
 /**
@@ -90,12 +101,17 @@ private:
 
     double pitch;
     double volume;
+#ifdef USE_SOFTWARE_DOPPLER
+    double doppler_pitch_factor;
+    double doppler_volume_factor;
+#endif
     double reference_dist;
     double max_dist;
     ALboolean loop;
 
     bool playing;
     bool bind_source();
+    bool no_Doppler_effect;
 
 public:
 
@@ -112,7 +128,7 @@ public:
        should usually be true unless you want to manipulate the data
        later.)
      */
-    SGSoundSample( const char *path, const char *file );
+    SGSoundSample( const char *path, const char *file , bool no_Doppler_effect 
= true );
 
     /**
      * Constructor.
@@ -123,7 +139,7 @@ public:
        should usually be true unless you want to manipulate the data
        later.)
      */
-    SGSoundSample( unsigned char *_data, int len, int _freq );
+    SGSoundSample( unsigned char *_data, int len, int _freq , bool 
no_Doppler_effect = true );
 
     ~SGSoundSample();
 
@@ -208,7 +224,7 @@ public:
     /**
      * Set velocity of sound source (uses same coordinate system as opengl)
      */
-    void set_source_vel( ALfloat *vel );
+    void set_source_vel( ALfloat *vel , ALfloat *listener_vel );
 
 
     /**
Index: sound/soundmgr_openal.cxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/sound/soundmgr_openal.cxx,v
retrieving revision 1.25
diff -u -p -r1.25 soundmgr_openal.cxx
--- sound/soundmgr_openal.cxx   22 Oct 2006 19:42:17 -0000      1.25
+++ sound/soundmgr_openal.cxx   28 Jun 2007 19:22:15 -0000
@@ -345,6 +345,6 @@ void SGSoundMgr::set_source_vel_all( ALf
     sample_map_iterator sample_end = samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
        SGSoundSample *sample = sample_current->second;
-        sample->set_source_vel( vel );
+        sample->set_source_vel( vel , listener_vel );
     }
 }
Index: sound/soundmgr_openal.hxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/sound/soundmgr_openal.hxx,v
retrieving revision 1.8
diff -u -p -r1.8 soundmgr_openal.hxx
--- sound/soundmgr_openal.hxx   8 Mar 2006 18:16:09 -0000       1.8
+++ sound/soundmgr_openal.hxx   28 Jun 2007 19:22:16 -0000
@@ -206,7 +206,9 @@ public:
         listener_vel[0] = vel[0];
         listener_vel[1] = vel[1];
         listener_vel[2] = vel[2];
+#ifdef USE_OPEN_AL_DOPPLER
         alListenerfv( AL_VELOCITY, listener_vel );
+#endif
     }
 
     /**
Index: sound/xmlsound.cxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/sound/xmlsound.cxx,v
retrieving revision 1.21
diff -u -p -r1.21 xmlsound.cxx
--- sound/xmlsound.cxx  23 Jun 2007 16:48:01 -0000      1.21
+++ sound/xmlsound.cxx  28 Jun 2007 19:22:17 -0000
@@ -272,7 +272,8 @@ SGXmlSound::init(SGPropertyNode *root, S
        // "alSource".  The semantics of what is going on here seems
        // confused and needs to be thought through more carefully.
         _sample = new SGSoundSample( path.c_str(),
-                                    node->getStringValue("path", "") );
+                                    node->getStringValue("path", ""),
+                                    false );
 
        _mgr->add( _sample, _name );
    }
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to