X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_group.cxx;h=e2a2b2c73188894f89daeca7316ebd5946ff5910;hb=1f37095087fa7aa3d210ba134058b86c3bd6d69e;hp=4ba82f563818a0e9e627d893d4805fd6bf76a01c;hpb=5b15426cc63036594ab332971ec831a1b5cbccd2;p=simgear.git diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 4ba82f56..e2a2b2c7 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -39,10 +39,10 @@ SGSampleGroup::SGSampleGroup () : _active(false), _changed(false), _pause(false), + _volume(1.0), _tied_to_listener(false), _velocity(SGVec3d::zeros()), - _orientation(SGQuatd::zeros()), - _position_geod(SGGeod()) + _orientation(SGQuatd::zeros()) { _samples.clear(); } @@ -53,10 +53,10 @@ SGSampleGroup::SGSampleGroup ( SGSoundMgr *smgr, const string &refname ) : _active(false), _changed(false), _pause(false), + _volume(1.0), _tied_to_listener(false), _velocity(SGVec3d::zeros()), - _orientation(SGQuatd::zeros()), - _position_geod(SGGeod()) + _orientation(SGQuatd::zeros()) { _smgr->add(this, refname); _samples.clear(); @@ -114,7 +114,7 @@ void SGSampleGroup::update( double dt ) { } // Update the position and orientation information for all samples. - if ( _changed ) { + if ( _changed || _smgr->has_changed() ) { update_pos_and_orientation(); _changed = false; } @@ -146,7 +146,7 @@ void SGSampleGroup::update( double dt ) { ALboolean looping = sample->is_looping() ? AL_TRUE : AL_FALSE; alSourcei( source, AL_LOOPING, looping ); - alSourcef( source, AL_ROLLOFF_FACTOR, 1.0 ); + alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 ); alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE ); alSourcePlay( source ); testForALError("sample play"); @@ -244,9 +244,8 @@ SGSoundSample *SGSampleGroup::find( const string &refname ) { } -// stop playing all associated samples void -SGSampleGroup::suspend () +SGSampleGroup::stop () { _pause = true; sample_map_iterator sample_current = _samples.begin(); @@ -254,28 +253,60 @@ SGSampleGroup::suspend () for ( ; sample_current != sample_end; ++sample_current ) { SGSoundSample *sample = sample_current->second; - if ( sample->is_valid_source() && sample->is_playing() ) { - alSourcePause( sample->get_source() ); + if ( sample->is_valid_source() ) { + ALint source = sample->get_source(); + if ( sample->is_playing() ) { + alSourceStop( source ); + alSourcei( source, AL_BUFFER, 0 ); + } + _smgr->release_source( source ); + sample->no_valid_source(); + } + + if (sample->is_valid_buffer() ) { + _smgr->release_buffer( sample ); + sample->no_valid_buffer(); + } + } + testForALError("stop"); +} + +// stop playing all associated samples +void +SGSampleGroup::suspend () +{ + if (_active && _pause == false) { + _pause = true; + sample_map_iterator sample_current = _samples.begin(); + sample_map_iterator sample_end = _samples.end(); + for ( ; sample_current != sample_end; ++sample_current ) { + SGSoundSample *sample = sample_current->second; + + if ( sample->is_valid_source() && sample->is_playing() ) { + alSourcePause( sample->get_source() ); + } } + testForALError("suspend"); } - testForALError("suspend"); } // resume playing all associated samples void SGSampleGroup::resume () { - sample_map_iterator sample_current = _samples.begin(); - sample_map_iterator sample_end = _samples.end(); - for ( ; sample_current != sample_end; ++sample_current ) { - SGSoundSample *sample = sample_current->second; + if (_active && _pause == true) { + sample_map_iterator sample_current = _samples.begin(); + sample_map_iterator sample_end = _samples.end(); + for ( ; sample_current != sample_end; ++sample_current ) { + SGSoundSample *sample = sample_current->second; - if ( sample->is_valid_source() && sample->is_playing() ) { - alSourcePlay( sample->get_source() ); + if ( sample->is_valid_source() && sample->is_playing() ) { + alSourcePlay( sample->get_source() ); + } } + testForALError("resume"); + _pause = false; } - testForALError("resume"); - _pause = false; } @@ -315,64 +346,37 @@ bool SGSampleGroup::stop( const string& refname ) { return true; } -// set source velocity of all managed sounds -void SGSampleGroup::set_velocity( const SGVec3f &vel ) { - if ( isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2]) ) - { - SG_LOG( SG_GENERAL, SG_ALERT, "NAN's found in SampleGroup velocity"); - return; - } - - if (_velocity != vel) { - sample_map_iterator sample_current = _samples.begin(); - sample_map_iterator sample_end = _samples.end(); - for ( ; sample_current != sample_end; ++sample_current ) { - SGSoundSample *sample = sample_current->second; - sample->set_velocity( vel ); - } - _velocity = vel; +void SGSampleGroup::set_volume( float vol ) +{ + if (vol > _volume*1.01 || vol < _volume*0.99) { + _volume = vol; + if (_volume < 0.0) _volume = 0.0; + if (_volume > 1.0) _volume = 1.0; + _changed = true; } } -// set the source position of all managed sounds +// set the source position and orientation of all managed sounds void SGSampleGroup::update_pos_and_orientation() { - - SGVec3d position = SGVec3d::fromGeod( _position_geod ); - SGVec3d pos_offs = SGVec3d::fromGeod( _smgr->get_position_geod() ); - - // The rotation rotating from the earth centerd frame to - // the horizontal local frame - SGQuatd hlOr = SGQuatd::fromLonLat(_position_geod); - - // Rotate the x-forward, y-right, z-down coordinate system - // into the OpenGL camera system with x-right, y-up, z-back. - SGQuatd q(-0.5, -0.5, 0.5, 0.5); - - // Compute the sounds orientation and position - // wrt the earth centered frame - that is global coorinates - SGQuatd sc2body = hlOr*_orientation*q; - - sample_map_iterator sample_current = _samples.begin(); - sample_map_iterator sample_end = _samples.end(); - for ( ; sample_current != sample_end; ++sample_current ) { - SGSoundSample *sample = sample_current->second; - sample->set_position( position - pos_offs ); - sample->set_orientation( _orientation ); - sample->set_rotation( sc2body ); + + SGVec3d position = SGVec3d::fromGeod(_base_pos) - _smgr->get_position(); + SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos); + SGQuatd ec2body = hlOr*_orientation; + + SGVec3f velocity = SGVec3f::zeros(); + if ( _velocity[0] || _velocity[1] || _velocity[2] ) { + velocity = toVec3f( hlOr.backTransform(_velocity*SG_FEET_TO_METER) ); } -} - -void SGSampleGroup::set_volume( float vol ) -{ - _volume = vol; - if (_volume < 0.0) _volume = 0.0; - if (_volume > 1.0) _volume = 1.0; sample_map_iterator sample_current = _samples.begin(); sample_map_iterator sample_end = _samples.end(); for ( ; sample_current != sample_end; ++sample_current ) { SGSoundSample *sample = sample_current->second; sample->set_master_volume( _volume ); + sample->set_orientation( _orientation ); + sample->set_rotation( ec2body ); + sample->set_position( position ); + sample->set_velocity( velocity ); } } @@ -382,7 +386,7 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) { if ( _tied_to_listener ) { orientation = _smgr->get_direction(); - position = _smgr->get_position(); + position = SGVec3d::zeros(); velocity = _smgr->get_velocity(); } else { sample->update_pos_and_orientation(); @@ -391,9 +395,14 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) { velocity = sample->get_velocity(); } + if (_smgr->bad_doppler_effect()) { + velocity *= 100.0f; + } + #if 0 if (length(position) > 20000) - printf("source and listener distance greater than 20km!\n"); + printf("%s source and listener distance greater than 20km!\n", + _refname.c_str()); if (isNaN(toVec3f(position).data())) printf("NaN in source position\n"); if (isNaN(orientation.data())) printf("NaN in source orientation\n"); if (isNaN(velocity.data())) printf("NaN in source velocity\n");