SvxLink release 24.02 -- 25 Feb 2024
------------------------------------

It's been a long time since the latest major release. A lot have happened
during this time. The most important changes are described below. Be sure to
look at the SvxLink log on first startup. Especially look for WARNINGs that say
that configuration variables have changed. Make changes as instructed and
restart SvxLink. It's also a good idea to redo audio calibrations using the
devcal and siglevdetcal utilities. When using the SvxReflector it is very
important that all nodes use the same levels for audio calibration. Otherwise
some nodes will sound weak while other nodes will sound over modulated.

This release introduce talkgroups in the SvxReflector. That make it possible to
use the reflector server for multiple parallel QSOs. Node sysops can set up
monitoring on selected talkgroups which will make the node automatically select
a talkgroup when there is activity on it. There also is a simple mechanism to
set priority between monitored talkgroups.

The reflector sysop may configure selected talkgroups in a few ways. There is
an auto-QSY feature that can be configured to move nodes, that are actively
taking part in a QSO on a talkgroup, to a temporary talkgroup. That will free
up the original talkgroup for new calls. A node is classed as active if there
have been local activity (e.g. squelch opens) on the node. If a QSY happens and
a node has not been active, there will be a chance to follow the QSY by just
pushing the PTT.

SvxLink now also support using multiple CTCSS tones. That is primarily of use
to select a reflector talkgroup based on which CTCSS frequency that is used. A
transceiver may be programmed with the same RF on multiple memory channels but
with different CTCSS frequencies. That will make it easy to choose which
talkgroup to use upon first transmission to a SvxLink node.

A SvxLink node can now be configured to use multiple SvxReflector adresses.
That allow for simple redundancy where all nodes will switch to a backup node
if the primary SvxReflector stops responding.

A new squelch type, COMBINE, enable the use of multiple squelch detectors at
the same time. The different squelch types is combined using a logical
expression.

The new configuration variable COMMAND_PTY can be used to set up a PTY that can
be used to set configuration variables and call TCL functions at runtime. That
can be used to externally control behaviour in a running SvxLink instance.

The CTCSS detector has a new mode (4) which now is the default. The new mode is
faster and much better at suppressing interference.

SvxLink can now use LADSPA plugins to shape receiver audio. The LADSPA_PLUGINS
variable is used to load and configure plugins.

As usual a number of bugs have been fixed. The full list of changes and more
details can be found below. Information on configuration of new features can be
found in the manual pages.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Complete ChangeLog for SvxLink Server version 1.8.0
---------------------------------------------------

* MetarInformation, more flexible airport announcement at the beginning of a
  Metar

* SvxReflector now support switching traffic on talk groups.

* ReflectorLogic can now request switching talk groups based on the received
  CTCSS tone frequency. It is also possible to switch to any talk group using
  DTMF.

* Now possible to use multiple CTCSS squelch tones in parallell.

* SvxReflector now have a QSY functionality used to switch all active nodes on
  a talk group to another talk group.

* A logic link is now disconnected using <prefix># instead of <prefix>0#. If
  any digits are specified after the prefix the link will be activated and the
  digits will be given to the remote logic(s) for processing. Right now only
  the ReflectorLogic care about these extra digits, also called the
  subcommand.

* A logic core connected to a logic link can now play announcements on all
  other connected logics. This is used in the ReflectorLogic to announce talk
  group selections and command feedback.

* New signal level "detector": CONST

* ModuleEchoLink bugfix: The LINK_IDLE_TIMEOUT did not work if the
  remote_timeout TCL function was changed to not play any sound.

* ModuleEchoLink bugfix: The LINK_IDLE_TIMEOUT did not work with short timeout
  values where the timeout was shorter than the length of a locally received
  transmission.

* ModuleMetarInfo bugfix: Announcing twice

* ModuleMetarInfo bugfix: SvxLink crashed on long LocationInfo comments

* ModuleEchoLink: Now possible to silently ignore all incoming connections
  using the DROP_ALL_INCOMING configuration variable.

* The receiver configuration variables SQL_HANGTIME, SQL_EXTENDED_HANGTIME and
  SQL_EXTENDED_HANGTIME_THRESH are now settable from within a C++ module for
  example.

* Improved GPIO up/down scripts with more error handling and support for
  handling more cases.

* New SvxReflector feature: Auto QSY. It is now possible to set a per
  talkgroup time in the reflector after which a QSY to a random talkgroup is
  performed. This can typically be used on call channels so that stations do
  not dwell there for too long.

