The Multimode USRP Fanout Bridge


A Multimode USRP Fanout Bridge ties several different digital voice modes into one shared conversation. It is a companion piece to the XLX and URF explainers, but it works on a different principle. Every mode is turned into plain audio, and a small program in the middle copies that audio to all the other modes. The name says what it does: it links many modes (multimode), carries their audio over a common transport (USRP), sends that audio from one to all (fanout), and joins systems that would otherwise be separate (bridge).

What it is

The bridge connects two or more digital voice systems, each running its own mode, into one linked group. Key up on any mode, and everyone on the others hears you. It scales naturally: a two-leg bridge links two modes, a six-leg bridge links six, and the design is the same either way.

This is a different idea from an XLX or URF reflector. Those are single servers that transcode inside the server: you pick a module and talk to whoever else is in it, on any mode. A fanout bridge has no rooms of its own. It sits beside the reflectors, with one leg per mode, and stitches them together behind the scenes.

How it works: the fanout hub

All of the legs meet in the middle as plain digital audio, the uncompressed audio-over-IP format (USRP) that AllStar and the DVSwitch tools use. At the center sits a small program called a fanout.

The common-ground trick

Each leg's job is to convert between its own mode and plain audio. When someone transmits, their audio arrives at the fanout as ordinary uncompressed sound. It is no longer "DMR" or "D-STAR", just audio. The fanout copies that audio out to every other leg, and each leg re-encodes it into its own mode. The meeting point is uncompressed audio, not any single codec.

That is the heart of the design. Every mode only ever converts to and from plain audio at its own leg, so adding a leg or removing one changes nothing else: the hub simply has one more or one fewer place to copy to. Most legs can use a software vocoder. D-STAR is the exception, because its older AMBE codec in practice needs a hardware vocoder such as a DVstick.

The procedure, step by step

What happens when someone talks, for example a DMR user on a two-leg DMR and M17 bridge:

  1. The DMR user keys up. The reflector sends the DMR voice frames to everyone on that room, including the DMR leg, which is logged in like any other user.
  2. The DMR leg decodes the frames with its vocoder and turns them into plain audio: 160 samples every 20 milliseconds, wrapped in USRP packets.
  3. The leg sends those packets to the fanout.
  4. The fanout copies each packet to every other leg, never back to the leg it came from. That rule is what stops audio from looping forever.
  5. The M17 leg encodes the audio with Codec 2 and sends it to the M17 reflector as an M17 stream.
  6. The M17 reflector delivers it to every M17 user in that room. They hear the DMR user.
  7. When the DMR user unkeys, an end-of-transmission packet follows the same path, so every leg unkeys too.

How to build one, in the order that keeps each step testable:

  1. Pick the room on each side. One room per mode: a talkgroup, a module or a reflector number. Make sure nobody else already bridges it.
  2. Plan the ports. Each leg needs a port it sends audio from and a port it listens on, and the fanout needs one listening port per leg. Write them all down before starting; two programs fighting over one port is a common problem.
  3. Build one leg and test it alone. Connect the leg to its reflector, check it logs in, and check that a transmission on the reflector produces audio packets on the leg's output port.
  4. Add the fanout with just two legs, and test both directions: talk on mode A and listen on mode B, then the other way round.
  5. Add the other legs one at a time, testing each before adding the next.
  6. Make it survive a reboot. Run every leg and the fanout as services that start on their own, in the right order, and restart if they stop.
  7. Watch the logs on the first real conversations. A leg that quietly drops audio, as in the lessons below, only shows up there.

A worked example: the VEXJET converter

VEXJET is N6JET's Vexillum reflector. Vexillum does no transcoding, so on its own a DMR user and an M17 user on module A would not hear each other. A fanout bridge on the same server joins them. Each leg logs in to VEXJET as an ordinary user of its mode, on the module it serves.

Module A, Silicon Valley Multimode: four legs meet in the fanout.

