1
0
Fork 0

Tracked down a potential segfault when trying to audibly ident a vor station.

This led to an investigation into why the ident playing didn't work anymore.
Recent changes in the sound manager broke some assumptions the radiostack
code was making.  These patches should hopefully fix all that back up.
Erik, please review these changes to double check I didn't do more damage
than good. :-)
This commit is contained in:
curt 2002-04-18 21:43:00 +00:00
parent 4c30ccf2d4
commit 97cc733ac8
3 changed files with 87 additions and 29 deletions

View file

@ -473,20 +473,36 @@ FGRadioStack::update(int dt)
if ( nav1_vol_btn > 0.1 && nav1_ident_btn ) {
FGSimpleSound *sound;
sound = globals->get_soundmgr()->find( "nav1-vor-ident" );
sound->set_volume( nav1_vol_btn * 0.3 );
if ( sound != NULL ) {
sound->set_volume( nav1_vol_btn );
} else {
SG_LOG( SG_COCKPIT, SG_ALERT,
"Can't find nav1-vor-ident sound" );
}
sound = globals->get_soundmgr()->find( "nav1-dme-ident" );
sound->set_volume( nav1_vol_btn * 0.3 );
if ( sound != NULL ) {
sound->set_volume( nav1_vol_btn );
} else {
SG_LOG( SG_COCKPIT, SG_ALERT,
"Can't find nav1-dme-ident sound" );
}
// cout << "nav1_last_time = " << nav1_last_time << " ";
// cout << "cur_time = " << globals->get_time_params()->get_cur_time();
if ( nav1_last_time <
globals->get_time_params()->get_cur_time() - 30 ) {
nav1_last_time = globals->get_time_params()->get_cur_time();
nav1_play_count = 0;
}
// cout << " nav1_play_count = " << nav1_play_count << endl;
// cout << "playing = "
// << globals->get_soundmgr()->is_playing("nav1-vor-ident")
// << endl;
if ( nav1_play_count < 4 ) {
// play VOR ident
if ( !globals->get_soundmgr()->is_playing("nav1-vor-ident") ) {
globals->get_soundmgr()->play_once( "nav1-vor-ident" );
++nav1_play_count;
}
}
} else if ( nav1_play_count < 5 && nav1_has_dme ) {
// play DME ident
if ( !globals->get_soundmgr()->is_playing("nav1-vor-ident") &&
@ -564,10 +580,20 @@ FGRadioStack::update(int dt)
if ( nav2_vol_btn > 0.1 && nav2_ident_btn ) {
FGSimpleSound *sound;
sound = globals->get_soundmgr()->find( "nav2-vor-ident" );
sound->set_volume( nav2_vol_btn * 0.3 );
if ( sound != NULL ) {
sound->set_volume( nav2_vol_btn );
} else {
SG_LOG( SG_COCKPIT, SG_ALERT,
"Can't find nav2-vor-ident sound" );
}
sound = globals->get_soundmgr()->find( "nav2-dme-ident" );
sound->set_volume( nav2_vol_btn * 0.3 );
if ( nav2_last_time <
if ( sound != NULL ) {
sound->set_volume( nav2_vol_btn );
} else {
SG_LOG( SG_COCKPIT, SG_ALERT,
"Can't find nav2-dme-ident sound" );
}
if ( nav2_last_time <
globals->get_time_params()->get_cur_time() - 30 ) {
nav2_last_time = globals->get_time_params()->get_cur_time();
nav2_play_count = 0;
@ -679,7 +705,11 @@ FGRadioStack::update(int dt)
if ( adf_vol_btn > 0.1 && adf_ident_btn ) {
FGSimpleSound *sound;
sound = globals->get_soundmgr()->find( "adf-ident" );
sound->set_volume( adf_vol_btn * 0.3 );
if ( sound != NULL ) {
sound->set_volume( adf_vol_btn );
} else {
SG_LOG( SG_COCKPIT, SG_ALERT, "Can't find adf-ident sound" );
}
if ( adf_last_time <
globals->get_time_params()->get_cur_time() - 30 ) {
adf_last_time = globals->get_time_params()->get_cur_time();
@ -863,7 +893,11 @@ void FGRadioStack::search()
FGSimpleSound *sound;
sound = morse.make_ident( nav1_trans_ident, LO_FREQUENCY );
sound->set_volume( 0.3 );
globals->get_soundmgr()->add( sound, "nav1-vor-ident" );
if ( globals->get_soundmgr()->add( sound, "nav1-vor-ident" ) ) {
// cout << "Added nav1-vor-ident sound" << endl;
} else {
// cout << "Failed to add v1-vor-ident sound" << endl;
}
if ( globals->get_soundmgr()->exists( "nav1-dme-ident" ) ) {
globals->get_soundmgr()->remove( "nav1-dme-ident" );
@ -892,7 +926,9 @@ void FGRadioStack::search()
nav1_trans_ident = "";
last_nav1_ident = "";
#ifdef ENABLE_AUDIO_SUPPORT
globals->get_soundmgr()->remove( "nav1-vor-ident" );
if ( ! globals->get_soundmgr()->remove( "nav1-vor-ident" ) ) {
// cout << "Failed to remove nav1-vor-ident sound" << endl;
}
globals->get_soundmgr()->remove( "nav1-dme-ident" );
#endif
// cout << "not picking up vor1. :-(" << endl;

View file

@ -75,14 +75,18 @@ FGSimpleSound::~FGSimpleSound() {
void FGSimpleSound::play( slScheduler *sched, bool looped ) {
requests++;
if (requests > 1)
return;
// make sure sound isn't already playing
if ( sample->getPlayCount() > 0 ) {
return;
}
// sched->stopSample(sample);
if (looped)
sched->loopSample(sample);
else
sched->playSample(sample);
if ( looped ) {
sched->loopSample(sample);
} else {
sched->playSample(sample);
}
sched->addSampleEnvelope(sample, 0, 0, pitch_envelope, SL_PITCH_ENVELOPE);
sched->addSampleEnvelope(sample, 0, 1, volume_envelope, SL_VOLUME_ENVELOPE);
@ -90,14 +94,17 @@ void FGSimpleSound::play( slScheduler *sched, bool looped ) {
void FGSimpleSound::stop( slScheduler *sched, bool quick ) {
if (quick)
requests = 0;
else
if (--requests < 0)
requests = 0;
if ( quick ) {
requests = 0;
} else {
if ( --requests < 0 ) {
requests = 0;
}
}
if (requests > 0)
if ( requests > 0 ) {
return;
}
sched->stopSample( sample );
}
@ -226,9 +233,18 @@ void FGSoundMgr::update(int dt) {
// add a sound effect, return true if successful
bool FGSoundMgr::add( FGSimpleSound *sound, const string& refname ) {
sample_map_iterator it = samples.find(refname);
if (it != samples.end())
return false;
sound_map_iterator sound_it = sounds.find( refname );
if ( sound_it != sounds.end() ) {
// sound already exists
return false;
}
sample_map_iterator sample_it = samples.find( refname );
if ( sample_it != samples.end() ) {
// this sound has existed in the past and it's sample is still
// here, delete the sample so we can replace it.
samples.erase( sample_it );
}
sample_ref *sr = new sample_ref;
@ -241,6 +257,7 @@ bool FGSoundMgr::add( FGSimpleSound *sound, const string& refname ) {
return true;
}
// add a sound from a file, return the sample if successful, else return NULL
FGSimpleSound *FGSoundMgr::add( const string& refname, const string &file ) {
FGSimpleSound *sound;
@ -272,6 +289,7 @@ FGSimpleSound *FGSoundMgr::add( const string& refname, const string &file ) {
return sound;
}
// remove a sound effect, return true if successful
bool FGSoundMgr::remove( const string& refname ) {
@ -306,9 +324,11 @@ bool FGSoundMgr::remove( const string& refname ) {
// delete sample;
sounds.erase( it );
// cout << "sndmgr: removed -> " << refname << endl;
return true;
} else {
return false;
} else {
// cout << "sndmgr: failed remove -> " << refname << endl;
return false;
}
}
@ -330,7 +350,7 @@ FGSimpleSound *FGSoundMgr::find( const string& refname ) {
sound_map_iterator it = sounds.find( refname );
if ( it != sounds.end() ) {
return it->second;
} else {
} else {
return NULL;
}
}
@ -368,7 +388,7 @@ bool FGSoundMgr::is_playing( const string& refname ) {
if ((sample = find( refname )) == NULL)
return false;
return sample->is_playing();
return (sample->get_sample()->getPlayCount() > 0 );
}

View file

@ -70,7 +70,9 @@ public:
inline void play_once( slScheduler *sched ) { play( sched, false); }
inline void play_looped( slScheduler *sched ) { play( sched, true); }
inline bool is_playing( ) { return (requests > 0 ); }
inline bool is_playing( ) {
return ( sample->getPlayCount() > 0 );
}
inline double get_pitch() const { return pitch; }
inline void set_pitch( double p ) {