* New squelch type: COMBINE. There now is a new squelch type that can combine
  multiple other squelch types using a logical expression.
  Implementing this new feature required rewriting quite a lot of the squelch
  infrastructure code. Watch out for changed behavior in the squelch
  functionality.

* Bugfix: Squelch types DDR, SIM and TONE reported the "raw" signal strength
  instead of the integrated one. This fix can change the behavior of the voter
  and the extended hangtime feature.

* Added debug mode for the CTCSS detector. Enable by setting CTCSS_DEBUG to 1
  in a receiver configuration section.

* ReflectorLogic: Now possible to adjust the UDP heartbeat interval using the
  UDP_HEARTBEAT_INTERVAL configuration variable.

* Now possible to set configuration variables from TCL using the
  setConfigValue function. This can be used to change certain configuration of
  SvxLink while it is running. Only some configuration variables support being
  changed at runtime.

* If a configuration variable is changed in the logic core, or in the main
  configuration section for a module, the new TCL function config_updated will
  be called.

* New configuration variable ONLINE that can be used to decide if a logic core
  should be active or not on program startup. This variable also support being
  set at runtime.

* Use the new configuration variable COMMAND_PTY to set up a PTY that can be
  used to send commands to a logic core.

* Filter out CTCSS band for voice output. Interference on CTCSS transmission
  could be caused by low frequency content in audio clips or incoming audio on
  Echolink for example.

* Ignore prioritized talkgroups qfter QSY if there have been local node
  activity prior to the QSY. This fix a problem where a node would switch to a
  prioritized talkgroup after a QSY to a lower priority talkgroup, if there
  have been no local activity after the QSY. Priority will be honored again
  after the node have switched to TG#0.

* Make the audio limiter threshold in the receiver configurable using the
  LIMITER_THRESH configuration variable in a receiver configuration section.

* Add an audio limiter to the transmitted audio path. The threshold may be set
  using the LIMITER_THRESH configuration variable in a TX configuration
  section.

* Bugfix: When AUTOACTIVATE_ON_SQL is used in a logic link definition it is
  supposed to default to a timeout of 30 seconds if TIMEOUT is not set. That
  did not work though.

* ReflectorLogic: Use the QSY_PENDING_TIMEOUT configuration variable to enable
  following a just ignored QSY request on squelch open.

* By default, when activating a module in a logic core, all logic linking
  audio will be muted. This behavior can be changed by using the
  MUTE_LOGIC_LINKING configuration variable in the module configuration.

* More informative squelch open/close printouts implemented. The information
  that is printed within the parenthesis after the squelch open/close message
  is now specific for each squelch type so that meaningful information can be
  printed for that squelch type. For example the CTCSS tone frequency and SNR
  is printed for CTCSS squelch. The value printed for SIGLEV squelch is now
  the actual value that is used by the squelch. Previously there was no
  connection between the value used by the squelch and the printed signal
  level.

* Fix receiver muting bug introduced with the AUDIO_DEV_KEEP_OPEN feature.

* Bugfix: SQL_START_DELAY was not honored in all cases.

* Rework squelch core code. The core squelch handling code was not fully
  correct causing problems in some configurations.

* New voter configuration variable VERBOSE which cause the voter to print the
  squelch state events of the satellite receivers. This can be used while fine
  tuning voter timing for example.

* Rename configuration variables to make it more clear that they are for
  squelch configuration. An "SQL_" prefix have been added to the following
  configuration variables: SIGLEV_RX_NAME, SIGLEV_OPEN_THRESH,
  SIGLEV_CLOSE_THRESH.

* Bugfix: Do not emit tone detected events from muted receivers.

* The voter COMMAND_PTY now accept a new command MUTE that will keep the
  receiver active but block all content.

* Bugfix in ModuleMetarInfo: Gusts were not announced correctly in combination
  with mps

* Bugfix in ReflectorLogic: The AUTOACTIVATE_ON_SQL logic linking
  functionality did not work for the ReflectorLogic.

* The AUTOACTIVATE_ON_SQL logic linking configuration variable has been
  renamed to ACTIVATE_ON_ACTIVITY.

* Bugfix in reflector authentication.

* Now possible to set the Echolink module drop/reject/accept configuration
  variables at runtime. This can for example be used from TCL, using the
  setConfigValue function, to change behavior at runtime. See example in
  ReflectorLogic.tcl.

