1 // audioident.cxx -- audible station identifiers
3 // Written by Torsten Dreyer, September 2011
5 // Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "audioident.hxx"
23 #include <simgear/sg_inlines.h>
25 #include <Main/globals.hxx>
26 #include <Sound/morse.hxx>
28 AudioIdent::AudioIdent( const std::string & fx_name, const double interval_secs, const int frequency_hz ) :
30 _frequency(frequency_hz),
32 _interval(interval_secs),
37 void AudioIdent::init()
42 _sgr = globals->get_soundmgr()->find("avionics", true);
43 _sgr->tie_to_listener();
46 void AudioIdent::stop()
48 if( _sgr->exists( _fx_name ) )
49 _sgr->stop( _fx_name );
53 void AudioIdent::start()
56 _sgr->play_once(_fx_name);
60 void AudioIdent::setVolumeNorm( double volumeNorm )
62 SG_CLAMP_RANGE(volumeNorm, 0.0, 1.0);
64 SGSoundSample *sound = _sgr->find( _fx_name );
66 if ( sound != NULL ) {
67 sound->set_volume( volumeNorm );
71 void AudioIdent::setIdent( const std::string & ident, double volumeNorm )
73 if( _ident == ident ) {
74 if( false == _ident.empty() )
75 setVolumeNorm( volumeNorm );
82 if ( _sgr->exists( _fx_name ) )
83 _sgr->remove( _fx_name );
85 if( false == ident.empty() ) {
87 SGSoundSample* sound = FGMorse::instance()->make_ident(ident, _frequency );
88 sound->set_volume( volumeNorm );
89 if (!_sgr->add( sound, _fx_name )) {
90 SG_LOG(SG_SOUND, SG_WARN, "Failed to add sound '" << _fx_name << "' for ident '" << ident << "'" );
98 } catch (sg_io_exception& e) {
99 SG_LOG(SG_SOUND, SG_ALERT, e.getFormattedMessage());
104 void AudioIdent::update( double dt )
107 if( false == _running || _interval < SGLimitsd::min() )
112 if( _timer < SGLimitsd::min() ) {
119 // FIXME: shall transmit at least 6 wpm (ICAO Annex 10 - 3.5.3.6.3)
120 DMEAudioIdent::DMEAudioIdent( const std::string & fx_name )
121 : AudioIdent( fx_name, 40, FGMorse::HI_FREQUENCY )
126 //FIXME: for co-located VOR/DME or ILS/DME, assign four time-slots
127 // 3xVOR/ILS ident, 1xDME ident
129 // FIXME: shall transmit at approx. 7 wpm (ICAO Annex 10 - 3.3.6.5.1)
130 VORAudioIdent::VORAudioIdent( const std::string & fx_name )
131 : AudioIdent( fx_name, 10, FGMorse::LO_FREQUENCY )
135 //FIXME: LOCAudioIdent at approx 7wpm (ICAO Annex 10 - 3.1.3.9.4)
136 // not less than six times per minute at approx equal intervals
137 // frequency 1020+/-50Hz (3.1.3.9.2)
138 LOCAudioIdent::LOCAudioIdent( const std::string & fx_name )
139 : AudioIdent( fx_name, 10, FGMorse::LO_FREQUENCY )
144 // FIXME: NDBAudioIdent at approx 7 wpm (ICAO ANNEX 10 - 3.4.5.1)
145 // at least once every 10s (3.4.5.2.1)
146 // frequency 1020+/-50Hz or 400+/-25Hz (3.4.5.4)