X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATCDCL%2FATC.cxx;h=41c56e64844998beb1db3d754b6fdedbc169d315;hb=0d9f2e3c9585cfc1fbc392e56c35fda8bef8c334;hp=92568edc56725be3de1cc605a47ed24685a6011a;hpb=446b200edc9590ec1e0231e64084905f2bc8a5b9;p=flightgear.git diff --git a/src/ATCDCL/ATC.cxx b/src/ATCDCL/ATC.cxx index 92568edc5..41c56e648 100644 --- a/src/ATCDCL/ATC.cxx +++ b/src/ATCDCL/ATC.cxx @@ -36,6 +36,7 @@ FGATC::FGATC() : _voiceOK(false), + _playing(false), _sgr(NULL), freqClear(true), receiving(false), @@ -56,9 +57,13 @@ FGATC::FGATC() : _counter(0.0), _max_count(5.0) { - SGSoundMgr *smgr; - smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr"); + 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() { @@ -107,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! @@ -222,6 +239,8 @@ void FGATC::SetData(ATCData* d) { // The repeating flag indicates whether the message should be repeated continuously or played once. 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 @@ -230,17 +249,15 @@ void FGATC::Render(string& msg, const float volume, #ifdef ENABLE_AUDIO_SUPPORT _voice = (_voiceOK && fgGetBool("/sim/sound/voice")); if(_voice) { - string buf = _vPtr->WriteMessage((char*)msg.c_str(), _voice); - if(_voice && (volume > 0.05)) { + 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); - // TODO - at the moment the volume can't be changed - // after the transmission has started. + SGSoundSample *simple = new SGSoundSample(&buf, len, 8000); simple->set_volume(volume); _sgr->add(simple, refname); _sgr->play(refname, repeating); @@ -325,7 +342,7 @@ std::istream& operator >> ( std::istream& fin, ATCData& a ) } double lat, lon, elev; - + fin >> lat >> lon >> elev >> f >> a.range >> a.ident; a.geod = SGGeod::fromDegM(lon, lat, elev); a.name = "";