Hi,
I forgot: only for osg/head.
Maik

Maik Justus schrieb am 28.06.2007 22:55:
> 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
>   


-------------------------------------------------------------------------
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