LegModeHow it connects
1DMRMMDVM_Bridge and Analog_Bridge, software vocoder (md380-emu)
2P25P25Gateway, MMDVM_Bridge and Analog_Bridge, software vocoder
3M17USRP2M17 (Codec 2 is open, so no vocoder hardware is needed)
4D-STARircDDBGateway and MMDVM_Bridge on the server, Analog_Bridge with a DVstick 30 on the N6JET Beelink, reached over Tailscale

YSF 95114, NXDN 9512 and TGIF talkgroup 95110 also reach module A, but not through the fanout. They join the DMR side through Vexillum bridge programs. So a single room on module A is reachable from seven doors: DMR, TGIF, YSF, NXDN, P25, M17 and D-STAR.

Module B, General Use: a second fanout with three legs, DMR, M17 and D-STAR, built the same way. The second DVstick 30 serves its D-STAR leg.

Module Z, echo test: the same DMR and M17 legs, but instead of a fanout there is a small program that records each transmission and plays it back one second later, into the leg it came from. D-STAR has its own echo on module Z: it replays the D-STAR voice data exactly as received, so it needs no vocoder at all.

From a user's seat, none of this is visible. A D-STAR operator, a DMR operator and an M17 operator on module A are simply in the same conversation.

Two lessons from building it

Found and fixed, 6 November 2026

1. USRP2M17 only accepts audio from the port it sends to. A fanout that sends from a random port is silently ignored, so audio from DMR, P25 and D-STAR never reached M17 users. The fix: the fanout sends to the M17 leg from the same socket the M17 leg sends to.

2. USRP2M17 leaves the M17 frame checksum (CRC) as zero. Vexillum checks it and drops every frame. The fix: a small relay between USRP2M17 and the reflector fills in the correct M17 CRC.

History: the N6JET six-leg bridge

The first N6JET fanout bridge joined six separate systems into one conversation. It is no longer running; it was shut down in late August 2026. Its legs were:

LegModeConnected to
1DMRTGIF talkgroup 95110
2YSF (Fusion)URFJET, reflector 95111
3NXDNReflector 9511
4P25Reflector 9511
5M17M17-JET, Module Q
6D-STARXLXJET, Module Q

TGIF talkgroup 95110 now leads to VEXJET module A, Silicon Valley Multimode.

How it's built

A fanout bridge is assembled from open-source building blocks rather than one piece of reflector software. Each leg uses DVSwitch bridge components (Analog_Bridge and MMDVM_Bridge) or a mode-specific bridge such as USRP2M17 for M17, all feeding a central usrp-fanout script that does the audio distribution. The bridge runs beside the reflector, on its own ports, so the two never get in each other's way.

Credits

The foundations here are other people's work. Meeting several digital modes in plain USRP audio is what the DVSwitch suite was built to do. The mode legs are DVSwitch's Analog_Bridge and MMDVM_Bridge, by Steve Zingman (N4IRS) and Mike Zingman (N4IRR), with MMDVM_Bridge built on Jonathan Naylor's (G4KLX) MMDVM. ircDDBGateway and P25Gateway are also G4KLX's. The M17 leg uses USRP2M17 from the nostar / N7TAE project. The software vocoder is md380-emu, from the md380tools project. Vexillum is by Steve Miller (KC1AWV). The fanout, the echo test and the CRC relay are small custom scripts written for this setup. See github.com/DVSwitch and github.com/nostar/MMDVM_CM.

The bottom line

XLX and URF are reflectors that transcode inside the server. A Multimode USRP Fanout Bridge reaches the same goal from outside: one leg per mode, all meeting as plain sound in a small hub. It is a different answer to the same goal that runs through all of these projects, letting people on different digital modes talk to one another as if the mode never mattered. On VEXJET it turns a reflector that does no transcoding into one multimode room.


Built on DVSwitch (Steve Zingman N4IRS & Mike Zingman N4IRR), G4KLX's MMDVM, ircDDBGateway and P25Gateway, USRP2M17 (nostar / N7TAE), md380tools and Vexillum (KC1AWV); see Credits above. A noncommercial hobby project, shared freely for anyone interested in amateur digital voice. Updated 6 November 2026.