diff --git a/README.md b/README.md index 0e4d860..2bd9244 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repository is a demo - it isn't a fully fleshed out system and isn't intend # Getting started - Use a debian-based 64-bit system (x86). No way around it; this project is not cross-platform until some efforts gets put into making it that way. - Install the SDRPlay device driver & install the project dependencies. - - `./setup` + - `./setup.sh` - Follow the prompts, there is some audience participation getting the driver installed. - Beyond that it should be mostly unattended. SoapySDR & plugins will be installed in the system directories. - Run the demos. The demo code is provided by SoapySDR and required minimal modification. diff --git a/data/fm-stations.json b/data/fm-stations.json new file mode 100644 index 0000000..c0eeda9 --- /dev/null +++ b/data/fm-stations.json @@ -0,0 +1,596 @@ +[ + { + "Callsign": "5AA", + "Area served": "Adelaide", + "Frequency": "1395", + "Band": "AM", + "On-air ID": "FIVEaa", + "Purpose": "Commercial", + "Site": "http://www.fiveaa.com.au/" + }, + { + "Callsign": "5ABCFM", + "Area served": "South Australia", + "Frequency": "various", + "Band": "FM", + "On-air ID": "ABC Classic FM", + "Purpose": "National", + "Site": "http://www.abc.net.au/classic/" + }, + { + "Callsign": "5ABCRN", + "Area served": "South Australia", + "Frequency": "various", + "Band": "FM", + "On-air ID": "ABC Radio National", + "Purpose": "National", + "Site": "http://www.abc.net.au/rn/" + }, + { + "Callsign": "5ABCRR", + "Area served": "South Australia", + "Frequency": "various", + "Band": "FM", + "On-air ID": "ABC Local Radio", + "Purpose": "National", + "Site": "http://www.abc.net.au/local/" + }, + { + "Callsign": "5ACR", + "Area served": "Remote Aboriginal communitiesConsists of four separately licensed stations using the same callsign: [[Amata, South Australia", + "Frequency": "Amata]] 106.1, [[Pukatja, South Australia", + "Band": "Ernabella]] 106.1, [[Kaltjiti", + "On-air ID": "Fregon]] 106.1, and Indulkana 106.1.", + "Purpose": "various", + "Site": "FM" + }, + { + "Callsign": "5ADD", + "Area served": "Adelaide", + "Frequency": "102.3", + "Band": "FM", + "On-air ID": "Mix 102.3", + "Purpose": "Commercial", + "Site": "http://www.mix1023.com.au/" + }, + { + "Callsign": "5ADL", + "Area served": "Adelaide", + "Frequency": "091.9", + "Band": "FM", + "On-air ID": "Nova 91.9", + "Purpose": "Commercial", + "Site": "http://www.nova919.com.au/" + }, + { + "Callsign": "5ALX", + "Area served": "[[Goolwa, South Australia", + "Frequency": "Goolwa]]", + "Band": "096.3", + "On-air ID": "FM", + "Purpose": "Alex FM", + "Site": "Community" + }, + { + "Callsign": "5AN", + "Area served": "Adelaide", + "Frequency": "0891", + "Band": "AM", + "On-air ID": "ABC Adelaide", + "Purpose": "National", + "Site": "http://www.abc.net.au/adelaide/" + }, + { + "Callsign": "5AU", + "Area served": "[[Port Augusta, South Australia", + "Frequency": "Port Augusta]]", + "Band": "1242", + "On-air ID": "AM", + "Purpose": "5AU", + "Site": "Commercial" + }, + { + "Callsign": "5AUU", + "Area served": "Spencer Gulf North", + "Frequency": "105.9", + "Band": "FM", + "On-air ID": "Magic 105.9", + "Purpose": "Commercial", + "Site": "http://www.magic1059.com.au/" + }, + { + "Callsign": "5BBB", + "Area served": "Barossa Valley", + "Frequency": "089.1", + "Band": "FM", + "On-air ID": "Triple B", + "Purpose": "Community", + "Site": "http://www.bbbfm.com/" + }, + { + "Callsign": "5CC", + "Area served": "[[Port Lincoln, South Australia", + "Frequency": "Port Lincoln]]", + "Band": "0765", + "On-air ID": "AM", + "Purpose": "5CC", + "Site": "Commercial" + }, + { + "Callsign": "5CCC", + "Area served": "[[Port Lincoln, South Australia", + "Frequency": "Port Lincoln]]", + "Band": "089.9", + "On-air ID": "FM", + "Purpose": "Magic 89.9", + "Site": "Commercial" + }, + { + "Callsign": "5CCR", + "Area served": "[[Ceduna, South Australia", + "Frequency": "Ceduna]]", + "Band": "094.5", + "On-air ID": "FM", + "Purpose": "CCR FM", + "Site": "Community" + }, + { + "Callsign": "5CK", + "Area served": "[[Port Pirie, South Australia", + "Frequency": "Port Pirie]]", + "Band": "0639", + "On-air ID": "AM", + "Purpose": "ABC North and West", + "Site": "National" + }, + { + "Callsign": "5CS", + "Area served": "[[Port Pirie, South Australia", + "Frequency": "Port Pirie]]", + "Band": "1044", + "On-air ID": "AM", + "Purpose": "5CS", + "Site": "Commercial" + }, + { + "Callsign": "5CST", + "Area served": "[[Adelaide", + "Frequency": "Adelaide South West Suburbs]]", + "Band": "088.7", + "On-air ID": "FM", + "Purpose": "Coast FM", + "Site": "Community" + }, + { + "Callsign": "5DDD", + "Area served": "Adelaide", + "Frequency": "093.7", + "Band": "FM", + "On-air ID": "Three D Radio", + "Purpose": "Community", + "Site": "http://www.threedradio.com/" + }, + { + "Callsign": "5DN", + "Area served": "Adelaide", + "Frequency": "1323", + "Band": "AM", + "On-air ID": "Cruise 1323", + "Purpose": "Commercial", + "Site": "http://www.cruise1323.com.au/" + }, + { + "Callsign": "5DUS", + "Area served": "[[Coober Pedy, South Australia", + "Frequency": "Coober Pedy]]", + "Band": "104.5", + "On-air ID": "FM", + "Purpose": "Dusty Radio", + "Site": "Community" + }, + { + "Callsign": "5EBI", + "Area served": "Adelaide", + "Frequency": "103.1", + "Band": "FM", + "On-air ID": "5EBI", + "Purpose": "Community", + "Site": "http://www.5ebi.com.au/" + }, + { + "Callsign": "5EFM", + "Area served": "[[Victor Harbor, South Australia", + "Frequency": "Victor Harbor]]", + "Band": "089.3", + "On-air ID": "FM", + "Purpose": "Fleurieu FM", + "Site": "Community" + }, + { + "Callsign": "5EZY", + "Area served": "[[Murray Bridge, South Australia", + "Frequency": "Murray Bridge]]", + "Band": "098.7", + "On-air ID": "FM", + "Purpose": "Power FM", + "Site": "Commercial" + }, + { + "Callsign": "5FBI", + "Area served": "Adelaide", + "Frequency": "092.7", + "Band": "FM", + "On-air ID": "Fresh 92.7", + "Purpose": "Community", + "Site": "http://www.fresh927.com.au/" + }, + { + "Callsign": "5GFM", + "Area served": "Yorke Peninsula", + "Frequency": "089.3", + "Band": "FM", + "On-air ID": "Gulf FM", + "Purpose": "Community", + "Site": "http://www.gulffm.com.au/" + }, + { + "Callsign": "5GSFM", + "Area served": "[[Victor Harbor, South Australia", + "Frequency": "Victor Harbor]]", + "Band": "090.1", + "On-air ID": "FM", + "Purpose": "Great Southern FM", + "Site": "Community" + }, + { + "Callsign": "5GTR", + "Area served": "[[Mount Gambier, South Australia", + "Frequency": "Mount Gambier]]", + "Band": "100.1", + "On-air ID": "FM", + "Purpose": "5GTR", + "Site": "Community" + }, + { + "Callsign": "5JJJ", + "Area served": "South Australia", + "Frequency": "various", + "Band": "FM", + "On-air ID": "Triple J", + "Purpose": "National", + "Site": "http://www.abc.net.au/triplej/" + }, + { + "Callsign": "5KIX", + "Area served": "Kangaroo Island", + "Frequency": "090.7", + "Band": "FM", + "On-air ID": "KIX FM", + "Purpose": "Community", + "Site": "http://5kixfm.com.au/" + }, + { + "Callsign": "5LC", + "Area served": "[[Leigh Creek, South Australia", + "Frequency": "Leigh Creek]]", + "Band": "1602", + "On-air ID": "AM", + "Purpose": "ABC North and West", + "Site": "National" + }, + { + "Callsign": "5LCM", + "Area served": "[[Mount Barker, South Australia", + "Frequency": "Mount Barker]]", + "Band": "088.9", + "On-air ID": "FM", + "Purpose": "Lofty 88.9", + "Site": "Community" + }, + { + "Callsign": "5LFM", + "Area served": "Riverland", + "Frequency": "100.7", + "Band": "FM", + "On-air ID": "Riverland Life FM", + "Purpose": "Community", + "Site": "https://riverlandlife.org.au/" + }, + { + "Callsign": "5LN", + "Area served": "[[Port Lincoln, South Australia", + "Frequency": "Port Lincoln]]", + "Band": "1485", + "On-air ID": "AM", + "Purpose": "ABC Eyre Peninsula and West Coast", + "Site": "National" + }, + { + "Callsign": "5MBS", + "Area served": "[[Adelaide", + "Frequency": "Adelaide Foothills]]", + "Band": "099.9", + "On-air ID": "FM", + "Purpose": "5MBS", + "Site": "Community" + }, + { + "Callsign": "5CCJ", + "Area served": "[[Adelaide", + "Frequency": "Adelaide Foothills]]", + "Band": "088", + "On-air ID": "FM", + "Purpose": "Easy FM 88", + "Site": "Narrowcast" + }, + { + "Callsign": "5JAJ", + "Area served": "[[Normanville, South Australia", + "Frequency": "Normanville]]", + "Band": "087.6", + "On-air ID": "FM", + "Purpose": "Radio 876", + "Site": "Narrowcast" + }, + { + "Callsign": "5MG", + "Area served": "[[Mount Gambier, South Australia", + "Frequency": "Mount Gambier]]", + "Band": "1476", + "On-air ID": "AM", + "Purpose": "ABC South East SA", + "Site": "National" + }, + { + "Callsign": "5MMM", + "Area served": "Adelaide", + "Frequency": "104.7", + "Band": "FM", + "On-air ID": "Triple M", + "Purpose": "Commercial", + "Site": "http://www.triplem.com.au/adelaide/" + }, + { + "Callsign": "5MU", + "Area served": "[[Murray Bridge, South Australia", + "Frequency": "Murray Bridge]]", + "Band": "1125", + "On-air ID": "AM", + "Purpose": "5MU", + "Site": "Commercial" + }, + { + "Callsign": "5MV", + "Area served": "Riverland", + "Frequency": "1062", + "Band": "AM", + "On-air ID": "ABC Riverland", + "Purpose": "National", + "Site": "http://www.abc.net.au/riverland/" + }, + { + "Callsign": "5PA", + "Area served": "[[Naracoorte, South Australia", + "Frequency": "Naracoorte]]", + "Band": "1161", + "On-air ID": "AM", + "Purpose": "ABC South East SA", + "Site": "National" + }, + { + "Callsign": "5PB", + "Area served": "South Australia", + "Frequency": "various", + "Band": "AM", + "On-air ID": "ABC NewsRadio", + "Purpose": "National", + "Site": "http://www.abc.net.au/newsradio/" + }, + { + "Callsign": "5PBA", + "Area served": "[[Salisbury, South Australia", + "Frequency": "Salisbury]]", + "Band": "089.7", + "On-air ID": "FM", + "Purpose": "PBA FM", + "Site": "Community" + }, + { + "Callsign": "5PNN", + "Area served": "South Australia", + "Frequency": "various", + "Band": "FM", + "On-air ID": "ABC NewsRadio", + "Purpose": "National", + "Site": "http://www.abc.net.au/newsradio/" + }, + { + "Callsign": "5RAM", + "Area served": "Adelaide", + "Frequency": "107.9", + "Band": "FM", + "On-air ID": "Life FM", + "Purpose": "Community", + "Site": "https://web.archive.org/web/20110426052754/http://www.life.on.net/" + }, + { + "Callsign": "5RCB", + "Area served": "[[Mount Gambier, South Australia", + "Frequency": "Mount Gambier]]", + "Band": "104.9", + "On-air ID": "FM", + "Purpose": "Lime FM", + "Site": "Community" + }, + { + "Callsign": "5RIV", + "Area served": "Riverland", + "Frequency": "093.1", + "Band": "FM", + "On-air ID": "Magic 93.1", + "Purpose": "Commercial", + "Site": "http://www.magic931.com.au/" + }, + { + "Callsign": "5RM", + "Area served": "Riverland", + "Frequency": "0801", + "Band": "AM", + "On-air ID": "5RM", + "Purpose": "Commercial", + "Site": "http://www.5rm.com/" + }, + { + "Callsign": "5RN", + "Area served": "South Australia", + "Frequency": "various", + "Band": "AM", + "On-air ID": "ABC Radio National", + "Purpose": "National", + "Site": "http://www.abc.net.au/rn/" + }, + { + "Callsign": "5RRR", + "Area served": "[[Woomera, South Australia", + "Frequency": "Woomera]]", + "Band": "107.3", + "On-air ID": "FM", + "Purpose": "\"Rocket Range Radio' and 'Armed Forces Radio Australia' since 1 July 2021.", + "Site": "Community" + }, + { + "Callsign": "5ROX", + "Area served": "[[Roxby Downs, South Australia", + "Frequency": "Roxby Downs]]", + "Band": "105.5", + "On-air ID": "FM", + "Purpose": "Rox FM", + "Site": "Community" + }, + { + "Callsign": "5RPH", + "Area served": "Adelaide", + "Frequency": "1197", + "Band": "AM", + "On-air ID": "RPH Adelaide", + "Purpose": "Community", + "Site": "http://www.rphadelaide.org.au/" + }, + { + "Callsign": "5SBSFM", + "Area served": "Adelaide", + "Frequency": "106.3", + "Band": "FM", + "On-air ID": "SBS Radio", + "Purpose": "National", + "Site": "http://www.sbs.com.au/radio/" + }, + { + "Callsign": "5SE", + "Area served": "[[Mount Gambier, South Australia", + "Frequency": "Mount Gambier]]", + "Band": "0963", + "On-air ID": "AM", + "Purpose": "5SE", + "Site": "Commercial" + }, + { + "Callsign": "5SEF", + "Area served": "[[Mount Gambier, South Australia", + "Frequency": "Mount Gambier]]", + "Band": "096.1", + "On-air ID": "FM", + "Purpose": "Star FM", + "Site": "Commercial" + }, + { + "Callsign": "5SSA", + "Area served": "Adelaide", + "Frequency": "107.1", + "Band": "FM", + "On-air ID": "SAFM", + "Purpose": "Commercial", + "Site": "http://www.hit107.com/" + }, + { + "Callsign": "5SY", + "Area served": "[[Streaky Bay, South Australia", + "Frequency": "Streaky Bay]]", + "Band": "0693", + "On-air ID": "AM", + "Purpose": "ABC Eyre Peninsula and West Coast", + "Site": "National" + }, + { + "Callsign": "5TCB", + "Area served": "[[Bordertown, South Australia", + "Frequency": "Bordertown]]", + "Band": "106.1", + "On-air ID": "FM", + "Purpose": "5TCB", + "Site": "Community" + }, + { + "Callsign": "5THE", + "Area served": "[[Millicent, South Australia", + "Frequency": "Millicent]]", + "Band": "107.7", + "On-air ID": "FM", + "Purpose": "5THE", + "Site": "Community" + }, + { + "Callsign": "5TRX", + "Area served": "[[Port Pirie, South Australia", + "Frequency": "Port Pirie]]", + "Band": "105.1", + "On-air ID": "FM", + "Purpose": "Trax FM", + "Site": "Community" + }, + { + "Callsign": "5UMA", + "Area served": "[[Port Augusta, South Australia", + "Frequency": "Port Augusta]]", + "Band": "089.1", + "On-air ID": "FM", + "Purpose": "Umeewarra Radio", + "Site": "Community" + }, + { + "Callsign": "5UV", + "Area served": "Adelaide", + "Frequency": "101.5", + "Band": "FM", + "On-air ID": "Radio Adelaide", + "Purpose": "Community", + "Site": "https://web.archive.org/web/20010924022716/http://radio.adelaide.edu.au/" + }, + { + "Callsign": "5WM", + "Area served": "[[Woomera, South Australia", + "Frequency": "Woomera]]", + "Band": "1584", + "On-air ID": "AM", + "Purpose": "ABC North and West", + "Site": "National" + }, + { + "Callsign": "5WOW", + "Area served": "Port Adelaide", + "Frequency": "100.5", + "Band": "FM", + "On-air ID": "WOW FM", + "Purpose": "Community", + "Site": "http://wowfm.org/" + }, + { + "Callsign": "5YYY", + "Area served": "[[Whyalla, South Australia", + "Frequency": "Whyalla]]", + "Band": "107.7", + "On-air ID": "FM", + "Purpose": "Triple Y", + "Site": "Community" + } +] \ No newline at end of file diff --git a/dependencies/build_dependencies b/dependencies/build_dependencies deleted file mode 100755 index 02f937a..0000000 --- a/dependencies/build_dependencies +++ /dev/null @@ -1,94 +0,0 @@ -#! /bin/bash - -set -eux - -echo "Beginning project setup for SDRPlay interface." > build.log -date >> build.log - -# Install build dependencies -# Debian: -sudo apt-get install -y \ - git build-essential automake cmake \ - libpulse-dev libgtk-3-dev \ - freeglut3 freeglut3-dev -# RedHat: -#sudo dnf install pulseaudio-libs-devel gtk3-devel freeglut-devel - -# These are necessary for building the python bindings for SoapySDR. -# These must be installed before building SoapySDR for the python -# bindings to be available on the system. -sudo apt-get install -y python-dev swig - -# These are required for building Soapy RTL-SDR -sudo apt-get install -y rtl-sdr librtlsdr-dev - - -# Build SoapySDR -if ! [ -d SoapySDR ]; then -git clone https://github.com/pothosware/SoapySDR.git -pushd SoapySDR - mkdir build - pushd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make -j - sudo make install - sudo ldconfig - SoapySDRUtil --info #test SoapySDR install - popd -popd -fi - -# Build SoapySDRPlay plugin -if ! [ -d SoapySDRPlay ]; then -git clone https://github.com/pothosware/SoapySDRPlay.git -pushd SoapySDRPlay - mkdir build - pushd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make -j - sudo make install - popd -popd -fi - -# Build SoapyRTLSDR plugin -if ! [ -d SoapyRTLSDR ]; then -git clone https://github.com/pothosware/SoapyRTLSDR.git -pushd SoapyRTLSDR - mkdir build - pushd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make -j - sudo make install - popd -popd -fi - -# SoapySDRPlay plugin can overwrite some of the installed files for SoapySDR with older -# versions - re-run the installer for SoapySDR base to ensure we have the latest ones. -pushd SoapySDR/build - sudo make install -popd - -# Build liquid-dsp -if ! [ -d liquid-dsp ]; then -git clone https://github.com/jgaeddert/liquid-dsp -pushd liquid-dsp - ./bootstrap.sh - CFLAGS="-march=native -O3" ./configure --enable-fftoverride - make -j - sudo make install - sudo ldconfig -popd -fi - -# Get mediamtx (no system package available) -mkdir -p mediamtx -pushd mediamtx - wget https://github.com/aler9/mediamtx/releases/download/v0.22.2/mediamtx_v0.22.2_linux_amd64.tar.gz - tar -xzvf mediamtx_v0.22.2_linux_amd64.tar.gz -popd - -echo "Setup completed." >> build.log -date >> build.log -exit 0 diff --git a/requirements.apt b/requirements.apt new file mode 100644 index 0000000..ca1c232 --- /dev/null +++ b/requirements.apt @@ -0,0 +1,18 @@ +automake +build-essential +cmake +curl +ffmpeg +git +libpulse-dev +librtlsdr-dev +portaudio19-dev +python-is-python3 +python3 +python3-pip +python3-all-dev +python3-dev +rtl-sdr +sox +swig +wget \ No newline at end of file diff --git a/requirements.txt b/requirements.pip similarity index 100% rename from requirements.txt rename to requirements.pip diff --git a/dependencies/SDRplay_RSP_API-Linux-3.07.1.run b/scripts/SDRplay_RSP_API-Linux-3.07.1.run similarity index 100% rename from dependencies/SDRplay_RSP_API-Linux-3.07.1.run rename to scripts/SDRplay_RSP_API-Linux-3.07.1.run diff --git a/scripts/get_liquid-dsp.sh b/scripts/get_liquid-dsp.sh new file mode 100644 index 0000000..3065bbc --- /dev/null +++ b/scripts/get_liquid-dsp.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +set -eux + +# Build liquid-dsp +if ! [ -d liquid-dsp ]; then +git clone https://github.com/jgaeddert/liquid-dsp +pushd liquid-dsp + ./bootstrap.sh + CFLAGS="-march=native -O3" ./configure --enable-fftoverride + make -j + sudo make install + sudo ldconfig +popd +fi \ No newline at end of file diff --git a/scripts/get_mediamtx.sh b/scripts/get_mediamtx.sh new file mode 100644 index 0000000..5241ba9 --- /dev/null +++ b/scripts/get_mediamtx.sh @@ -0,0 +1,10 @@ +#! /bin/bash + +set -eux + +# Get mediamtx (no system package available) +mkdir -p mediamtx +pushd mediamtx + wget https://github.com/aler9/mediamtx/releases/download/v0.22.2/mediamtx_v0.22.2_linux_amd64.tar.gz + tar -xzvf mediamtx_v0.22.2_linux_amd64.tar.gz +popd \ No newline at end of file diff --git a/scripts/get_soapy.sh b/scripts/get_soapy.sh new file mode 100644 index 0000000..7f340d7 --- /dev/null +++ b/scripts/get_soapy.sh @@ -0,0 +1,52 @@ +#! /bin/bash + +# Use sudo? +sudo=$(which sudo) +set -eux + +# Build SoapySDR +if ! [ -d SoapySDR ]; then +git clone https://github.com/pothosware/SoapySDR.git +pushd SoapySDR + mkdir build + pushd build + cmake .. -DCMAKE_BUILD_TYPE=Release + make -j + $sudo make install + $sudo ldconfig + SoapySDRUtil --info #test SoapySDR install + popd +popd +fi + +# Build SoapySDRPlay plugin +if ! [ -d SoapySDRPlay ]; then +git clone https://github.com/pothosware/SoapySDRPlay.git +pushd SoapySDRPlay + mkdir build + pushd build + cmake .. -DCMAKE_BUILD_TYPE=Release + make -j + $sudo make install + popd +popd +fi + +# Build SoapyRTLSDR plugin +if ! [ -d SoapyRTLSDR ]; then +git clone https://github.com/pothosware/SoapyRTLSDR.git +pushd SoapyRTLSDR + mkdir build + pushd build + cmake .. -DCMAKE_BUILD_TYPE=Release + make -j + $sudo make install + popd +popd +fi + +# SoapySDRPlay plugin can overwrite some of the installed files for SoapySDR with older +# versions - re-run the installer for SoapySDR base to ensure we have the latest ones. +pushd SoapySDR/build + $sudo make install +popd \ No newline at end of file diff --git a/setup b/setup deleted file mode 100755 index 22d77ee..0000000 --- a/setup +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/bash - -sudo apt-get update - -sudo apt install -y \ - rtl-sdr \ - sox \ - portaudio19-dev \ - python3-all-dev \ - ffmpeg - -pip install -r requirements.txt - -pushd dependencies - ./SDRplay_RSP_API-Linux-3.07.1.run - ./build_dependencies -popd \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..36ab8e4 --- /dev/null +++ b/setup.sh @@ -0,0 +1,16 @@ +#! /bin/bash + +set -eux + +# Get system packages +sudo apt-get update +sudo xargs apt-get install -y < requirements.apt +sudo pip install -r requirements.pip + +# Install device driver +./scripts/SDRplay_RSP_API-Linux-3.07.1.run + +# Get project dependencies +bash ./scripts/get_soapy.sh +bash ./scripts/get_liquid-dsp.sh +bash ./scripts/get_mediamtx.sh \ No newline at end of file