X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATCDCL%2FATC.cxx;h=41c56e64844998beb1db3d754b6fdedbc169d315;hb=0d9f2e3c9585cfc1fbc392e56c35fda8bef8c334;hp=193b824572c102dd0e9cb6ac111ebe3cb9c9f7bc;hpb=6fcd9f967bf659cc0dcf7288fc82a111e3eaee24;p=flightgear.git diff --git a/src/ATCDCL/ATC.cxx b/src/ATCDCL/ATC.cxx index 193b82457..41c56e648 100644 --- a/src/ATCDCL/ATC.cxx +++ b/src/ATCDCL/ATC.cxx @@ -35,7 +35,9 @@ FGATC::FGATC() : - _voiceOK(false), + _voiceOK(false), + _playing(false), + _sgr(NULL), freqClear(true), receiving(false), respond(false), @@ -55,6 +57,13 @@ FGATC::FGATC() : _counter(0.0), _max_count(5.0) { + SGSoundMgr *smgr = globals->get_soundmgr(); + _sgr = smgr->find("atc", true); + + _volume = fgGetNode("/sim/sound/atc/volume", true); + _enabled = fgGetNode("/sim/sound/atc/enabled", true); + _atc_external = fgGetNode("/sim/sound/atc/external-view", true); + _internal = fgGetNode("/sim/current-view/internal", true); } FGATC::~FGATC() { @@ -103,6 +112,18 @@ void FGATC::Update(double dt) { } } +#ifdef ENABLE_AUDIO_SUPPORT + bool active = _atc_external->getBoolValue() || + _internal->getBoolValue(); + + if ( active && _enabled->getBoolValue() ) { + _sgr->set_volume( _volume->getFloatValue() ); + _sgr->resume(); // no-op if already in resumed state + } else { + _sgr->suspend(); + } +#endif + if(_transmit) { _counter = 0.0; _max_count = 5.0; // FIXME - hardwired length of message - need to calculate it! @@ -203,7 +224,7 @@ int FGATC::RemovePlane() { } void FGATC::SetData(ATCData* d) { - _type = d->type; + _type = d->type; _geod = d->geod; _cart = d->cart; range = d->range; @@ -216,41 +237,36 @@ void FGATC::SetData(ATCData* d) { // Outputs the transmission either on screen or as audio depending on user preference // The refname is a string to identify this sample to the sound manager // The repeating flag indicates whether the message should be repeated continuously or played once. -void FGATC::Render(string& msg, const double volume, - const string& refname, const bool repeating) { +void FGATC::Render(string& msg, const float volume, + const string& refname, const bool repeating) { + if (volume < 0.05) return; + if (repeating) fgSetString("/sim/messages/atis", msg.c_str()); else fgSetString("/sim/messages/atc", msg.c_str()); - #ifdef ENABLE_AUDIO_SUPPORT +#ifdef ENABLE_AUDIO_SUPPORT _voice = (_voiceOK && fgGetBool("/sim/sound/voice")); if(_voice) { - string buf = _vPtr->WriteMessage((char*)msg.c_str(), _voice); - if(_voice) { - NoRender(refname); - try { + size_t len; + void* buf = _vPtr->WriteMessage((char*)msg.c_str(), &len); + if(buf) { + NoRender(refname); + try { // >>> Beware: must pass a (new) object to the (add) method, // >>> because the (remove) method is going to do a (delete) // >>> whether that's what you want or not. - SGSoundSample *simple = - new SGSoundSample((unsigned char*) buf.c_str(), - buf.length(), 8000, AL_FORMAT_MONO8); - // TODO - at the moment the volume can't be changed - // after the transmission has started. - simple->set_volume(volume); - globals->get_soundmgr()->add(simple, refname); - if(repeating) { - globals->get_soundmgr()->play_looped(refname); - } else { - globals->get_soundmgr()->play_once(refname); - } - } catch ( sg_io_exception &e ) { - SG_LOG(SG_GENERAL, SG_ALERT, e.getFormattedMessage()); + SGSoundSample *simple = new SGSoundSample(&buf, len, 8000); + simple->set_volume(volume); + _sgr->add(simple, refname); + _sgr->play(refname, repeating); + } catch ( sg_io_exception &e ) { + SG_LOG(SG_GENERAL, SG_ALERT, e.getFormattedMessage()); + } } - } } - #endif // ENABLE_AUDIO_SUPPORT +#endif // ENABLE_AUDIO_SUPPORT if(!_voice) { // first rip the underscores and the pause hints out of the string - these are for the convienience of the voice parser for(unsigned int i = 0; i < msg.length(); ++i) { @@ -268,8 +284,8 @@ void FGATC::NoRender(const string& refname) { if(_playing) { if(_voice) { #ifdef ENABLE_AUDIO_SUPPORT - globals->get_soundmgr()->stop(refname); - globals->get_soundmgr()->remove(refname); + _sgr->stop(refname); + _sgr->remove(refname); #endif } _playing = false; @@ -283,14 +299,14 @@ string FGATC::GenText(const string& m, int c) { ostream& operator << (ostream& os, atc_type atc) { switch(atc) { - case(AWOS): return(os << "AWOS"); - case(ATIS): return(os << "ATIS"); - case(GROUND): return(os << "GROUND"); - case(TOWER): return(os << "TOWER"); + case(AWOS): return(os << "AWOS"); + case(ATIS): return(os << "ATIS"); + case(GROUND): return(os << "GROUND"); + case(TOWER): return(os << "TOWER"); case(APPROACH): return(os << "APPROACH"); case(DEPARTURE): return(os << "DEPARTURE"); - case(ENROUTE): return(os << "ENROUTE"); - case(INVALID): return(os << "INVALID"); + case(ENROUTE): return(os << "ENROUTE"); + case(INVALID): return(os << "INVALID"); } return(os << "ERROR - Unknown switch in atc_type operator << "); } @@ -325,8 +341,8 @@ std::istream& operator >> ( std::istream& fin, ATCData& a ) return fin >> skipeol; } - double lat, lon, elev; - + double lat, lon, elev; + fin >> lat >> lon >> elev >> f >> a.range >> a.ident; a.geod = SGGeod::fromDegM(lon, lat, elev); a.name = ""; @@ -349,7 +365,7 @@ std::istream& operator >> ( std::istream& fin, ATCData& a ) // cout << a.ident << endl; // generate cartesian coordinates - a.cart = SGVec3d::fromGeod(a.geod); + a.cart = SGVec3d::fromGeod(a.geod); return fin >> skipeol; }