Unable to start liquidsoap, OP25

burkert

Newbie
Joined
Jun 8, 2025
Messages
2
I'm new to this, please bear with me.

System is Ubuntu 24.04, on ODroid M1S.
Two RTL-SDR v4 Dongles
OP25 is boatbod
icecast
version is 2.4.4-4build4
liquidsoap
version is 2.2.4-1

I think that I have both rx.py and multi_rx.py working, sending audio over headphones connected to the ODroid M1S.

  1. I can't seem to get icecast to create an op25 mountpoint,
  2. I can't seem to get liquidsoap to do... liquidsoap things .

Sorry in advance for the wall-of-text, following are some details which may be of help.

  • The system :

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

  • Relevant icecast details :
aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ systemctl -l --no-pager status icecast2 ● icecast2.service - LSB: Icecast2 streaming media server Loaded: loaded (/etc/init.d/icecast2; generated) Active: active (running) since Mon 2025-07-28 21:04:23 CDT; 16min ago Docs: man:systemd-sysv-generator(8) Process: 16273 ExecStart=/etc/init.d/icecast2 start (code=exited, status=0/SUCCESS) Tasks: 4 (limit: 9145) Memory: 3.1M (peak: 3.8M) CPU: 1.433s CGroup: /system.slice/icecast2.service └─16279 /usr/bin/icecast2 -b -c /etc/icecast2/icecast.xml aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ sudo egrep -B 4 op25 /etc/icecast2/icecast.xml <listen-socket> <port>8000</port> <!-- <bind-address>127.0.0.1</bind-address> --> <bind-address>10.216.151.224</bind-address> <shoutcast-mount>/op25</shoutcast-mount> aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

and

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ cat -vet meta.json | sed "s/$PASSWD/hackme/g" {$ "icecastPass": "hackme",$ "icecastMountpoint": "/op25",$ "icecastServerAddress": "10.216.151.224:8000",$ "delay": "0.0", "icecastMountExt": ".m3u",$ "meta_format_idle": "[idle]",$ "meta_format_tgid": "[%TGID%]",$ "meta_format_tag": "[%TGID%] %TAG%",$ "meta_format_rid": "@ [%RID%]"$ }$ aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

  • Relevant liquidsoap details :

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ liquidsoap --version Liquidsoap 2.2.4-1+dev Copyright (c) 2003-2023 Savonet team Liquidsoap is open-source software, released under GNU General Public License. See <http://liquidsoap.info> for more information. aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

and

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ cat -vet op25.liq | sed "s/${PASSWD}/hackme/g" | grep -v ^# set("log.stdout", true)$ set("log.file.path", "/home/aburkert/Downloads/op25/op25/gr-op25_repeater/apps/liquidsoap.log")$ set("log.file", true)$ set("log.level", 3)$ set("frame.audio.samplerate", 8000)$ input = mksafe(input.external(buffer=0.25, channels=2, samplerate=8000, restart_on_error=false, "./audio.py -x 2 -s")) $ input = filter.iir.butterworth.high(frequency = 200.0, order = 4, input)$ input = filter.iir.butterworth.low(frequency = 3250.0, order = 4, input)$ input = normalize(input, gain_max = 3.0, gain_min = -3.0, target = -16.0, threshold = -40.0)$ output.icecast(%mp3(bitrate=16, samplerate=22050, stereo=false), description="op25", genre="Public Safety", url="", fallible=false, host="10.216.151.224", port=8000, mount="op25", password="hackme", mean(input))$ aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

