Dygear
Member
Theoretically audio.py can be used to make sockaudio.py combine two streams from separate udp ports into L and R channels of a single alsa device.
That would be cool!
Theoretically audio.py can be used to make sockaudio.py combine two streams from separate udp ports into L and R channels of a single alsa device.
That would be cool!
Usage: audio.py [options]
Options:
-h, --help show this help message and exit
-O AUDIO_OUTPUT, --audio-output=AUDIO_OUTPUT
audio output device name
-u WIRESHARK_PORT, --wireshark-port=WIRESHARK_PORT
Wireshark port
-2, --two-channel single or two channel audio
Had to redo the setup, since trying to upgrade from Jessie to Stretch screwed up everything. Using a RPI 3B
Used a fresh Raspbian Stretch image, did update / upgrade / dist-upgrade on it.
I've installed op25 using the instructions, with the ./install.sh script.
As stated in other posts, using multi_rx.py with a json file, since I want to monitor 2 local ham repeaters (one DStar and one Fusion C4FM) which are 2,17 MHz apart.
Content of the json file:
<snip>
"devices": [
{
"args": "rtl:0",
"frequency": 146035000,
"gains": "lna:48",
"name": "rtl0",
"offset": 0,
"ppm": 62,
"rate": 2400000,
"tunable": false
}
]
}
I know the RTL-SDR dongle is working, tried rtl_tcp on it and I can use SDR# remotely to monitor analog signals.
When I tru to launch multi_rx.py, I keep getting either segmentation fault,or corrupted double-link list errors.
I had to search the history of this thread to recall the cause. "rtl:0" in "args" should be "rtl=0" (or possibly just "rtl")
Which op25 codebase are you using? i.e. what git commands did you use?
Next steps: to stream both feeds to Broadcastify / Radioreference, using Boatbod's instructions on the other post.
Good luck and let me know how it works. It's kinda experimental...
Thanks, I've just done some testing, and I'll continue the discussion about this in the Broadcastify streaming post, since it's on that subject and to not hijack this one.
haha, just finished a session running OP25 on the RPI - it's a "3" model "B" if that means anything. It works perfectly. I used the new rx.py version in straight CLI mode, with audio piped over UDP to an audio server running on a nearby PC. The speaker output port of the RPI requires a special type of audio connector (4-pole) that I haven't played with yet, but there's no reason it shouldn't work. Load average (keep in mind this is a 4-core unit) was around 1.5 or 1.6, with the RPI GUI running and 'top' running in another window...
Max
What Windows application did you use to stream to from OP25? I have my RPI3Bplus running Boadbod's OP25 and would like to capture the audio directly instead of through the built-in audio jack. I have played around trying to send audio through the wireshark port but haven't had much luck. I have written other Microsoft DOTNET code to capture TGIDs and catalog the transmissions. I would just like to get some better audio through some audio filtering.
Mark - the main trick for better RPi3 audio is to reduce your sample rate to -S 57600 as that frees up cpu cycles that would otherwise be used for USB data transfer.
If you want to stream raw audio frames out of op25 to another client across the network you change the command line options:
Remove: -U
Add: -V -2 -w -W 192.168.100.100 -u 23456
(Note: you change the IP address to whatever destination host you are using)
I was missing the -V switch. Sounds great now.
Thank you SO MUCH again.
./audio.py
Usage: audio.py [options]
Options:
-h, --help show this help message and exit
-O AUDIO_OUTPUT, --audio-output=AUDIO_OUTPUT
audio output device name
-u WIRESHARK_PORT, --wireshark-port=WIRESHARK_PORT
Wireshark port
-2, --two-channel single or two channel audio
-x AUDIO_GAIN, --audio-gain=AUDIO_GAIN
audio gain (default = 1.0)
If you're using a linux machine to play the audio, there is a utility that's part of the op25 distro to act as a stand-alone audio player.
Code:./audio.py Usage: audio.py [options] Options: -h, --help show this help message and exit -O AUDIO_OUTPUT, --audio-output=AUDIO_OUTPUT audio output device name -u WIRESHARK_PORT, --wireshark-port=WIRESHARK_PORT Wireshark port -2, --two-channel single or two channel audio -x AUDIO_GAIN, --audio-gain=AUDIO_GAIN audio gain (default = 1.0)
By default you don't need any command line options unless you want to use a different port or audio device.
I am developing a Windows application that will play and archive (catalog) calls.
So far, I had everything working well until one of my listeners notified me that my Broadcastify stream is active although there has been no calls for the past day or so. Now that I have the audio over UDP working, I realized that I stole the audio feed from DarkIce.
Is there a way to have a second audio instance running on my RPi3b+ so that I can feed Broadcastify along with a UDP audio network feed? CPU utilization averages 20% so I have plenty of power.
I followed John's great tutorial on installing op25 on a RPi but get a blank screen when sending the start script.
https://www.hagensieker.com/wordpress/2018/07/24/op25-on-a-raspberry-pi-part-3/#comment-1265
After sending the following script (with my local control channel at -f)
./rx.py --args 'rtl' -N 'LNA:47' -S 2400000 -f 857.2625e6 -o 25000 -q -2
Now run this command. Bear in mind you MUST KNOW THE FREQUENCY OF THE CONTROL CHANNEL YOU WANT TO FOLLOW AND CHANGE THE -f PART TO THE CORRECT FREQUENCY.
Traceback (most recent call last):
File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 293, in run
if self.process_q_events():
File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 276, in process_q_events
return self.process_json(msg.to_string())
File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 211, in process_json
s = 'NAC 0x%x' % (int(current_nac))
ValueError: invalid literal for int() with base 10: 'None'
diff --git a/op25/gr-op25_repeater/apps/terminal.py b/op25/gr-op25_repeater/apps/terminal.py
index 53c6a31..fc6927a 100755
--- a/op25/gr-op25_repeater/apps/terminal.py
+++ b/op25/gr-op25_repeater/apps/terminal.py
@@ -202,7 +202,7 @@ class curses_terminal(threading.Thread):
nacs = [x for x in msg.keys() if x.isnumeric() ]
if not nacs:
return
- if 'nac' in msg:
+ if msg.get('nac'):
current_nac = str(msg['nac'])
else:
times = {msg[nac]['last_tsbk']:nac for nac in nacs}
(that's against boadbot).
BTW (devs), whilst experimenting with the command from the recent discussion, I found that it crashes at:
Code:Traceback (most recent call last): File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 293, in run if self.process_q_events(): File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 276, in process_q_events return self.process_json(msg.to_string()) File "/home/rock64/op25/op25/gr-op25_repeater/apps/terminal.py", line 211, in process_json s = 'NAC 0x%x' % (int(current_nac)) ValueError: invalid literal for int() with base 10: 'None'
I suggest this small change:
Code:diff --git a/op25/gr-op25_repeater/apps/terminal.py b/op25/gr-op25_repeater/apps/terminal.py index 53c6a31..fc6927a 100755 --- a/op25/gr-op25_repeater/apps/terminal.py +++ b/op25/gr-op25_repeater/apps/terminal.py @@ -202,7 +202,7 @@ class curses_terminal(threading.Thread): nacs = [x for x in msg.keys() if x.isnumeric() ] if not nacs: return - if 'nac' in msg: + if msg.get('nac'): current_nac = str(msg['nac']) else: times = {msg[nac]['last_tsbk']:nac for nac in nacs}
(that's against boadbot). The difference here is that the condition will not be met if it has a value, but that value is None.