* Bugfix in ReflectorLogic: It was possible to activate a temporary TG monitor
  on a TG that was configured to be permanent. When the temporary monitor
  timed out the TG was removed from the monitoring list completely.

* Add support for PTT and squelch via the gpiod library. Accessing GPIO pins
  via the sysfs interface is deprecated.
  When PTT_TYPE is set to GPIOD there are two new configuration variables
  available to set GPIOD up, PTT_GPIOD_CHIP and PTT_GPIOD_LINE.
  When SQL_DET is set to GPIOD there are two new configuration variables
  available to set GPIOD up, SQL_GPIOD_CHIP, SQL_GPIOD_LINE. If SvxLink is
  built with libgpiod >= 1.5 SQL_GPIOD_BIAS will also be available to set
  PULLUP/PULLDOWN for a GPIO input (squelch) pin.

* New CTCSS tone detector, mode 4, added. This detector is faster and more
  selective. It probably also is more resilient to interference. Have a look
  at the svxlink.conf (5) manual page under CTCSS_MODE for more information.

* Tone detectors for 1750 Hz tone burst, CTCSS repeater activation,
  CTCSS_TO_TG etc now use frequency estimation in addition to energy detection
  for better selectivity.

* Improved squelch state logging with more details about the detection.

* New CTCSS configuration variable CTCSS_SNR_OFFSETS (note the plural S) which
  replace the old variable with a similar name. The new variable take a comma
  separated list of frequency:offset pairs to support the use of multiple
  CTCSS tone frequencies. The siglevdetcal utility has also been modified to
  output the new variable format. If you are using just one CTCSS frequency
  with a previously calibrated offet value you can keep using that. The older
  configuration variable will not be removed and it still work in the same
  way.

* ReflectorLogic: New config variable VERBOSE that choose if printouts from
  the reflector logic should be verbose or not. At the moment the only
  difference is that reflector join/leave messages will be suppressed if
  VERBOSE=0.

* The TCL event handler functions remote_cmd_received and
  remote_received_tg_updated can now be used in a logic core to act on
  commands and talkgroup activations from another logic core.

* ReflectorLogic: Client side redundancy added by using DNS SRV records or a
  locally specified list of hosts. Renamed configuration variables:
  HOST -> HOSTS, PORT -> HOST_PORT. New configuration variables:
  DNS_DOMAIN, HOST_PRIO, HOST_PRIO_INC, HOST_WEIGHT.

* Logic cores (SimplexLogic, RepeaterLogic etc) are now implemented as plugins
  which mean they are dynamically loaded at runtime if needed. There are
  multiple benefits with that:
  - Easier to accept contributed logic cores into the main source tree since
    no core code needs changing.
  - As long as the plugin is not loaded it can cause no harm if it contain a
    bug.
  - Third-party logic cores can be packaged separately. Package maintainers
    that build contributed code are urged to put such artifacts in its own
    package with a name like svxlink-contrib-examplelogic.
  See man svxlink.conf and the LOGIC_CORE_PATH configuration variable for info
  on how SvxLink find the plugins.

* Bugfix in SvxReflector: After 65536 client connections the warning "Incoming
  UDP datagram from XX.XX.XX.XX:YYYYY has invalid client id ZZZZZ" was logged
  for all new client connections.

* New contribution from DL1HRC: SipLogic. The build is enabled by using the
  -DWITH_CONTRIB_SIP_LOGIC=ON CMake command line option.

* The CTCSS squelch detector is now used for both OPEN_ON_CTCSS and
  CTCSS_TO_TG. That have multiple benefits. CPU usage is lower since only one
  detector is used instead of three in parallell. The quality of the CTCSS
  detector is better so shorter detection times may be used. On the downside,
  there must be a CTCSS detector configured at every frequency that is
  specified in either CTCSS_TO_TG or OPEN_ON_CTCSS.

* Changed syntax for OPEN_ON_CTCSS. Only detection time is specified, no
  frequency. All frequencies configured in the receiver configuration will be
  used.

* New configuration variable CTCSS_TO_TG_DELAY.

* CTCSS_MODE=4 now is the default.

* Bugfix: CTCSS transmission did not work correctly when AUDIO_DEV_KEEP_OPEN=1
  was specified. The tone did not turn off once it had been turned on.

* The TX configuration variable CTCSS_LEVEL is now set in dBFS instead of
  percent.

* New configuration variable CTCSS_EMIT_TONE_DETECTED. May need to be set to 0
  in some advanced squelch configurations.