and

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ ./op25.liq At ./op25.liq, line 74, char 0-0: Error 9: Failure: Early computation of source content-type detected for source iir_filter! Raised at Stdlib.failwith in file "stdlib.ml", line 29, characters 17-33 Called from Source.operator#content_type in file "src/core/source.ml", line 407, characters 14-190 Called from Source.operator#audio_channels in file "src/core/source.ml", line 420, characters 53-70 Called from Iir_filter.iir.(fun) in file "src/core/operators/iir_filter.ml", line 71, characters 21-40 Called from CamlinternalOO.iter_f in file "camlinternalOO.ml", line 371, characters 12-17 Called from CamlinternalOO.run_initializers_opt in file "camlinternalOO.ml", line 381, characters 24-40 Called from Lang_source.add_operator.f in file "src/core/lang_source.ml", line 438, characters 39-44 Called from Liquidsoap_lang__Evaluation.apply.f in file "src/lang/evaluation.ml", line 174, characters 8-12 Called from Liquidsoap_lang__Evaluation.eval_term in file "src/lang/evaluation.ml", line 347, characters 10-43 Called from Liquidsoap_lang__Evaluation.eval in file "src/lang/evaluation.ml" (inlined), line 359, characters 10-38 Called from Liquidsoap_lang__Evaluation.eval in file "src/lang/evaluation.ml", line 375, characters 2-25 Called from Liquidsoap_lang__Evaluation.eval_toplevel in file "src/lang/evaluation.ml", line 494, characters 38-46 Called from Liquidsoap_lang__Startup.time in file "src/lang/startup.ml", line 30, characters 12-16 Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52 Called from Liquidsoap_lang__Runtime.type_and_run in file "src/lang/runtime.ml", line 30, characters 4-612 Called from Liquidsoap_lang__Runtime.report in file "src/lang/runtime.ml", line 215, characters 12-23 aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$


and, please note that there is no line 74 in op25.liq :

aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$ wc -l op25.liq 73 op25.liq aburkert@aburkert-m1s:~/Downloads/op25/op25/gr-op25_repeater/apps$

I welcome any advice which you may have.

Thank you,

Burkert
 

burkert

Newbie
Joined
Jun 8, 2025
Messages
2
@boatbod

For what its worth, a solution is by no means required soon. For the interim, I have a functioning system, listening over the local ALSA server , via headphones.

I'm equally surprised that both icecast and liquidsoap are misbehaving. Its my hope that if the icecast issue is resolved, perhaps that may also resolve the liquidsoap matter. (I'm not going to bet on that)

Thank you,

Burkert
 

boatbod

Member
Joined
Mar 3, 2007
Messages
3,547
Location
Talbot Co, MD
Found this related to the liquidsoap issue. Probably resolvable by commenting out the optional signal processing blocks.

Possibly icecast isn't actually misbehaving, and it may not create the mount point until a server starts streaming. Fix the liquidsoap thing and try again.
 

wgbecks

Active Member
Joined
Jan 17, 2005
Messages
1,116
Location
NE Wisconsin
Found this related to the liquidsoap issue. Probably resolvable by commenting out the optional signal processing blocks.

Possibly icecast isn't actually misbehaving, and it may not create the mount point until a server starts streaming. Fix the liquidsoap thing and try again.

That is correct! Your Icecast server is likey alive and well. Howver, if Liquidsoap is aborting execution then there will be no mountpoint
established in Icecast. You can verify Icecast by simply performing an HTTP connection from your browser on the same port number
(IE; 8000) that you specified. The login username is admin and the password is as what specified at instllation.

I will be happy to look at your op25.liq script if you desire to post it here using the option to post code and making sure to redact
the Icecast password.
 

wgbecks

Active Member
Joined
Jan 17, 2005
Messages
1,116
Location
NE Wisconsin
It should be noted that you will encounter difficulty if its your intention to run op25 and liquidsoap via system services (headless)
due to security permissions issues with the audo subsystem. If this is the case, then I might suggest flashing with Ubuntu 22,4.5
or an early Ubuntu dustro where I have been able to devise workarounds for the permissions issues with Pulse Audio.

However, here's an op25.liq script that's known to work Liquidsoap 2.2.4-1 and tested on an Ubuntu 22.04.2 VM.


Code:
#!/usr/bin/liquidsoap

# Example liquidsoap v2.2.4 streaming from op25 to icecast
# (c) 2019-2025 gnorbury@bondcar.com, wllmbecks@gmail.com
#

settings.log.stdout.set(true)
settings.log.file.set(false)
settings.log.file.path.set("/home/username/liquidsoap.log")
settings.log.level.set(2)
settings.log.file.append.set(false)

# Make the native sample rate compatible with op25
settings.frame.audio.size.set(8000)

input = mksafe(input.external.rawaudio(buffer=0.25, channels=2, samplerate=8000, restart_on_error=false, "./audio.py -x 1.25 -s"))

