On Friday 06 July 2007 18:27, John Denker wrote:
> It's been ten days now with no CVS-commit nor even any
> discussion of a CVS-commit AFAICT.
That's probably about right.  I and a few others on IRC were testing various 
patches for Maik for a while... I thought that the results of that made it to 
the devel list, but to remove any doubt about, I'll attach (what I think is) 
the last one here.

> If you send me the appropriate patch [off list or otherwise]
> I'll be happy to try it.

If I'm not mistaken, attached is the patch I'm currently using and I haven't 
noticed any problems with other than the slightly odd (but expected, and no 
doubt correct) effect one gets if one moves the view really quickly when in 
external view.

Let us know if you find otherwise...

Cheers,

AJ
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