* Now possible to set the jitter buffer delay on TX audio in RemoteTrx. This
  may be useful if experiencing choppy TX audio.

* Bugfix: Receiver voter muting had a couple of bugs that showed up when using
  the voter command PTY to disable/mute/enable receivers. It's unknown if
  these bugs have also caused any other problems.

* 1750 Hz tone burst detector accuracy requirement increased to +/- 25 Hz.

* Bugfix: When using "open repeater on squelch close", the squelch rx id was
  not set up before the TCL event handler send_rgr_sound was called directly
  after repeater open. This caused playing the wrong roger sound.

* Bugfix in ModuleEchoLink: The INCORRECT PASSWORD message was ignored.

* New global TCL function "getVar" that makes it easier to get the value of a
  variable that may be non-existent. If the variable does not exist a default
  value is returned instead.

* New configuration variable LOCAL_RGR_SOUND in ModuleEchoLink that is used to
  enable/disable the playing of a roger beep locally when the remote station
  stops talking.

* Add support for using the CM108B chip for squelch and PTT.
  Contributed by DL1HRC.

* New configuration variable TG_SELECT_INHIBIT_TIMEOUT that is used to
  separately control the TG select inhibit feature.

* Bugfix for the 1750_MUTING configuration variable. Setting it to 0 did not
  disable the feature. It had to be commented out.

* It's now possible to use LADSPA plugins to shape received audio. Fore more
  information have a look at the documentation for the LADSPA_PLUGINS
  configuration variable.



Complete ChangeLog for Qtel version 1.2.5
-----------------------------------------

* Bugfix: When a faulty bind address had been set up, Qtel just exited with a
  bit cryptic error message. Now it starts up with the possibility to use the
  configuration dialog to fix the problem.

* Appstream adaptions from GitHub user "AsciiWolf"
  - Added AppStream metainfo into files.
  - Added png icon into files.
  - Removed xpm icon from files.



Complete ChangeLog for EchoLib version 1.3.4
--------------------------------------------

* Replace potentially dangerous function call 'localtime' with 'localtime_r'.

* Smaller adaptions to new networking code in Async.



Complete ChangeLog for the Async library version 1.7.0
------------------------------------------------------

* ASYNC_AUDIO_ALSA_ZEROFILL is now enabled by default.

* Config::getValue() for vectors now tokenize on comma in addition to
  whitespace.

* Improved implementation for SvxLink::SepPair to work better with streaming.

* Config: Add support for calling getValue on keyed containers, like std::set
  and std::multiset.

* Msg: Add support for std::set variable in messages.

* New member function AudioSelector::selectedSource() used to find out which
  source that are currently selected.

* AudioSelector::autoSelectEnabled() can now be called with a constant source.

* Add a signal to the Config class so that one can subscribe to changes in the
  configuration.

* Chunked mode added to the Async::HttpServerConnection.

* Fix small memory deallocation bug in Async::AudioEncoderOpus.

* New template class Async::Factory for creating object factories.

* Added an AudioContainer framework.

* The Config::valueUpdated signal is now only emitted if the value is changed.

* The Pty::setLineBuffered method can now be used to enable line buffered mode
  where incoming chars are buffered until a <CR> or <LF> is received.

* Templated function Async::Config::setValue() so that generic types can be
  used without converting them to string first.

* The Async::Serial class now support all extended baudrates.

* Rewritten the DNS resolver with support for more resource record types.

* AudioDeviceUDP can now write zeros to the UDP connection on underflow. That
  is, when the "audio device" is open but there is no audio to write zeros
  will be written instead. Enable this behavior by setting the environment
  variable ASYNC_AUDIO_UDP_ZEROFILL=1.

* The Config class now also accept associative containers for getValue. This
  for example make it possible to use a std::map<float,float> to read a
  configuration variable with a list of values on the form
  VARNAME=88.5:-1,136.5:1. It is also possible to use other key/value
  separators.

* New class Async::StateMachine used to build Hierarchical Finite State
  Machines.

* New class Async::TcpPrioClient for handling pools of servers to connect to.
  The pool members can be specified using DNS SRV records or locally using the
  HOSTS configuration variable.

* Slightly changed semantics of the TcpClient::connect functions. It's now
  not allowed to call the connect function if already connected.

* Async::Plugin: A new class for loading code as plugins.

* Bugfix Async::HttpServerConnection: EOL handling failed with newer
  compilers.

* New class Async::AudioLADSPAPlugin which enable the use of LADSPA plugins to
  process audio.

