]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/fgcom.cxx
FGCom[-sa]: add IAX denoiser and auto gain + set silence threshold
[flightgear.git] / src / Network / fgcom.cxx
index 2068e03484f85959d57f177a8fdb4efc530fe0de..f9445ead5487eb791f3dd9233ca64634c5db4f87 100644 (file)
@@ -39,7 +39,7 @@
 #include <Airports/airport.hxx>
 #include <Navaids/navlist.hxx>
 
-#include <utils/iaxclient/lib/iaxclient.h>
+#include <3rdparty/iaxclient/lib/iaxclient.h>
 
 
 #define NUM_CALLS 4
@@ -96,9 +96,11 @@ void FGCom::iaxTextEvent(struct iaxc_ev_text text)
 
 
 FGCom::FGCom() :
-    _register(true)
+    _register(true),
+    _enabled(false),
+    _initialized(false),
+    _listener_active(0)
 {
-  _listener_active = 0;
 }
 
 
@@ -127,13 +129,12 @@ void FGCom::bind()
   _username_node           = reg_node->getChild( "username", 0, true );
   _password_node           = reg_node->getChild( "password", 0, true );
 
-  //_nav0_node               = fgGetNode("/instrumentation/nav[0]/frequencies/selected-mhz", true);
-  //_nav1_node               = fgGetNode("/instrumentation/nav[1]/frequencies/selected-mhz", true);
   _comm0_node              = fgGetNode("/instrumentation/comm[0]/frequencies/selected-mhz", true);
-  //_comm1_node              = fgGetNode("/instrumentation/comm[1]/frequencies/selected-mhz", true);
+  _comm1_node              = fgGetNode("/instrumentation/comm[1]/frequencies/selected-mhz", true);
   _ptt0_node               = fgGetNode("/instrumentation/comm[0]/ptt", true); //FIXME: what about /instrumentation/comm[1]/ptt ?
   _callsign_node           = fgGetNode("/sim/multiplay/callsign", true);
   _text_node               = fgGetNode("/sim/messages/atc", true );
+  _version_node            = fgGetNode("/sim/version/flightgear", true );
 
   // Set default values if not provided
   if ( !_enabled_node->hasValue() )
@@ -173,9 +174,7 @@ void FGCom::bind()
   _micLevel_node->addChangeListener(this);
   _enabled_node->addChangeListener(this);
   _comm0_node->addChangeListener(this);
-  //_comm1_node->addChangeListener(this);
-  //_nav0_node->addChangeListener(this);
-  //_nav1_node->addChangeListener(this);
+  _comm1_node->addChangeListener(this);
   _ptt0_node->addChangeListener(this);
   _test_node->addChangeListener(this);
 }
@@ -195,16 +194,13 @@ void FGCom::init()
   _register         = _register_node->getBoolValue();
   _username         = _username_node->getStringValue();
   _password         = _password_node->getStringValue();
+  _selectedComm     = 0;
 
   _currentComm0     = _comm0_node->getDoubleValue();
-  //_currentComm1     = _comm1_node->getDoubleValue();
-  //_currentNav0      = _nav0_node->getDoubleValue();
-  //_currentNav1      = _nav1_node->getDoubleValue();
+  _currentComm1     = _comm1_node->getDoubleValue();
 
   _comm0Changed     = false;
-  //_comm1Changed     = false;
-  //_nav0Changed      = false;
-  //_nav1Changed      = false;
+  _comm1Changed     = false;
 
   _maxRange         = MAX_RANGE;
   _minRange         = MIN_RANGE;
@@ -231,7 +227,14 @@ void FGCom::postinit()
     
     // FIXME: To be implemented in IAX audio driver
     //iaxc_mic_boost_set( _micBoost_node->getIntValue() );
-    iaxc_set_formats( IAXC_FORMAT_GSM, IAXC_FORMAT_GSM );
+    std::string app = "FGFS-";
+    app += _version_node->getStringValue();
+
+    iaxc_set_callerid( _callsign_node->getStringValue(), app.c_str() );
+    iaxc_set_formats (IAXC_FORMAT_SPEEX, IAXC_FORMAT_SPEEX);
+    iaxc_set_speex_settings(1, 5, 0, 1, 0, 3);
+    iaxc_set_filters(IAXC_FILTER_AGC | IAXC_FILTER_DENOISE);
+    iaxc_set_silence_threshold(-20.0);
     iaxc_start_processing_thread ();
 
     // Now IAXClient is initialized
