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