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