-
David Trattnig authoredDavid Trattnig authored
AURA Engine Core

AURA Engine Core is a multi-channel playout server for radio stations based on Liquidsoap.
This documentation is meant for developers. For using the AURA Community Radio Suite check out the aura.radio
Prerequisites
Before you begin, ensure you have met the following requirements:
- Operating system: Debian 11, Ubuntu 20.04 or newer
- Liquidsoap 2.1.x installed using OPAM (OCaml Package Manager)
- git
- make
Installation
Install system dependencies:
apt install curl alsa-utils libasound2-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libflac-dev libjack-dev libpulse-dev libswresample-dev libswscale-dev libssl-dev ffmpeg opam
Build Liquidsoap with additional libraries:
opam depext alsa pulseaudio bjack ffmpeg samplerate flac taglib mad lame vorbis flac opus cry ocurl liquidsoap -y
opam install alsa pulseaudio bjack ffmpeg samplerate flac taglib mad lame vorbis flac opus cry ocurl liquidsoap -y
Quickstart
After cloning the project perform following commands inside the project directory:
- Create an initial configuration file based on an sample config:
cp config/sample.engine-core.ini config/engine-core.ini
- Create the folder structure
./audio/fallback/
in the project root and populatefallback
with some music files. This folder is picked up as a so-called Station Fallback in case no other music is scheduled or if silence is detected. - Execute
make run
to get the Engine Core server running. Voilá, you should hear some music!
If the audio device desired for playback is set as default
, the Engine now should be ready to play sound. If you are not hearing any sound set a working output device for output_device_0
in engine-core.ini
and carefully review the logs.
Important: You get the most glitch-free experience when using ALSA devices directly. To avoid any play-out malfunctions ensure that no PulseAudio server is not running.
You can check the systems default audio hardware by executing aplay -L
on the command line. If that's not the case you can set the default device in /etc/asound.conf
or ~/asoundrc
. To check if PulseAudio is started, run make audio.pa.status
. If this command returns an error, PulseAudio is deactivated.
Audio Store
The aforementioned audio
folder is the base for retrieving audio files. Engine Core is referencing three folders from this so-called Audio Store:
-
audio/fallback/
: A local folder for any emergency playback, also called Station Fallback. All audio files inside are played in a randomized order, if no actually scheduled music is played by the engine. The folder is being watched for changes. So you can add/remove audio on the fly. This fallback feature is enabled by default. -
audio/playlist/
: Put a filestation-fallback-playlist.m3u
in here and it has the same effect as the fallback folder. he playlist is being watched for changes. Setfallback_type="playlist"
to enable this instead of the fallback folder. -
audio/source/
: This is the location for audio files provided by Tank. Usually any audio files which are part of the scheduled programme are read from here to perform broadcasts. If you are running all AURA components on a single machine you should be fine with just creating a symbolic link to the relevant Tank folder (ln -s ../engine/audio ./audio
). But in some distributed and redundant production scenario you might think about more advanced options on how to sync your audio files between machines. You can find some ideas in the doc " Setting up the Audio Store".
Configuration
By default only audio output is enabled using the systems default device. If you want to use another audio interface or enable live audio, check the Audio Device Configuration document.
Also review the other settings in your engine-core.ini
to fine-tune the heart of your engine. If you are experiencing issues also check out the Frequently Asked Questions (FAQ).
Channel Routing
Following diagram shows existing channels and their routing.
graph TD
iq0[Queue A] -->|in_queue_0| mix
iq1[Queue B] -->|in_queue_1| mix
is0[Stream A] -->|in_stream_0| mix
is1[Stream B] -->|in_stream_1| mix
il0[Line In 1-5] -->|in_line_0..4| mix
ff[Fallback Folder] -->|fallback_folder| which_fallback
fpls[Fallback Playlist] -->|fallback_playlist| which_fallback
mix[" Mixer "] --> silence_detector
which_fallback{or} -->| | silence_detector{Silence Detector}
silence_detector -->| | output[Output]
output --> |output.alsa| C[fa:fa-play Audio Interface]
output --> |output.icecast| D[fa:fa-play Icecast]