Hamradio/chan svx
A hand-held, step-by-step guide to bridging an AllStarLink 3 node straight to a SVXReflector with chan_svx — install it, get it connected, and get the audio right. No prior SvxLink knowledge needed. Copy-paste friendly.
chan_svx is an Asterisk channel driver that lets your AllStar node talk Opus directly to a SVXReflector — so you drop the old chan_usrp → svxlink hop and the extra vocoder tandem that came with it.chan_svx (this page) joins the reflector as a SvxLink client (one login = one TG). Its sibling chan_svx_sat joins as a satellite/trunk and can carry several nodes/TGs on one login. If you want the trunk, read the chan_svx_sat how-to instead.
Do I even need this?
- You run an AllStarLink 3 node (on a Raspberry Pi or x86) and you want it on a SVXReflector talkgroup.
- Today you probably bridge it with
chan_usrp→svxlink. That works, but it transcodes the audio twice and adds a box to babysit. chan_svxreplaces that whole hop with one driver. The audio path becomes just PCM ↔ Opus, once.
If you are not going to a SvxReflector — e.g. you only link AllStar-to-AllStar, or you use DMR/YSF — you don't need this. See Hamradio for those.
Words you'll see (plain-language glossary)
| Term | What it means here |
|---|---|
| AllStarLink 3 (ASL3) | The VoIP linking system built on Asterisk. Your node runs asl3-asterisk.
|
| app_rpt | The Asterisk application that is your repeater/node controller (COS, PTT, IDs, links). |
| SVXReflector | A server that joins many SvxLink-style clients on shared talkgroups. Your node logs in to it. |
| Talkgroup (TG) | A "channel" on the reflector. You transmit on one TG and hear whoever else is on it. |
| Opus | The audio codec on the wire between your node and the reflector. One transcode, 8 kHz, 20 ms frames. |
| Client | chan_svx joins the reflector as a normal SvxLink client — one login, one TG, one stream. |
| Section | A [block] in svx.conf. One section = one node = one TG.
|
What you need before you start
- A working AllStarLink 3 node. Check:
asterisk -VshowsAsterisk 22.x+asl3-.... - A 64-bit OS. Debian 12 (bookworm) or 13 (trixie), on x86-64 or arm64 (Pi 3/4/5). Check:
dpkg --print-architectureand. /etc/os-release; echo $VERSION_CODENAME. (The Pi Zero 2 W is intentionally not supported — heat + Wi-Fi.) - A reflector login of your own — a dedicated login + auth-key, not shared with svxlink or another node. Sharing one gets the other kicked off. SvxReflector logins are upper-case callsigns.
- The reflector is reachable. Check:
nc -vz REFLECTOR_HOST 5300.
The worked example below is a real node: AllStar node 1999 bridging to a reflector at 172.16.1.1:5300, talkgroup 24016. Swap in your own host / login / TG everywhere you see them.
How it all fits together
Two small config files on the node, and a login the reflector recognises. That is the entire wiring:

rpt.conf → a section in svx.conf → a login the reflector recognises.Step 1 — Install the package
Pick the .deb that matches your OS and architecture:
| OS / arch | Package |
|---|---|
| trixie x86-64 | asl3-chan-svx_<ver>~trixie_amd64.deb
|
| trixie arm64 (Pi) | asl3-chan-svx_<ver>~trixie_arm64.deb
|
| bookworm x86-64 | asl3-chan-svx_<ver>~bookworm_amd64.deb
|
| bookworm arm64 (Pi) | asl3-chan-svx_<ver>~bookworm_arm64.deb
|
sudo apt install ./asl3-chan-svx_<ver>~<os>_<arch>.deb
Dependencies (asl3-asterisk, libopus0, libssl3) resolve automatically. The package installs the module, a sample config, this kind of documentation under /usr/share/doc/asl3-chan-svx/, and adds a commented load line to modules.conf for you to enable in Step 4. Nothing loads or connects yet.
Step 2 — Create the reflector config
Copy the sample and open it for editing:
sudo cp /etc/asterisk/svx.conf.sample /etc/asterisk/svx.conf sudo chown asterisk:asterisk /etc/asterisk/svx.conf sudo chmod 640 /etc/asterisk/svx.conf # it holds your reflector password sudoedit /etc/asterisk/svx.conf
Make it look like this (name the section after the node — tidy and unambiguous):
[1999] host = 172.16.1.1 ; reflector hostname or IP port = 5300 ; reflector port (default 5300) login = SA7AUX-AC ; your OWN login, UPPER-CASE, not shared password = CHANGE_ME ; your reflector auth-key callsign = SA7AUX ; name shown to the reflector tg = 24016 ; talkgroup to select (TX + primary RX)
The callsign is shown as the node's name if it is free on the reflector right now; on a collision (or if left empty) it falls back to ASL-<section> (e.g. ASL-1999), re-checked automatically as names free up.
Step 3 — Point the node at it
In /etc/asterisk/rpt.conf, in your node's stanza, comment out the old rxchannel — never delete it — and add the SVX line:
[1999](node-main) ; rxchannel = USRP/127.0.0.1:4001:4002 ; old bridge, kept so you can revert rxchannel = SVX/1999 ; chan_svx -> section [1999]
/etc/asterisk/custom/rpt.conf instead — ASL3 includes that file and never overwrites it. Use the direct edit above for a quick change; use custom/ if you want your config to survive asl3-asterisk updates cleanly.Step 4 — Enable the module
ASL3 has autoload = no, so the module must be listed by hand. The package added a commented line — turn it on. It must live inside the [modules] section (a load line after a later section is silently ignored):
sudo sed -i 's/^; *load = chan_svx.so/load = chan_svx.so/' /etc/asterisk/modules.conf grep -n '^load = chan_svx.so' /etc/asterisk/modules.conf # confirm it's active
Step 5 — Apply and verify
An rxchannel change needs app_rpt to re-init, so restart Asterisk, then check:
sudo asterisk -rx "core restart now" sudo asterisk -rx "svx show"
A healthy bridge looks like this — CONNECTED means you're done with the basic hookup:

Key up on the node → txframes climbs and the reflector opens the talker on your TG. When someone else talks on the TG → rxframes climbs. Done. The rest of this page is tuning and extras.
Getting the audio right
This is where most people get stuck, so take it slow. Only the yellow stages have knobs — everything grey is automatic.

All of these live in the node's section in svx.conf. After changing any of them, run sudo asterisk -rx "core restart now".
The four audio knobs
| Setting | Default | What it does |
|---|---|---|
tx_gain |
0 |
Preamp on TX (node → reflector), in dB. Raise if others say you're quiet; lower if they say you clip. |
rx_gain |
0 |
Preamp on RX (reflector → node), in dB. Raise if the reflector audio is too quiet on your repeater. |
tx_agc / rx_agc |
no |
Automatic gain control. Turn on to even out loud/quiet stations. yes or no.
|
bitrate |
16000 |
Opus bitrate in bit/s. Leave it unless you have a reason. |
"My audio is X → do Y"
| Symptom | Fix |
|---|---|
| Others say you're too quiet | Raise tx_gain a few dB at a time (e.g. 3, then 6).
|
| Others say you clip / distort | Lower tx_gain a notch. The limiter guards the peak, but clean input is better.
|
| Reflector audio too quiet on your repeater | Raise rx_gain a few dB.
|
| Loud and quiet stations are wildly uneven | Turn on rx_agc = yes (and/or tx_agc = yes).
|
| Choppy / chopped audio going out | See the tx_hold fix below. |
| Crackle/dropouts coming in on a poor link | Raise jitter (see below). FEC/PLC already help; this adds headroom.
|
Two more knobs: tx_hold and jitter
| Setting | Default | What it does |
|---|---|---|
tx_hold |
250 |
TalkerStop hold time, in ms. A brief unkey/rekey mid-over (COS flicker, link hangtime) would otherwise close and reopen the reflector talker and chop the audio. The hold keeps it open across the gap. 0 = stop immediately on unkey.
|
jitter |
40 |
Jitter-buffer prefill, in ms. Higher = smoother on a poor/long link, but more latency. 0 = minimal (fine on a clean LAN). Max 500.
|
If audio going out is chopped: run svx show and watch starts/stops. One each per over is healthy. Many per over means your key is flapping — raise tx_hold (try 400).
Optional: listen to extra talkgroups
monitor = 24020, 9990 ; extra TGs you HEAR (RX only); TX still goes to 'tg'
Keep it up — forever
Two independent things stay up: the reflector link and the AllStar node-to-node link.
- The reflector link is automatic. chan_svx reconnects on its own (TCP + UDP heartbeats, backoff after any drop). Nothing to configure;
svx showgoes back toCONNECTEDwithin seconds of any outage. - Keep the AllStar node linked to a hub? Use app_rpt's permanent connect, which re-establishes itself:
sudo asterisk -rx "rpt cmd 1999 ilink 13 403870" # 13 = permanent, transceive
Link automatically at boot via the node stanza:
[1999](node-main) rxchannel = SVX/1999 startup_macro = *3403870 ; auto-connect to 403870 (transceive) on startup
Belt-and-suspenders cron (ilink 3 is idempotent — a no-op if already linked):
# keep node 1999 linked to 403870 every 2 minutes */2 * * * * /usr/sbin/asterisk -rx "rpt cmd 1999 ilink 3 403870" >/dev/null 2>&1
Bonus: change talkgroup from the radio (DTMF)
You can move the node to another TG live — over RF with DTMF, gated by a PIN — then drop back. Handy for pushing a bulletin/net out on a different TG, then reverting.

