Like so many other churches, mine decided to go all in on live streaming our services via Facebook Live during the COVID-19 lock downs.
We usually stream audio only, and it’s a rough post-fader send from our front of house mixer due to a lack of resources available to do a dedicated broadcast mix. However, this all changed when our Facebook stream would be front and center for our entire church. Suddenly we went from 5 viewers per service, to over 100 for the first couple of services! We pulled out the camera that we use for special events and worked on cleaning up our audio mix for a large online audience.
Right off the bat, church leadership asked if it was possible for me to run audio for our live stream from home. This was for a couple of reasons. First, our state required that there be less than 10 people in the building. Second, nobody wanted to risk those with young children being exposed unnecessarily.
Being a network engineer by day I knew I could easily remote control our mixer. We use a Behringer x32, which is 100% controllable over the network via the x32-edit application, or other OSC controllers. However, I wasn’t sure about getting a real time audio feed suitable for mixing remotely.
Dante came to mind first, but not owning any Dante compatible equipment meant I’d need to use Dante Via on a computer to convert the audio to network data. Dante also requires layer 2 adjacency if you don’t have Dante Domain Manager. Dante also assumes low latency and low jitter links, which doesn’t describe the open internet, even on a good day.
In my search, I came across a utility called trx which looked great, but given the short time constraints and lack of spare hardware sitting around ended up being just a little out of reach. However, the author of trx also created Cleanfeed which ended up being browser based with a simple UI and absolutely perfect for my needs.
As it turns out I had decided to purchase a rack mount version of the x32 myself for another project at just the right time. That project fell through due to the pandemic, and I was left with the x32 rack available to create a dedicated broadcast mix for the church. Having found all the puzzle pieces I set about actually figuring out how put them all together.
Getting Started
Our regular setup is to connect our microphones directly to our mixer via XLR cables, create a baseline mix using post fader sends to a mix bus, then route that mix bus out the USB connection to a computer where it is streamed to the internet.

One of the things I like most about the x32 ecosystem is that despite the relatively low cost it is packed with advanced routing capabilities as well as an on board digital snake option called AES50. It’s two AES50 ports are each capable of 48 channels of audio in both directions making it incredibly easy to route audio channels to and from a second mixer.

Audio Routing
In general the x32 routing is done in blocks of 8, although the recent 4.0 firmware update has the ability to do some 1 to 1 routing changes. However it’s limited to some “user input” and “user output” blocks and there aren’t enough of them to allow for custom routing all 48 channels over AES50.
To get audio to the broadcast mixer the front of house mixer is set to route all 32 local XLR inputs out the AES50-B port which is connected to the broadcast mixers AES50-B port. Additionally inputs 1-8 from the FOH mixer’s USB card are routed out AES50-B 33-40. The broadcast mixer takes AES50 inputs 1-32 and routes them to our mixer channels. It also takes AES50 33-40 and maps them through a user input block to allow them to be mapped to the aux inputs to allow playback of audio from our front of house PC if needed.

The front of house mixer splits audio off to the AES50 port directly after the preamp stage of the signal chain, so the front of house mixer in control of the preamp gain, but otherwise the broadcast mixer has complete control of it’s own signal processing such as EQ and compression, as well as it’s own set of mix buses. At this point the broadcast mixer has everything it needs to make a mix completely independent of the front of house mixer.
Next I need to get the final broadcast mix back to front of house to send to the streaming computer using it’s existing connection. For this I’m using a User Output block to route the monitor bus and main bus from broadcast back down the AES50 connection back to the FOH mixer. This user out block is also routed to the local USB card for the cleanfeed send. On the FOH side I use another User Output block to route the AES connection out the USB card towards the computer.

At this point all the routing is in place to get my monitor feed sent out the USB connection of the broadcast mixer and into a computer running Cleanfeed, and the final mix out the USB connection of the FOH mixer to go to our streaming software.

Remote Control
With audio routing taken care of it was time to get remote access to the mixer for control. In the past I’d simply used TeamViewer or Chrome Remote Desktop to log in to a computer at the church and run x32-edit to make minor adjustments, but that requires a lot more bandwidth and is somewhat slow to interact with. I wanted to run x32-edit on my PC at home. Doing so would also let me use a midi controller for tactile control of faders. This meant I needed to set up a VPN connection between the church and my house.
Conveniently I’ve been using a Ubiquiti EdgeRouter at home for years. The EdgeRouter line runs a fork of VyOS (formerly Vyatta) which is a linux based network appliance OS you can run on standard PC hardware for free. One of the features of EdgeOS and VyOS is a built in OpenVPN implementation which includes a site-to-site mode. Luckily it can operate when one side is behind NAT, so I didn’t need to make any changes to the church network.

I installed VyOS on a spare PC and put it at the church, and set up a site-to-site tunnel between it an my router at home. Below is the relevant configuration from the VyOS router.
interfaces {
openvpn vtun0 {
device-type tun
local-address 10.0.0.2 {
subnet-mask 255.255.255.0
}
mode site-to-site
remote-address 10.0.0.1
remote-host <HOME_PUBLIC_IP>
remote-port 1730
shared-secret-key-file /config/auth/secret
}
}
protocols {
route 172.16.10.0/24 {
next-hop 10.0.0.1 {
}
}
}
}
And the configuration from the router at home.
interfaces {
openvpn vtun1 {
local-address 10.0.0.1 {
subnet-mask 255.255.255.0
}
local-host <HOME_PUBLIC_IP>
local-port 1730
mode site-to-site
remote-address 10.0.0.2
shared-secret-key-file /config/auth/secret
}
}
protocols {
static {
route 192.168.1.0/24 {
next-hop 10.0.0.2 {
}
}
}
}
The last detail was to configure the broadcast mixer to use the the VyOS router as it’s default gateway. Once the VPN tunnel is up and the routing in place I can run x32-edit on my PC at home and connect it directly to the broadcast mixer for full remote control. Cleanfeed will also automatically send the audio over the VPN tunnel since the routes exist, so I have as few network hops as possible between both ends. I estimate the audio latency to be under 50ms which is definitely fast enough to mix live audio.
Final Thoughts
I’ve been mixing the audio from home for our live stream for over a month now. Audio quality via Cleanfeed isn’t the perfect, but it’s good enough for my purposes. It pops and clicks occasionally as the jitter on the network varies, and while the compression codec is very good, it isn’t the same a listening to uncompressed audio. The Facebook stream doesn’t suffer the pops and clicks as it’s heavily buffered, although Facebook live certainly has been struggling recently due to the huge surge in demand.
One final tip: add some reverb to your broadcast mix. I made a reverb bus and routed the vocal channels, piano, and snare into it. I ride the level on the reverb return to add a more natural sound to the mix. The mix feels really flat without it.