@@ -351,7 +354,7 @@ void FGCom::updateCall(bool& changed, int& callNo, double freqMHz)
         if( !isInRange(freqMHz) )
             return;
         if( !num.empty() ) {
-            callNo = iaxc_call_ex(num.c_str(), _callsign.c_str(), NULL, 0 /* no video */);
+            callNo = iaxc_call(num.c_str());
 
             if( callNo == -1 )
                 SG_LOG( SG_IO, SG_DEBUG, "FGCom: cannot call " << num.c_str() );
@@ -371,10 +374,11 @@ void FGCom::update(double dt)
 
     // For now we manage FGCom for only one freq because IAXClient
     // is not able to handle multiple calls at same time.
-    updateCall(_comm0Changed, _callComm0, _comm0_node->getDoubleValue());
-    // updateCall(_comm1Changed, _callComm1, _comm1_node->getDoubleValue());
-    // updateCall(_nav0Changed, _callNav0, _nav0_node->getDoubleValue());
-    // updateCall(_nav1Changed, _callNav1, _nav1_node->getDoubleValue());
+    if( _selectedComm == 0) {
+        updateCall(_comm0Changed, _callComm0, _comm0_node->getDoubleValue());
+    } else {
+        updateCall(_comm1Changed, _callComm0, _comm1_node->getDoubleValue());
+    }
 }
 
 
@@ -417,6 +421,18 @@ void FGCom::valueChanged(SGPropertyNode *prop)
   }
 
   if (prop == _ptt0_node && _enabled) {
+    if( _ptt0_node->getIntValue() == 2 ) {
+      if( _selectedComm == 0 ) {
+          SG_LOG( SG_IO, SG_INFO, "FGCom: change comm source to comm[1]" );
+          _comm1Changed = true;
+          _selectedComm = 1;
+      } else {
+          SG_LOG( SG_IO, SG_INFO, "FGCom: change comm source to comm[0]" );
+          _comm0Changed = true;
+          _selectedComm = 0;
+      }
+      return;
+    }
     if( _ptt0_node->getBoolValue() ) {
       iaxc_output_level_set( 0.0 );
       iaxc_input_level_set( _micLevel_node->getFloatValue() ); //0.0 = min , 1.0 = max
@@ -473,7 +489,7 @@ void FGCom::valueChanged(SGPropertyNode *prop)
       _comm0Changed = true;
     }
   }
-/*
+
   if (prop == _comm1_node) {
     if( _currentComm1 != prop->getDoubleValue() ) {
       _currentComm1 = prop->getDoubleValue();
@@ -482,21 +498,6 @@ void FGCom::valueChanged(SGPropertyNode *prop)
     }
   }
 
-  if (prop == _nav0_node) {
-    if( _currentNav0 != prop->getDoubleValue() ) {
-      _currentNav0 = prop->getDoubleValue();
-      _nav0Changed = true;
-    }
-  }
-
-  if (prop == _nav1_node) {
-    if( _currentNav1 != prop->getDoubleValue() ) {
-      _currentNav1 = prop->getDoubleValue();
-      _nav1Changed = true;
-    }
-  }
-*/
-
   _listener_active--;
 }
 
@@ -506,8 +507,8 @@ void FGCom::testMode(bool testMode)
 {
   if(testMode && _initialized) {
     _enabled = false;
-    iaxc_dump_call_number(_callComm0);
-    iaxc_input_level_set( _micLevel_node->getFloatValue() );
+    iaxc_dump_all_calls();
+    iaxc_input_level_set( 1.0 );
     iaxc_output_level_set( _speakerLevel_node->getFloatValue() );
     std::string num = computePhoneNumber(TEST_FREQ, NULL_ICAO);
     if( num.size() > 0 ) {
@@ -518,8 +519,10 @@ void FGCom::testMode(bool testMode)
       SG_LOG( SG_IO, SG_DEBUG, "FGCom: cannot call " << num.c_str() );
   } else {
     if( _initialized ) {
-      iaxc_dump_call_number(_callComm0);
+      iaxc_dump_all_calls();
       iaxc_millisleep(IAX_DELAY);
+      iaxc_input_level_set( 0.0 );
+      iaxc_output_level_set( _speakerLevel_node->getFloatValue() );
       _callComm0 = -1;
       _enabled = true;
     }
@@ -565,26 +568,6 @@ std::string FGCom::getAirportCode(const double& freq)
 
 
 
-/*
-  \param freq The requested frequency e.g 112.7
-  \return The ICAO code as string e.g ITS
-*/
-/*
-std::string FGCom::getVorCode(const double& freq) const
-{
-  SGGeod aircraftPos = globals->get_aircraft_position();
-  FGNavList::TypeFilter filter(FGPositioned::VOR);
-
-  FGNavRecord* vor = FGNavList::findByFreq( freq, aircraftPos, &filter);
-  if( !vor ) {
-    return std::string();
-  }
-
-  return vor->get_ident();
-}
-*/
-
-
 /*
   \param freq The requested frequency e.g 120.825
   \param iaco The associated ICAO code e.g LFMV