Dial pattern: *855 + PIN + action. Put the commands in rpt.conf under [functions] (PIN is the control code — a wrong PIN simply does nothing). Default PIN is 0000 — change it before use:
; /etc/asterisk/rpt.conf — base 855, PIN 0000 (CHANGE IT!) [functions] 85500001 = cmd,asterisk -rx "svx settg 403872 3149060" ; *855 0000 1 -> bulletin TG 85500002 = cmd,asterisk -rx "svx settg 403872 3149070" ; *855 0000 2 -> another TG 85500000 = cmd,asterisk -rx "svx revert 403872" ; *855 0000 0 -> default TG 85500009 = cmd,asterisk -rx "svx down 403872" ; *855 0000 9 -> link down 85500008 = cmd,asterisk -rx "svx up 403872" ; *855 0000 8 -> link up
Set the default TG and an auto-revert timeout in svx.conf:
[403872] tg = 3149050 ; the DEFAULT TG (revert/up target) tg_timeout = 30 ; minutes on another TG before auto-revert (0 = off)
A temporary TG always drops back to default on a reboot, a reconnect, or after tg_timeout — so a forgotten switch never strands the node.
Several nodes or TGs? Use chan_svx_sat
chan_svx is one login = one TG = one stream — one reflector client per section. If you need several nodes / talkgroups over a single reflector login (a shared trunk), that is exactly what the sister driver chan_svx_sat does — it joins as a reflector satellite/trunk instead of a client. See the chan_svx_sat how-to.
Troubleshooting
| Symptom | Check |
|---|---|
svx show empty / "No such command" / node has no rxchannel |
Is load = chan_svx.so enabled inside [modules]? Did you core restart now?
|
down instead of CONNECTED |
Host/port reachable? login/password correct? Watch: sudo tail -f /var/log/asterisk/messages.log | grep -i svx
|
auth rejected: Invalid callsign |
Login must be a valid upper-case callsign, and the account must exist on the reflector. |
auth rejected: Access denied |
Wrong password, or the login isn't registered on the reflector. |
txframes climbs but nobody hears you |
Is the listening client actually selecting/monitoring the same TG? |
Choppy audio out, starts climbing many-per-over |
Key/unkey flapping → raise tx_hold (e.g. 400).
|
txbadsize climbing |
app_rpt is feeding non-slin frames — check the node's audio path. |
| Loads but refuses ("compile-time options") | The package must match the installed asl3-asterisk version — install the deb for your exact OS.
|
Reverting
- Restore the old
rxchannel(uncomment it) and commentrxchannel = SVX/.... - Comment
load = chan_svx.soinmodules.conf. sudo asterisk -rx "core restart now".
Remove entirely: sudo apt remove asl3-chan-svx (add --purge to also drop the sample config and the modules.conf line).
See also
- Hamradio — all the digital-voice and gateway how-tos.
- Author / bug reports: SA7AUX <bjorne@sa7aux.se>. GNU GPL v2.