Not hearing audio from liquidsoap stream

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Hi all,

I'm very new to the space and just getting started. I've appreciated the resources here in the forums but I seem to have a problem that I've been struggling with for the past several hours. I have a RTL-SDR V3 hooked up to my Raspberry Pi 3B+ and have gone through the steps from here to get it all set up. Ultimately I'm trying to be able to listen in to trunked radio signals, so I installed op25, liquidsoap, and icecast2. After tweaking with the parameters and troubleshooting other things all day I've got as far as being able to see the trunked signals come in and even have a stream from the icecast2 going with some information coming from op25. I've been really stumped at how I'm able to see some metadata come in to my media player running on my windows machine on the local network but cannot for the life of me get the audio to actually play! I've tried opening the stream on VLC on my phone as well and still have the same problem. I can't hear anything through the stream at all even when op25 is clearly receiving signals.

op25_problem.jpg

This is the command I used most recently


./rx.py --nocrypt --args "rtl=0" -N 'lna:28' -T trunk.tsv -S 1000000 -q 0 -d 0 -v 1 -2 -w -u 23456 -V -X -x
2.5 -M meta.json 2> stderr.2


My ./op25.liq looks like this
Code:
set("log.stdout", true)
set("log.file", true)
set("log.syslog", true)
set("log.level", 3)


# Make the native sample rate compatible with op25
set("frame.audio.samplerate", 8000)

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

...

# 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, icy_metadata="false", host="192.168.20.85", port=8000, mount="op25", password="xxxxxxxx", mean(input))