# Consider increasing the buffer value on slow systems such as RPi3. e.g. buffer=0.25
# Longer buffer results in less choppy audio but at the expense of increased latency.


# OPTIONAL AUDIO SIGNAL PROCESSING BLOCKS
# Uncomment to enable
#
# High pass filter
#input = filter.iir.butterworth.high(frequency = 200.0, order = 4, input)

# Low pass filter
#input = filter.iir.butterworth.low(frequency = 3250.0, order = 4, input)

# Compression
input = compress(input, attack = 15.0, gain = 2.0, knee = 1.0, ratio = 3.0, release = 60.0, threshold = -24.0)

# Normalization
input = normalize(input, gain_max = 6.0, gain_min = -6.0, target = -16.0, threshold = -40.0)


# LOCAL AUDIO OUTPUT
# Uncomment the appropriate line below to enable local sound
#
# Default audio subsystem
#out (input)
#
# PulseAudio
#output.pulseaudio(input)
#
# ALSA
#output.alsa(input)


# ICECAST STREAMING
# Uncomment to enable output to an icecast server
# Change the "host", "password", and "mount" strings appropriately first!
# For metadata to work properly, the host address given here MUST MATCH the address in op25's meta.json file
#
output.icecast(%mp3(bitrate=16, samplerate=22050, stereo=false), description="op25", genre="MPSCS Menominee County, MI",
url="", fallible=false, host="localhost", port=8000, mount="op25", password="hackme", mean(input))
 
Last edited:

wgbecks

Active Member
Joined
Jan 17, 2005
Messages
1,116
Location
NE Wisconsin
This post updates the example op25.liq script in Post #7 to correct "High Pass" & "Low Pass" audio filter constructs for applications using
Liquidsoap Version 2.2.4-1. Generally, these specific audio filters are not useful on P25 systems but were included in the example for user
applications associated with Smartnet TRS using analog or a combination of digital and analog talkgroups.

Additionl information for this operator is available by submitting liquidsoap -h filter from the command line.

Code:
#!/usr/bin/liquidsoap

# Example liquidsoap v2.2.4-1 streaming from op25 to icecast
# (c) 2019-2025 gnorbury@bondcar.com, wllmbecks@gmail.com
#

settings.log.stdout.set(true)
settings.log.file.set(false)
settings.log.file.path.set("/home/user_name/liquidsoap.log")
settings.log.level.set(2)
settings.log.file.append.set(false)

# Make the native sample rate compatible with op25
settings.frame.audio.size.set(8000)

input = mksafe(input.external.rawaudio(buffer=0.25, channels=2, samplerate=8000, restart_on_error=false, "./audio.py -x 1.25 -s"))


# Consider increasing the buffer value on slow systems such as RPi3. e.g. buffer=0.25
# Longer buffer results in less choppy audio but at the expense of increased latency.


# OPTIONAL AUDIO SIGNAL PROCESSING BLOCKS
# Uncomment to enable
#
# High pass filter
#input = filter(freq = 200.0, mode = "high", input)

# Low pass filter
#input = filter(freq =3250.0, mode = "low", input)

# Compression
input = compress(input, attack = 15.0, gain = 2.0, knee = 1.0, ratio = 3.0, release = 60.0, threshold = -24.0)

# Normalization
input = normalize(input, gain_max = 6.0, gain_min = -6.0, target = -16.0, threshold = -40.0)


# LOCAL AUDIO OUTPUT
# Uncomment the appropriate line below to enable local sound
#
# Default audio subsystem
#out (input)
#
# PulseAudio
#output.pulseaudio(input)
#
# ALSA
#output.alsa(input)


# ICECAST STREAMING
# Uncomment to enable output to an icecast server
# Change the "host", "password", and "mount" strings appropriately first!
# For metadata to work properly, the host address given here MUST MATCH the address in op25's meta.json file
#
output.icecast(%mp3(bitrate=16, samplerate=22050, stereo=false), description="op25", genre="Public Safety",
url="", fallible=false, host="localhost", port=8000, mount="op25", password="hackme", mean(input))
 
Last edited:
Top