When I run liquidsoap this is my log:
Code:
pi@raspberrypi-makemake:~/op25/op25/gr-op25_repeater/apps $ liquidsoap ./op25.liq
2020/11/15 06:12:13 >>> LOG START
2020/11/15 06:12:13 [main:3] Liquidsoap 1.3.3
2020/11/15 06:12:13 [main:3] Using: bytes=[distributed with OCaml 4.02 or above] pcre=7.2.3 dtools=0.4.0 duppy=0.7.2 duppy.syntax=0.7.2 cry=0.6.2 mm=0.3.1 xmlplaylist=0.1.3 lastfm=0.3.0 ogg=0.5.2 vorbis=0.7.1 opus=0.1.2 speex=0.2.1 mad=0.4.4 flac=0.1.3 flac.ogg=0.1.3 dynlink=[distributed with Ocaml] lame=0.3.2 shine=0.2.0 gstreamer=0.2.0 frei0r=0.1.0 theora=0.3.1 gavl=0.1.5 bjack=0.1.4 alsa=0.2.3 ao=0.2.0 samplerate=0.1.2 taglib=0.3.1 magic=0.7.3 camomile=0.8.5 yojson=1.3.2 faad=0.4.0 soundtouch=0.1.7 portaudio=0.2.1 pulseaudio=0.1.2 ladspa=0.1.4 dssi=0.1.1 sdl=0.9.1 camlimages=4.2.0 lo=0.1.0 gd=1.0a5
2020/11/15 06:12:13 [gstreamer.loader:3] Loaded GStreamer 1.14.4 0
2020/11/15 06:12:13 [dynamic.loader:3] Could not find dynamic module for fdkaac encoder.
2020/11/15 06:12:13 [frame:3] Using 8000Hz audio, 25Hz video, 8000Hz master.
2020/11/15 06:12:13 [frame:3] Frame size must be a multiple of 320 ticks = 320 audio samples = 1 video samples.
2020/11/15 06:12:13 [frame:3] Targetting 'frame.duration': 0.04s = 320 audio samples = 320 ticks.
2020/11/15 06:12:13 [frame:3] Frames last 0.04s = 320 audio samples = 1 video samples = 320 ticks.
2020/11/15 06:12:13 [threads:3] Created thread "generic queue #1".
2020/11/15 06:12:13 [threads:3] Created thread "generic queue #2".
2020/11/15 06:12:13 [threads:3] Created thread "non-blocking queue #1".
2020/11/15 06:12:13 [threads:3] Created thread "non-blocking queue #2".
2020/11/15 06:12:13 [input.external_7212:3] Starting process
2020/11/15 06:12:13 [op25:3] Connecting mount op25 for source@192.168.20.85...
2020/11/15 06:12:13 [op25:3] Connection setup was successful.
2020/11/15 06:12:13 [threads:3] Created thread "wallclock_main" (1 total).
2020/11/15 06:12:13 [clock.wallclock_main:3] Streaming loop starts, synchronized with wallclock.
2020/11/15 06:12:13 [mksafe:3] Switch to safe_blank.
^C2020/11/15 06:19:51 [main:3] Shutdown started!
2020/11/15 06:19:51 [main:3] Waiting for threads to terminate...
2020/11/15 06:19:51 [op25:3] Closing connection...
2020/11/15 06:19:51 [clock.wallclock_main:3] Streaming loop stopped.
2020/11/15 06:12:13 [input.external_7212:3] Cleaning up process
2020/11/15 06:19:51 [threads:3] Thread "wallclock_main" terminated (0 remaining).
2020/11/15 06:19:51 [main:3] Threads terminated.
2020/11/15 06:19:51 [threads:3] Shutting down scheduler...
2020/11/15 06:19:51 [threads:3] Scheduler shut down.
2020/11/15 06:19:51 [threads:3] Thread "generic queue #2" terminated.
2020/11/15 06:19:51 [threads:3] Thread "generic queue #1" terminated.
2020/11/15 06:19:51 [main:3] Cleaning downloaded files...
2020/11/15 06:19:51 [main:3] Freeing memory...
2020/11/15 06:19:51 [threads:3] Thread "non-blocking queue #2" terminated.
My /var/log/icecast2/error.log looks like this
Code:
[2020-11-15  06:36:34] INFO connection/_handle_source_request Source logging in at mountpoint "/op25" from 192.168.20.85
[2020-11-15  06:36:34] DBUG connection/connection_complete_source sources count is 0
[2020-11-15  06:36:34] WARN format/format_get_type Unsupported or legacy stream type: "audio/mpeg". Falling back to generic minimal handler for best effort.
[2020-11-15  06:36:34] DBUG source/source_apply_mount Applying mount information for "/op25"
[2020-11-15  06:36:34] DBUG format-mp3/format_mp3_apply_settings sending metadata interval 16000
[2020-11-15  06:36:34] DBUG format-mp3/format_mp3_apply_settings charset ISO8859-1
[2020-11-15  06:36:34] DBUG source/source_apply_mount YP changed to 1
[2020-11-15  06:36:34] DBUG source/source_update_settings public set to 1
[2020-11-15  06:36:34] DBUG source/source_update_settings max listeners to -1
[2020-11-15  06:36:34] DBUG source/source_update_settings queue size to 524288
[2020-11-15  06:36:34] DBUG source/source_update_settings burst size to 65535
[2020-11-15  06:36:34] DBUG source/source_update_settings source timeout to 10
[2020-11-15  06:36:34] DBUG source/source_update_settings fallback_when_full to 0
[2020-11-15  06:36:34] DBUG connection/connection_complete_source source is ready to start
[2020-11-15  06:36:34] DBUG fserve/fserve_add_client_callback Adding client to file serving engine
[2020-11-15  06:36:34] DBUG fserve/fserve_add_pending fserve handler waking up
[2020-11-15  06:36:34] DBUG fserve/fserv_thread_function fserve handler exit
[2020-11-15  06:36:34] DBUG source/source_init Source creation complete
[2020-11-15  06:36:34] DBUG stats/modify_node_event update global clients (1)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update global connections (1992)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update global sources (1)
[2020-11-15  06:36:34] DBUG stats/process_source_event new source stat /op25
[2020-11-15  06:36:34] DBUG stats/process_source_event new node listenurl (http://localhost:8000/op25)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node listener_peak (0)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node public (1)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node server_name (op25)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node server_description (op25)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node genre (Public Safety)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node server_type (audio/mpeg)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node max_listeners (unlimited)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node source_ip (192.168.20.85)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node user_agent (Liquidsoap/1.3.3 (Unix; OCaml 4.05.0))
[2020-11-15  06:36:34] DBUG stats/modify_node_event update global source_client_connections (7)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node listeners (0)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node channels (1)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node samplerate (22050)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node bitrate (16)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node audio_info (channels=1;samplerate=22050;bitrate=16)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update "/op25" listenurl (http://localhost:8000/op25)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update global source_total_connections (7)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node slow_listeners (0)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update "/op25" listeners (0)
[2020-11-15  06:36:34] DBUG stats/modify_node_event update "/op25" listener_peak (0)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node stream_start (Sun, 15 Nov 2020 06:36:34 +0000)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node stream_start_iso8601 (2020-11-15T06:36:34+0000)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node total_bytes_read (0)
[2020-11-15  06:36:34] DBUG stats/process_source_event new node total_bytes_sent (0)
[2020-11-15  06:36:35] INFO source/source_main listener count on /op25 now 0
[2020-11-15  06:36:35] DBUG stats/modify_node_event update "/op25" listeners (0)
[2020-11-15  06:36:35] INFO source/get_next_buffer End of Stream /op25
[2020-11-15  06:36:35] INFO source/source_shutdown Source from 192.168.20.85 at "/op25" exiting
[2020-11-15  06:36:35] DBUG source/source_clear_source clearing source "/op25"
[2020-11-15  06:36:35] DBUG source/source_free_source freeing source "/op25"
[2020-11-15  06:36:35] DBUG stats/process_source_event delete source node /op25
[2020-11-15  06:36:35] DBUG stats/modify_node_event update global clients (0)
[2020-11-15  06:36:35] DBUG stats/modify_node_event update global sources (0)
[2020-11-15  06:36:36] DBUG slave/_slave_thread checking master stream list
[2020-11-15  06:38:36] DBUG slave/_slave_thread checking master stream list

My meta.json looks like this:
Code:
{
    "icecastPass": "xxxxxxxxxx",
    "icecastMountpoint": "op25",
    "icecastServerAddress": "192.168.20.85:8000",
    "delay": "0.0", "icecastMountExt": ".m3u",
    "meta_format_idle": "[idle]",
    "meta_format_tgid": "[%TGID%]",
    "meta_format_tag":  "[%TGID%] %TAG%"
}

If anyone here has any ideas on what I can try to help troubleshoot the problem, I'd really appreciate as I'd hate to give up on this when I'm so close to the finish line...
🙏
 

boatbod

Member
Joined
Mar 3, 2007
Messages
2,411
Location
Talbot Co, MD
liquidsoap look like it is starting up properly, running and filling the stream with "safe_blank" until the ctrl-c at 06:19:51.
darkice looks like it is running and receiving connections ok

Are you sure op25 is receiving and forwarding voice traffic? What does the op25 log (stderr.2) look like?

If you have op25 running but liquidsoap stopped, what happens if you manually run ./audio.py from the 'apps' directory? Without additional command line options it should connect to op25's udp output stream and play local audio if there are any calls.
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Are you sure op25 is receiving and forwarding voice traffic? What does the op25 log (stderr.2) look like?
So when I look at my op25 log, I get a ton of "p25_framer::rx_sym() tuning error +/- 2400" messages but if I filter those out, this is what my stderr.2 looks like:

Code:
11/15/20 15:07:02.567661 voice update:  tg(2451), freq(851712500), slot(-), prio(3)
11/15/20 15:07:02.640091 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:02.758747 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:04.297667 voice update:  tg(2451), freq(851712500), slot(-), prio(3)
11/15/20 15:07:04.385565 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:06.368496 voice update:  tg(971), freq(851925000), slot(-), prio(3)
11/15/20 15:07:06.434803 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:06.549056 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:08.724265 voice update:  tg(2468), freq(853362500), slot(-), prio(3)
11/15/20 15:07:08.797423 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:11.115208 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:12.013347 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:12.078725 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:13.967590 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:14.038097 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:15.550978 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:15.622035 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:17.114216 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:17.186305 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:19.079149 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:19.153925 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:20.927271 voice update:  tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:20.991397 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:23.026293 voice update:  tg(2468), freq(853950000), slot(-), prio(3)
11/15/20 15:07:23.120772 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:23.233961 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:25.125291 voice update:  tg(2468), freq(853950000), slot(-), prio(3)
11/15/20 15:07:25.192416 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:25.307250 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:26.691807 voice update:  tg(2468), freq(853950000), slot(-), prio(3)
11/15/20 15:07:26.770933 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:28.915833 voice update:  tg(1221), freq(851712500), slot(-), prio(3)
11/15/20 15:07:28.994076 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:31.015720 voice update:  tg(1122), freq(852337500), slot(-), prio(3)
11/15/20 15:07:31.114940 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:33.499795 control channel timeout
11/15/20 15:07:33.531653 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:34.045181 voice update:  tg(2468), freq(852112500), slot(-), prio(3)
11/15/20 15:07:34.144331 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:36.004593 voice update:  tg(2468), freq(852112500), slot(-), prio(3)
11/15/20 15:07:36.069382 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:38.296399 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:39.141407 voice update:  tg(2455), freq(853425000), slot(-), prio(3)
11/15/20 15:07:39.220183 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:41.238731 voice update:  tg(2456), freq(851812500), slot(-), prio(3)
11/15/20 15:07:41.340240 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:43.079728 voice update:  tg(2456), freq(851812500), slot(-), prio(3)
11/15/20 15:07:43.156485 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:45.374829 meta_server::send_metadata(): metadata update error: 400
11/15/20 15:07:45.434287 voice update:  tg(2456), freq(851812500), slot(-), prio(3)
11/15/20 15:07:45.500315 meta_server::send_metadata(): metadata update error: 400
If you have op25 running but liquidsoap stopped, what happens if you manually run ./audio.py from the 'apps' directory? Without additional command line options it should connect to op25's udp output stream and play local audio if there are any calls.
Just running ./audio.py while op25 is running I get

Code:
$ ./audio.py
using ALSA sound system
audio device: default
Listening on 0.0.0.0:23456
Traceback (most recent call last):
  File "./audio.py", line 48, in <module>
    audio_handler = socket_audio("0.0.0.0", options.wireshark_port, options.audio_output, options.two_channel, options.audio_gain, options.stdout)
  File "/home/pi/op25/op25/gr-op25_repeater/apps/sockaudio.py", line 405, in __init__
    self.setup_sockets(udp_host, udp_port)
  File "/home/pi/op25/op25/gr-op25_repeater/apps/sockaudio.py", line 505, in setup_sockets
    self.sock_a.bind((udp_host, udp_port))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
 

boatbod

Member
Joined
Mar 3, 2007
Messages
2,411
Location
Talbot Co, MD
I see multiple problems that are going to need to be resolved before it's going to work properly.

1. It's good that you have "voice update" messages, but it's concerning when you see very short intervals between activity because it suggests either lots of really short conversations or that op25 is not remaining on the voice channel for some reason.
11/15/20 15:07:02.567661 voice update: tg(2451), freq(851712500), slot(-), prio(3)
11/15/20 15:07:04.297667 voice update: tg(2451), freq(851712500), slot(-), prio(3)
11/15/20 15:07:06.368496 voice update: tg(971), freq(851925000), slot(-), prio(3)
11/15/20 15:07:08.724265 voice update: tg(2468), freq(853362500), slot(-), prio(3)
11/15/20 15:07:12.013347 voice update: tg(978), freq(853425000), slot(-), prio(3)
11/15/20 15:07:13.967590 voice update: tg(978), freq(853425000), slot(-), prio(3)

2. The excessive "metadata update" errors can be disregarded until you get liquidsoap working properly. In fact I'd recommend dropping the "-M" command line option until you get op25 sorted out.

3. The "p25_framer::rx_sym() tuning error +/- 2400" errors are a big clue that either the tuning or possibly the modulation type are not well dialed in and that you probably wouldn't get good audio as a result.

4. The "Address already in use" message from audio.py suggests that liquidsoap is still running in another window (or as a service). If so you probably want to stop it while we fix up op25.

Using the terminal, activate a mixer plot (#5) and datascope plot (#4) and post a screenshot of what they look like. So far I've only seen phase 1 (FDMA) traffic in your log fragment so we need to check that you are configured for the correct demodulation scheme.
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
1. Yeah, I certainly did notice they seem consistently very short and was wondering why that's the case. :unsure:

2. Got it! Okay I've dropped the '-M meta.json' for now.

3/4. So is liquidsoap running when I run the rx.py command? I thought that was only running the op25 module. The reason I ask is while that rx.py command is running I get the same "Address already in use" error but if I just run audio.py without running rx.py I get the same result as above without the socket.error message. I'll investigate this as when I did a ps ax command I didn't see any liquidsoap processes running

It appears that I can't run rx.py and audio.py both simultaneously without one giving me a "socket.error Address already in use" message.

I haven't installed the plot software yet so I'll do that and share results from that. Thanks for your help on this! 🙏
 
Last edited:

boatbod

Member
Joined
Mar 3, 2007
Messages
2,411
Location
Talbot Co, MD
It appears that I can't run rx.py and audio.py both simultaneously without one giving me a "socket.error Address already in use" message.

I haven't installed the plot software yet so I'll do that and share results from that. Thanks for your help on this! 🙏
Make sure there isn't a "-U" parameter somewhere on the rx.py command line. It it is present it enables the built-in audio player which will grab the port and prevent the external apps using it.
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Make sure there isn't a "-U" parameter somewhere on the rx.py command line. It it is present it enables the built-in audio player which will grab the port and prevent the external apps using it.
Got it! Okay with op25 running and without liquidsoap, when I run audio.py (w/ no launch params) I just get this with no further updates:

Code:
$ ./audio.py
using ALSA sound system
audio device: default
Listening on 0.0.0.0:23456
 

boatbod

Member
Joined
Mar 3, 2007
Messages
2,411
Location
Talbot Co, MD
Got it! Okay with op25 running and without liquidsoap, when I run audio.py (w/ no launch params) I just get this with no further updates:

Code:
$ ./audio.py
using ALSA sound system
audio device: default
Listening on 0.0.0.0:23456
Ok that's actually a good sign!
The mixer plot looks displaced to the right. Do you have a screenshot of the datascope plot?
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Ah! I think I see the problem I was offset on the control channel frequency by 2 Khz. Admittedly while I was going based on the reference page but noticed the peak of the activity was 2 Khz off so I fine-tuned it to that... guess that turned out to be a bad move. :cautious:

Does this datascope look better? Not sure what ideally it's supposed to look like...
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Alas I'm still not hearing any audio whatsoever still when I try the icecast/liquidsoap stream... so that remains an issue...

These are the params I'm currently using...

./rx.py
--args "rtl" -N 'lna:48' -T trunk.tsv -S 1000000 -q 0 -d 0 -D cqpsk -v 1 -2 -u 23456 -V -X -M meta.json 2> stderr.2

./op25.liq
Code:
#!/usr/bin/liquidsoap

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

set("log.stdout", true)
set("log.file", true)
set("log.syslog", true)
set("log.level", 3)


# Make the native sample rate compatible with op25
set("frame.audio.samplerate", 8000)

input = mksafe(input.external(buffer=0.25, channels=2, samplerate=8000, restart_on_error=false, "./audio.py -x 2.0 -s -u 23456"))
# 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)

# Normalization
#input = normalize(input, gain_max = 3.0, gain_min = -3.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, icy_metadata="false", host="localhost", port=8000, mount="op25", password="xxxxxxxxxx", mean(input))
./rx.py
--args "rtl" -N 'lna:48' -T trunk.tsv -S 1000000 -q 0 -d 0 -D cqpsk -v 1 -2 -u 23456 -V -X -M meta.json 2> stderr.2
 

eccentricbiped

Member
Premium Subscriber
Joined
Nov 14, 2020
Messages
10
Location
Austin, TX, USA
Ah right after I posted I realized I took out the "-w" param and need to put that back in.

./rx.py
--args "rtl" -N 'lna:48' -T trunk.tsv -S 1000000 -q 0 -d 0 -D cqpsk -v 1 -2 -w -u 23456 -V -X -M meta.json 2> stderr.2

At last I can hear audio! 🎉 Thanks so much for your help, boatbod! 🙏
 

boatbod

Member
Joined
Mar 3, 2007
Messages
2,411
Location
Talbot Co, MD
Here's my datascope from a simulcast control channel on our state-wide phase 2 system. Transitions should converge at -3, -1, +1 , +3.
Tweak the tuning to move the convergence points up/down. The quality of signal can be inferred by how stable the eyes appear, and how well the lines overlay on each other.

Screenshot from 2020-11-15 19-52-21.png
 
Top