From 220dcbcc76e0e2d0b10c43822a3b110844db49a8 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 24 Jul 2023 00:05:25 +0200 Subject: [PATCH 01/28] added debian bookworm nightly --- .github/workflows/build_all.yml | 47 ++++++++++++----------- docker_builds/debian_bookworm/Dockerfile | 4 ++ docker_builds/debian_bookworm/do_build.sh | 35 +++++++++++++++++ 3 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 docker_builds/debian_bookworm/Dockerfile create mode 100644 docker_builds/debian_bookworm/do_build.sh diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 02372501..55ceacbf 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -182,6 +182,28 @@ jobs: name: sdrpp_debian_bullseye_amd64 path: ${{runner.workspace}}/sdrpp_debian_amd64.deb + build_debian_bookworm: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Create Docker Image + run: cd $GITHUB_WORKSPACE/docker_builds/debian_bookworm && docker build . --tag sdrpp_build + + - name: Run Container + run: docker run --name build -v $GITHUB_WORKSPACE:/root/SDRPlusPlus --env BUILD_NO="-$GITHUB_RUN_NUMBER" sdrpp_build /root/do_build.sh + + - name: Recover Deb Archive + working-directory: ${{runner.workspace}} + run: docker cp build:/root/SDRPlusPlus/sdrpp_debian_amd64.deb ./ + + - name: Save Deb Archive + uses: actions/upload-artifact@v3 + with: + name: sdrpp_debian_bookworm_amd64 + path: ${{runner.workspace}}/sdrpp_debian_amd64.deb + build_debian_sid: runs-on: ubuntu-latest @@ -204,28 +226,6 @@ jobs: name: sdrpp_debian_sid_amd64 path: ${{runner.workspace}}/sdrpp_debian_amd64.deb - # build_ubuntu_bionic: - # runs-on: ubuntu-latest - - # steps: - # - uses: actions/checkout@v3 - - # - name: Create Docker Image - # run: cd $GITHUB_WORKSPACE/docker_builds/ubuntu_bionic && docker build . --tag sdrpp_build - - # - name: Run Container - # run: docker run --name build -v $GITHUB_WORKSPACE:/root/SDRPlusPlus --env BUILD_NO="-$GITHUB_RUN_NUMBER" sdrpp_build /root/do_build.sh - - # - name: Recover Deb Archive - # working-directory: ${{runner.workspace}} - # run: docker cp build:/root/SDRPlusPlus/sdrpp_debian_amd64.deb ./ - - # - name: Save Deb Archive - # uses: actions/upload-artifact@v3 - # with: - # name: sdrpp_ubuntu_bionic_amd64 - # path: ${{runner.workspace}}/sdrpp_debian_amd64.deb - build_ubuntu_focal: runs-on: ubuntu-latest @@ -325,7 +325,7 @@ jobs: path: ${{runner.workspace}}/sdrpp.apk create_full_archive: - needs: ['build_windows', 'build_macos', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] + needs: ['build_windows', 'build_macos', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_bookworm', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] runs-on: ubuntu-latest steps: @@ -339,6 +339,7 @@ jobs: mv sdrpp_macos_intel/sdrpp_macos_intel.zip sdrpp_all/ && mv sdrpp_debian_buster_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_buster_amd64.deb && mv sdrpp_debian_bullseye_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bullseye_amd64.deb && + mv sdrpp_debian_bookworm_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bookworm_amd64.deb && mv sdrpp_debian_sid_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_sid_amd64.deb && mv sdrpp_ubuntu_focal_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_ubuntu_focal_amd64.deb && mv sdrpp_ubuntu_jammy_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_ubuntu_jammy_amd64.deb && diff --git a/docker_builds/debian_bookworm/Dockerfile b/docker_builds/debian_bookworm/Dockerfile new file mode 100644 index 00000000..f5c9ae47 --- /dev/null +++ b/docker_builds/debian_bookworm/Dockerfile @@ -0,0 +1,4 @@ +FROM debian:bookworm +ENV DEBIAN_FRONTEND=noninteractive +COPY do_build.sh /root +RUN chmod +x /root/do_build.sh \ No newline at end of file diff --git a/docker_builds/debian_bookworm/do_build.sh b/docker_builds/debian_bookworm/do_build.sh new file mode 100644 index 00000000..0a90aa11 --- /dev/null +++ b/docker_builds/debian_bookworm/do_build.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -e +cd /root + +# Install dependencies and tools +apt update +apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ + libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ + libcodec2-dev autoconf libtool xxd + +# Install SDRPlay libraries +wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run +7z x ./SDRplay_RSP_API-Linux-3.07.1.run +7z x ./SDRplay_RSP_API-Linux-3.07.1 +cp x86_64/libsdrplay_api.so.3.07 /usr/lib/libsdrplay_api.so +cp inc/* /usr/include/ + +# Install libperseus +git clone https://github.com/Microtelecom/libperseus-sdr +cd libperseus-sdr +autoreconf -i +./configure +make +make install +ldconfig +cd .. + +cd SDRPlusPlus +mkdir build +cd build +cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON +make VERBOSE=1 -j2 + +cd .. +sh make_debian_package.sh ./build 'libfftw3-dev, libglfw3-dev, libvolk1-dev, librtaudio-dev, libzstd-dev' \ No newline at end of file From 6fa42991368b241c73b6d12e0091f34b728fce39 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 24 Jul 2023 00:54:17 +0200 Subject: [PATCH 02/28] fixed bookworm build --- docker_builds/debian_bookworm/do_build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker_builds/debian_bookworm/do_build.sh b/docker_builds/debian_bookworm/do_build.sh index 0a90aa11..6509c192 100644 --- a/docker_builds/debian_bookworm/do_build.sh +++ b/docker_builds/debian_bookworm/do_build.sh @@ -4,7 +4,7 @@ cd /root # Install dependencies and tools apt update -apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ +apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ libcodec2-dev autoconf libtool xxd @@ -28,8 +28,8 @@ cd .. cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON +cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON make VERBOSE=1 -j2 cd .. -sh make_debian_package.sh ./build 'libfftw3-dev, libglfw3-dev, libvolk1-dev, librtaudio-dev, libzstd-dev' \ No newline at end of file +sh make_debian_package.sh ./build 'libfftw3-dev, libglfw3-dev, libvolk2-dev, librtaudio-dev, libzstd-dev' \ No newline at end of file From b436fd0745564e61c06d4ea0a50836f2682ec861 Mon Sep 17 00:00:00 2001 From: Matt Mead Date: Thu, 3 Aug 2023 10:01:48 -0700 Subject: [PATCH 03/28] Update usa.json Added MURS frequencies --- root/res/bandplans/usa.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/root/res/bandplans/usa.json b/root/res/bandplans/usa.json index f0a3884e..2a6fbe4a 100644 --- a/root/res/bandplans/usa.json +++ b/root/res/bandplans/usa.json @@ -227,6 +227,18 @@ "start": 144000000, "end": 148000000 }, + { + "name": "MURS (lower)", + "type": "amateur", + "start": 151820000, + "end": 151940000 + }, + { + "name": "MURS (upper)", + "type": "amateur", + "start": 154570000, + "end": 154600000 + }, { "name": "Marine", "type": "marine", From 88baa8a48ee7875debd8d80c62a50964cfb5741e Mon Sep 17 00:00:00 2001 From: Manawyrm Date: Fri, 4 Aug 2023 22:50:12 +0200 Subject: [PATCH 04/28] Update name in bandplan and contributors list --- core/src/credits.cpp | 2 +- readme.md | 2 +- root/res/bandplans/germany.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/credits.cpp b/core/src/credits.cpp index 1846a7b4..58685fbd 100644 --- a/core/src/credits.cpp +++ b/core/src/credits.cpp @@ -12,6 +12,7 @@ namespace sdrpp_credits { "Howard0su", "John Donkersley", "Joshua Kimsey", + "Manawyrm", "Martin Hauke", "Marvin Sinister", "Maxime Biette", @@ -21,7 +22,6 @@ namespace sdrpp_credits { "Shuyuan Liu", "Syne Ardwin (WI9SYN)", "Szymon Zakrent", - "Tobias Mädel", "Youssef Touil", "Zimm" }; diff --git a/readme.md b/readme.md index 65257a3d..94822f63 100644 --- a/readme.md +++ b/readme.md @@ -473,6 +473,7 @@ I will soon publish a contributing.md listing the code style to use. * [Howard0su](https://github.com/howard0su) * John Donkersley * [Joshua Kimsey](https://github.com/JoshuaKimsey) +* [Manawyrm](https://github.com/Manawyrm) * [Martin Hauke](https://github.com/mnhauke) * [Marvin Sinister](https://github.com/marvin-sinister) * [Maxime Biette](https://github.com/mbiette) @@ -482,7 +483,6 @@ I will soon publish a contributing.md listing the code style to use. * [Shuyuan Liu](https://github.com/shuyuan-liu) * [Syne Ardwin (WI9SYN)](https://esaille.me/) * [Szymon Zakrent](https://github.com/zakrent) -* [Tobias Mädel](https://github.com/Manawyrm) * Youssef Touil * [Zimm](https://github.com/invader-zimm) diff --git a/root/res/bandplans/germany.json b/root/res/bandplans/germany.json index c9568bf8..946084e9 100644 --- a/root/res/bandplans/germany.json +++ b/root/res/bandplans/germany.json @@ -2,7 +2,7 @@ "name": "Germany", "country_name": "Germany", "country_code": "DE", - "author_name": "Tobias Mädel", + "author_name": "Manawyrm", "author_url": "https://tbspace.de", "bands": [ { From 7b9c01ec73c0edf8c637ca4ebe58ac80853fdeff Mon Sep 17 00:00:00 2001 From: theverygaming Date: Sun, 6 Aug 2023 01:46:54 +0200 Subject: [PATCH 05/28] fixed buffer overflow in file source --- source_modules/file_source/src/main.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source_modules/file_source/src/main.cpp b/source_modules/file_source/src/main.cpp index de827e46..dbd6d710 100644 --- a/source_modules/file_source/src/main.cpp +++ b/source_modules/file_source/src/main.cpp @@ -9,6 +9,15 @@ #include #include #include +#include + +// TODO: figure out where exactly these macros are from (only happens on windows so probably from Windows.h somewhere) +#ifdef min +#undef min +#endif +#ifdef max +#undef max +#endif #define CONCAT(a, b) ((std::string(a) + b).c_str()) @@ -121,7 +130,7 @@ private: } try { _this->reader = new WavReader(_this->fileSelect.path); - _this->sampleRate = _this->reader->getSampleRate(); + _this->sampleRate = std::max(_this->reader->getSampleRate(), (uint32_t)1); core::setInputSampleRate(_this->sampleRate); std::string filename = std::filesystem::path(_this->fileSelect.path).filename().string(); _this->centerFreq = _this->getFrequency(filename); @@ -144,8 +153,8 @@ private: static void worker(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; - double sampleRate = _this->reader->getSampleRate(); - int blockSize = sampleRate / 200.0f; + double sampleRate = std::max(_this->reader->getSampleRate(), (uint32_t)1); + int blockSize = std::min((int)(sampleRate / 200.0f), (int)STREAM_BUFFER_SIZE); int16_t* inBuf = new int16_t[blockSize * 2]; while (true) { @@ -159,8 +168,8 @@ private: static void floatWorker(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; - double sampleRate = _this->reader->getSampleRate(); - int blockSize = sampleRate / 200.0f; + double sampleRate = std::max(_this->reader->getSampleRate(), (uint32_t)1); + int blockSize = std::min((int)(sampleRate / 200.0f), (int)STREAM_BUFFER_SIZE); dsp::complex_t* inBuf = new dsp::complex_t[blockSize]; while (true) { @@ -214,4 +223,4 @@ MOD_EXPORT void _DELETE_INSTANCE_(void* instance) { MOD_EXPORT void _END_() { config.disableAutoSave(); config.save(); -} \ No newline at end of file +} From 320f4459eda129634b9529c9fb3d423b0a008c8e Mon Sep 17 00:00:00 2001 From: nmaster2042 Date: Sat, 26 Aug 2023 13:21:30 +0200 Subject: [PATCH 06/28] Update france.json Change France Band plan 11m band high limit to 27,410 Mhz, see https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000006430657/2020-10-31 --- root/res/bandplans/france.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/root/res/bandplans/france.json b/root/res/bandplans/france.json index 59dfae04..d1fe373d 100644 --- a/root/res/bandplans/france.json +++ b/root/res/bandplans/france.json @@ -115,7 +115,7 @@ "end": 4995000 }, { - "name": "60m - radiodiffusion", + "name": "60m - radiodiffusion", "type": "broadcast", "start": 5005000, "end": 5060000 @@ -340,7 +340,7 @@ "name": "11m - CB", "type": "amateur", "start": 26960000, - "end": 27230000 + "end": 27410000 }, { "name": "10m - Radioamateur", @@ -493,4 +493,4 @@ "end": 250000000000 } ] -} \ No newline at end of file +} From 6b31134af293bbad52f103f80d6c0ffc5029f10a Mon Sep 17 00:00:00 2001 From: theverygaming Date: Sun, 27 Aug 2023 13:28:21 +0200 Subject: [PATCH 07/28] do not play file when samplerate == 0 --- source_modules/file_source/src/main.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source_modules/file_source/src/main.cpp b/source_modules/file_source/src/main.cpp index dbd6d710..a10f3c58 100644 --- a/source_modules/file_source/src/main.cpp +++ b/source_modules/file_source/src/main.cpp @@ -10,6 +10,7 @@ #include #include #include +#include // TODO: figure out where exactly these macros are from (only happens on windows so probably from Windows.h somewhere) #ifdef min @@ -130,7 +131,13 @@ private: } try { _this->reader = new WavReader(_this->fileSelect.path); - _this->sampleRate = std::max(_this->reader->getSampleRate(), (uint32_t)1); + if (_this->reader->getSampleRate() == 0) { + _this->reader->close(); + delete _this->reader; + _this->reader = NULL; + throw std::runtime_error("Sample rate may not be zero"); + } + _this->sampleRate = _this->reader->getSampleRate(); core::setInputSampleRate(_this->sampleRate); std::string filename = std::filesystem::path(_this->fileSelect.path).filename().string(); _this->centerFreq = _this->getFrequency(filename); @@ -139,7 +146,7 @@ private: //gui::freqSelect.maxFreq = _this->centerFreq + (_this->sampleRate/2); //gui::freqSelect.limitFreq = true; } - catch (std::exception e) { + catch (std::exception& e) { flog::error("Error: {0}", e.what()); } config.acquire(); From 20813849054ef4fefadbacb517dd41dce7a850d0 Mon Sep 17 00:00:00 2001 From: Bastien Cabay <37415063+Bastiti@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:47:13 +0200 Subject: [PATCH 08/28] Update belgium.json https://www.ibpt.be/consommateurs/publication/decision-du-29-aout-2023-concernant-l-attribution-du-spectre-40.660-mhz---40.690-mhz-a-des-stations-de-radiocommunications-privees-dinstruction-individuelle-dintercommunication-technique-et-detudes-utilisees-par-des-radioamateurs --- root/res/bandplans/belgium.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/root/res/bandplans/belgium.json b/root/res/bandplans/belgium.json index cc10ed1c..4b9b741d 100644 --- a/root/res/bandplans/belgium.json +++ b/root/res/bandplans/belgium.json @@ -149,6 +149,12 @@ "start": 28000000, "end": 29700000 }, + { + "name": "8m - Amateur", + "type": "amateur", + "start": 40660000, + "end": 40690000 + }, { "name": "6m - Amateur", "type": "amateur", From c1d9ab64f8488c012ad42175af29a14227a0ab40 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 4 Sep 2023 22:19:51 +0200 Subject: [PATCH 09/28] fixed CI --- .github/workflows/build_all.yml | 2 +- docker_builds/debian_sid/do_build.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 55ceacbf..20a1a462 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -109,7 +109,7 @@ jobs: run: wget https://www.sdrplay.com/software/SDRplay_RSP_API-MacOSX-3.07.3.pkg && sudo installer -pkg SDRplay_RSP_API-MacOSX-3.07.3.pkg -target / - name: Install libiio - run: git clone https://github.com/analogdevicesinc/libiio && cd libiio && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 && sudo make install && cd ../../ + run: wget https://github.com/analogdevicesinc/libiio/archive/refs/tags/v0.25.zip && 7z x v0.25.zip && cd libiio-0.25 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 && sudo make install && cd ../../ - name: Install libad9361 run: git clone https://github.com/analogdevicesinc/libad9361-iio && cd libad9361-iio && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 && sudo make install && cd ../../ diff --git a/docker_builds/debian_sid/do_build.sh b/docker_builds/debian_sid/do_build.sh index 6509c192..b67517a9 100644 --- a/docker_builds/debian_sid/do_build.sh +++ b/docker_builds/debian_sid/do_build.sh @@ -4,7 +4,7 @@ cd /root # Install dependencies and tools apt update -apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ +apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ libcodec2-dev autoconf libtool xxd @@ -32,4 +32,4 @@ cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD make VERBOSE=1 -j2 cd .. -sh make_debian_package.sh ./build 'libfftw3-dev, libglfw3-dev, libvolk2-dev, librtaudio-dev, libzstd-dev' \ No newline at end of file +sh make_debian_package.sh ./build 'libfftw3-dev, libglfw3-dev, libvolk-dev, librtaudio-dev, libzstd-dev' \ No newline at end of file From 365ab2325e4107c042b874a127b4d4bb06e5ad61 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 6 Sep 2023 03:39:12 +0200 Subject: [PATCH 10/28] MacOS CI fix --- .github/workflows/build_all.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 20a1a462..776da41f 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -96,8 +96,8 @@ jobs: - name: Update brew repositories run: brew update - - name: Fix stuff - run: rm -f /usr/local/bin/2to3* /usr/local/bin/idle3* /usr/local/bin/pydoc3* /usr/local/bin/python3* /usr/local/bin/python3-config* && brew reinstall gettext + #- name: Fix stuff + # run: rm -f /usr/local/bin/2to3* /usr/local/bin/idle3* /usr/local/bin/pydoc3* /usr/local/bin/python3* /usr/local/bin/python3-config* && brew reinstall gettext - name: Install dependencies run: brew install pkg-config libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd autoconf automake libtool && pip3 install mako From 4d0d14856b96fa2180f9622ba99c6042e1c6b0a2 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 6 Sep 2023 04:12:04 +0200 Subject: [PATCH 11/28] added support for RTL-SDR v4 on MacOS --- .github/workflows/build_all.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 776da41f..293ab251 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -96,11 +96,8 @@ jobs: - name: Update brew repositories run: brew update - #- name: Fix stuff - # run: rm -f /usr/local/bin/2to3* /usr/local/bin/idle3* /usr/local/bin/pydoc3* /usr/local/bin/python3* /usr/local/bin/python3-config* && brew reinstall gettext - - name: Install dependencies - run: brew install pkg-config libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd autoconf automake libtool && pip3 install mako + run: brew install pkg-config libusb fftw glfw airspy airspyhf portaudio hackrf libbladerf codec2 zstd autoconf automake libtool && pip3 install mako - name: Install volk run: git clone --recursive https://github.com/gnuradio/volk && cd volk && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 && sudo make install && cd ../../ @@ -120,6 +117,9 @@ jobs: - name: Install libperseus run: git clone https://github.com/Microtelecom/libperseus-sdr && cd libperseus-sdr && autoreconf -i && ./configure --prefix=/usr/local && make && make install && cd .. + - name: Install more recent librtlsdr + run: git clone https://github.com/osmocom/rtl-sdr && cd rtl-sdr && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 LIBRARY_PATH=$(pkg-config --libs-only-L libusb-1.0 | sed 's/\-L//') && sudo make install && cd ../../ + - name: Prepare CMake working-directory: ${{runner.workspace}}/build run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON -DOPT_BUILD_AUDIO_SOURCE=OFF -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release From 9c1361a8a9b5f2d41d84507adb7c39b41d69c7cf Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 6 Sep 2023 05:38:00 +0200 Subject: [PATCH 12/28] Added radio mode info in the recorder and fixed horrible code in the rigctl_server module --- misc_modules/recorder/CMakeLists.txt | 3 +- misc_modules/recorder/src/main.cpp | 19 +++++++ misc_modules/rigctl_server/src/main.cpp | 71 +++++++------------------ 3 files changed, 41 insertions(+), 52 deletions(-) diff --git a/misc_modules/recorder/CMakeLists.txt b/misc_modules/recorder/CMakeLists.txt index 90aa6ab0..a00f7d09 100644 --- a/misc_modules/recorder/CMakeLists.txt +++ b/misc_modules/recorder/CMakeLists.txt @@ -5,4 +5,5 @@ file(GLOB SRC "src/*.cpp") include(${SDRPP_MODULE_CMAKE}) -target_include_directories(recorder PRIVATE "src/") \ No newline at end of file +target_include_directories(recorder PRIVATE "src/") +target_include_directories(recorder PRIVATE "../../decoder_modules/radio/src") \ No newline at end of file diff --git a/misc_modules/recorder/src/main.cpp b/misc_modules/recorder/src/main.cpp index c2168ac9..ac7038b9 100644 --- a/misc_modules/recorder/src/main.cpp +++ b/misc_modules/recorder/src/main.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #define CONCAT(a, b) ((std::string(a) + b).c_str()) @@ -437,6 +438,17 @@ private: if (dbLvl.r > lvl.r) { lvl.r = dbLvl.r; } } + std::map radioModeToString = { + { RADIO_IFACE_MODE_NFM, "NFM" }, + { RADIO_IFACE_MODE_WFM, "WFM" }, + { RADIO_IFACE_MODE_AM, "AM" }, + { RADIO_IFACE_MODE_DSB, "DSB" }, + { RADIO_IFACE_MODE_USB, "USB" }, + { RADIO_IFACE_MODE_CW, "CW" }, + { RADIO_IFACE_MODE_LSB, "LSB" }, + { RADIO_IFACE_MODE_RAW, "RAW" } + }; + std::string genFileName(std::string templ, std::string type, std::string name) { // Get data time_t now = time(0); @@ -455,6 +467,7 @@ private: char dayStr[128]; char monStr[128]; char yearStr[128]; + const char* modeStr = "Unknown"; sprintf(freqStr, "%.0lfHz", freq); sprintf(hourStr, "%02d", ltm->tm_hour); sprintf(minStr, "%02d", ltm->tm_min); @@ -462,6 +475,11 @@ private: sprintf(dayStr, "%02d", ltm->tm_mday); sprintf(monStr, "%02d", ltm->tm_mon + 1); sprintf(yearStr, "%02d", ltm->tm_year + 1900); + if (core::modComManager.getModuleName(name) == "radio") { + int mode; + core::modComManager.callInterface(name, RADIO_IFACE_CMD_GET_MODE, NULL, &mode); + modeStr = radioModeToString[mode]; + } // Replace in template templ = std::regex_replace(templ, std::regex("\\$t"), type); @@ -472,6 +490,7 @@ private: templ = std::regex_replace(templ, std::regex("\\$d"), dayStr); templ = std::regex_replace(templ, std::regex("\\$M"), monStr); templ = std::regex_replace(templ, std::regex("\\$y"), yearStr); + templ = std::regex_replace(templ, std::regex("\\$r"), modeStr); return templ; } diff --git a/misc_modules/rigctl_server/src/main.cpp b/misc_modules/rigctl_server/src/main.cpp index 89520ef9..d0e4db8a 100644 --- a/misc_modules/rigctl_server/src/main.cpp +++ b/misc_modules/rigctl_server/src/main.cpp @@ -333,6 +333,17 @@ private: _this->client->readAsync(1024, _this->dataBuf, dataHandler, _this, false); } + std::map radioModeToString = { + { RADIO_IFACE_MODE_NFM, "NFM" }, + { RADIO_IFACE_MODE_WFM, "WFM" }, + { RADIO_IFACE_MODE_AM, "AM" }, + { RADIO_IFACE_MODE_DSB, "DSB" }, + { RADIO_IFACE_MODE_USB, "USB" }, + { RADIO_IFACE_MODE_CW, "CW" }, + { RADIO_IFACE_MODE_LSB, "LSB" }, + { RADIO_IFACE_MODE_RAW, "RAW" } + }; + void commandHandler(std::string cmd) { std::string corr = ""; std::vector parts; @@ -442,38 +453,18 @@ private: pos++; } + const std::string& newModeStr = parts[1]; float newBandwidth = std::atoi(parts[2].c_str()); - - int newMode; - if (parts[1] == "FM") { - newMode = RADIO_IFACE_MODE_NFM; - } - else if (parts[1] == "WFM") { - newMode = RADIO_IFACE_MODE_WFM; - } - else if (parts[1] == "AM") { - newMode = RADIO_IFACE_MODE_AM; - } - else if (parts[1] == "DSB") { - newMode = RADIO_IFACE_MODE_DSB; - } - else if (parts[1] == "USB") { - newMode = RADIO_IFACE_MODE_USB; - } - else if (parts[1] == "CW") { - newMode = RADIO_IFACE_MODE_CW; - } - else if (parts[1] == "LSB") { - newMode = RADIO_IFACE_MODE_LSB; - } - else if (parts[1] == "RAW") { - newMode = RADIO_IFACE_MODE_RAW; - } - else { + + auto it = std::find_if(radioModeToString.begin(), radioModeToString.end(), [&newModeStr](const auto& e) { + return e.second == newModeStr; + }); + if (it == radioModeToString.end()) { resp = "RPRT 1\n"; client->write(resp.size(), (uint8_t*)resp.c_str()); return; } + int newMode = it->first; // If tuning is enabled, set the mode and optionally the bandwidth if (!selectedVfo.empty() && core::modComManager.getModuleName(selectedVfo) == "radio" && tuningEnabled) { @@ -492,31 +483,9 @@ private: if (!selectedVfo.empty() && core::modComManager.getModuleName(selectedVfo) == "radio") { int mode; core::modComManager.callInterface(selectedVfo, RADIO_IFACE_CMD_GET_MODE, NULL, &mode); - - if (mode == RADIO_IFACE_MODE_NFM) { - resp = "FM\n"; - } - else if (mode == RADIO_IFACE_MODE_WFM) { - resp = "WFM\n"; - } - else if (mode == RADIO_IFACE_MODE_AM) { - resp = "AM\n"; - } - else if (mode == RADIO_IFACE_MODE_DSB) { - resp = "DSB\n"; - } - else if (mode == RADIO_IFACE_MODE_USB) { - resp = "USB\n"; - } - else if (mode == RADIO_IFACE_MODE_CW) { - resp = "CW\n"; - } - else if (mode == RADIO_IFACE_MODE_LSB) { - resp = "LSB\n"; - } + resp = std::string(radioModeToString[mode]) + "\n"; } - - if (!selectedVfo.empty()) { + else if (!selectedVfo.empty()) { resp += std::to_string((int)sigpath::vfoManager.getBandwidth(selectedVfo)) + "\n"; } else { From 97187b790feb4fe9809f21ad8989a18a03ca96fb Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 7 Sep 2023 17:27:34 +0300 Subject: [PATCH 13/28] Fix typo in fastAmplitude() --- core/src/dsp/types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/dsp/types.h b/core/src/dsp/types.h index 3642e7f9..e552829a 100644 --- a/core/src/dsp/types.h +++ b/core/src/dsp/types.h @@ -82,7 +82,7 @@ namespace dsp { inline float fastAmplitude() { float re_abs = fabsf(re); - float im_abs = fabsf(re); + float im_abs = fabsf(im); if (re_abs > im_abs) { return re_abs + 0.4f * im_abs; } return im_abs + 0.4f * re_abs; } @@ -125,4 +125,4 @@ namespace dsp { float l; float r; }; -} \ No newline at end of file +} From 0e50ee0e67a04836a5293d00b6143322726d04b2 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 13 Sep 2023 02:51:44 +0200 Subject: [PATCH 14/28] Update main.cpp --- source_modules/file_source/src/main.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/source_modules/file_source/src/main.cpp b/source_modules/file_source/src/main.cpp index a10f3c58..0fc4fa85 100644 --- a/source_modules/file_source/src/main.cpp +++ b/source_modules/file_source/src/main.cpp @@ -12,14 +12,6 @@ #include #include -// TODO: figure out where exactly these macros are from (only happens on windows so probably from Windows.h somewhere) -#ifdef min -#undef min -#endif -#ifdef max -#undef max -#endif - #define CONCAT(a, b) ((std::string(a) + b).c_str()) SDRPP_MOD_INFO{ From a824c8384802eeb5e43017bf1c42ac7310d1c8b0 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 13 Sep 2023 03:16:12 +0200 Subject: [PATCH 15/28] Update main.cpp --- source_modules/file_source/src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source_modules/file_source/src/main.cpp b/source_modules/file_source/src/main.cpp index 0fc4fa85..0628a412 100644 --- a/source_modules/file_source/src/main.cpp +++ b/source_modules/file_source/src/main.cpp @@ -1,3 +1,4 @@ +#define NOMINMAX #include #include #include From 0632342bb7548d429268c4afdf1d16eb87ae6b09 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 13 Sep 2023 05:14:07 +0200 Subject: [PATCH 16/28] fixed MacOS packaging --- macos/bundle_utils.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macos/bundle_utils.sh b/macos/bundle_utils.sh index 2f10ba5b..a14a1dd0 100644 --- a/macos/bundle_utils.sh +++ b/macos/bundle_utils.sh @@ -81,7 +81,7 @@ bundle_find_full_path() { # Correct dep path echo $RPATH/$RPATH_NEXT - return + return -1 done # Search other common paths From 766b3db3634de984291b10c1aebf84c8b368fafb Mon Sep 17 00:00:00 2001 From: Davide Rovelli Date: Thu, 14 Sep 2023 05:43:00 +0200 Subject: [PATCH 17/28] added clarification and correction --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 94822f63..a5dbac7a 100644 --- a/readme.md +++ b/readme.md @@ -76,7 +76,7 @@ The preferred IDE is [VS Code](https://code.visualstudio.com/) in order to have * [cmake](https://cmake.org) * [vcpkg](https://vcpkg.io) -* [PothosSDR](https://github.com/pothosware/PothosSDR) (This will install libraries for most SDRs) +* [PothosSDR](https://github.com/pothosware/PothosSDR) (This will install libraries for most SDRs. You have to install it in `C:/Program Files/PothosSDR`) * [RtAudio](https://www.music.mcgill.ca/~gary/rtaudio/) (You have to build and install it in `C:/Program Files (x86)/RtAudio/`) After this, install the following dependencies using vcpkg: @@ -115,16 +115,16 @@ You will next need to edit the `root_dev/config.json` file to point to the modul From the top directory, you can simply run: ```bat -./build/Release/sdrpp.exe -r root_dev -s +./build/Release/sdrpp.exe -r root_dev -c ``` Or, if you wish to run from the build directory e.g. `build/Release` and adapt the relative path to the `root_dev` folder: ```bat -./sdrpp.exe -r ../../root_dev -s +./sdrpp.exe -r ../../root_dev -c ``` -The optional `-s` argument is for keeping the console active in order to see the error messages. +The optional `-c` argument is for keeping the console active in order to see the error messages. Because all the paths are relative, for the rest of the command line instructions we are going to assume you are running from the top directory using the former command. As mentioned previously you need to edit `root_dev/config.json` to add the modules that were built. From the default configuration file you need to add the paths in the `modules` section. Add to this list all the modules you wish to use. From e41f24a95e2a3bd10a736aeee307796e716c7809 Mon Sep 17 00:00:00 2001 From: Davide Rovelli Date: Thu, 14 Sep 2023 05:50:53 +0200 Subject: [PATCH 18/28] first version --- root/res/bandplans/netherlands.json | 3177 +++++++++++++++++++++++++++ 1 file changed, 3177 insertions(+) create mode 100644 root/res/bandplans/netherlands.json diff --git a/root/res/bandplans/netherlands.json b/root/res/bandplans/netherlands.json new file mode 100644 index 00000000..da226678 --- /dev/null +++ b/root/res/bandplans/netherlands.json @@ -0,0 +1,3177 @@ +{ + "name": "Netherlands", + "country_name": "Netherlands", + "country_code": "NL", + "author_name": "Davide Rovelli", + "author_url": "http://daviderud.altervista.org", + "bands": [ + { + "start": 0, + "end": 8300, + "type": "utility", + "name": "Unallocated" + }, + { + "start": 8300, + "end": 9000, + "type": "utility", + "name": "Weather (LDS)" + }, + { + "start": 9000, + "end": 11300, + "type": "utility", + "name": "Radionavigation / Weather (LDS)" + }, + { + "start": 11300, + "end": 14000, + "type": "marine", + "name": "Radionavigation" + }, + { + "start": 14000, + "end": 19950, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 19950, + "end": 20050, + "type": "utility", + "name": "20KHz Time Signal" + }, + { + "start": 20050, + "end": 76850, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 76850, + "end": 78150, + "type": "utility", + "name": "DCF77 (DE)" + }, + { + "start": 78150, + "end": 135700, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 135700, + "end": 136000, + "type": "amateur", + "name": "|2200m Ham Band Tests, Transatlantic Window" + }, + { + "start": 136000, + "end": 137400, + "type": "amateur1", + "name": "2200m Telegraphy" + }, + { + "start": 137400, + "end": 137600, + "type": "amateur", + "name": "Digital" + }, + { + "start": 137600, + "end": 137800, + "type": "amateur1", + "name": "Slow Telegraphy 2200m Ham Band|" + }, + { + "start": 137800, + "end": 148500, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 148500, + "end": 255000, + "type": "broadcast", + "name": "Long Wave" + }, + { + "start": 255000, + "end": 283500, + "type": "broadcast", + "name": "Long Wave / Aeronautical Radionavigation" + }, + { + "start": 283500, + "end": 526500, + "type": "aviation", + "name": "Aeronautical Radionavigation / Maritime" + }, + { + "start": 526500, + "end": 1606500, + "type": "broadcast", + "name": "Medium Wave" + }, + { + "start": 1606500, + "end": 1625000, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 1625000, + "end": 1635000, + "type": "aviation", + "name": "Radiolocation Beacons" + }, + { + "start": 1635000, + "end": 1800000, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 1800000, + "end": 1810000, + "type": "aviation", + "name": "Radiolocation Beacons" + }, + { + "start": 1810000, + "end": 1880000, + "type": "amateur", + "name": "160m Ham Band" + }, + { + "start": 1880000, + "end": 2025000, + "type": "aviation", + "name": "Aeronautical Mobile Service" + }, + { + "start": 2025000, + "end": 2045000, + "type": "aviation", + "name": "Aeronautical Mobile Service / Weather aux." + }, + { + "start": 2045000, + "end": 2160000, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 2160000, + "end": 2170000, + "type": "aviation", + "name": "Radiolocation Beacons" + }, + { + "start": 2170000, + "end": 2173500, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 2173500, + "end": 2190500, + "type": "aviation", + "name": "Distress and Calling for Maritime and Aeronautical" + }, + { + "start": 2190500, + "end": 2194000, + "type": "marine", + "name": "Maritime Mobile" + }, + { + "start": 2194000, + "end": 2300000, + "type": "aviation", + "name": "Aeronautical Mobile" + }, + { + "start": 2300000, + "end": 2498000, + "type": "broadcast", + "name": "Shortwave (Tropical Band 120m) Broadcast" + }, + { + "start": 2498000, + "end": 2501000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 2501000, + "end": 2502000, + "type": "utility", + "name": "Standard Frequency and Time Signal / Spatial research" + }, + { + "start": 2502000, + "end": 2625000, + "type": "aviation", + "name": "Aeronautical Mobile Service" + }, + { + "start": 2625000, + "end": 2650000, + "type": "marine", + "name": "Maritime Mobile Service" + }, + { + "start": 2650000, + "end": 2850000, + "type": "aviation", + "name": "Aeronautical Mobile Service" + }, + { + "start": 2850000, + "end": 3155000, + "type": "aviation", + "name": "Transoceanic Flights (Aeronautical Mobile)" + }, + { + "start": 3155000, + "end": 3200000, + "type": "marine", + "name": "Maritime Mobile" + }, + { + "start": 3200000, + "end": 3329000, + "type": "broadcast", + "name": "Shortwave (Tropical Band 90m) Broadcast" + }, + { + "start": 3329000, + "end": 3331000, + "type": "utility", + "name": "CHU Canada" + }, + { + "start": 3331000, + "end": 3400000, + "type": "broadcast", + "name": "Shortwave (Tropical Band 90m) Broadcast" + }, + { + "start": 3400000, + "end": 3500000, + "type": "aviation", + "name": "Aeronautical" + }, + { + "start": 3500000, + "end": 3570000, + "type": "amateur", + "name": "|80m Ham Band" + }, + { + "start": 3570000, + "end": 3600000, + "type": "amateur1", + "name": "RTTY/Data DX" + }, + { + "start": 3600000, + "end": 3754500, + "type": "amateur", + "name": "80m Ham Band" + }, + { + "start": 3754500, + "end": 3757500, + "type": "amateur1", + "name": "The Pip (Night)" + }, + { + "start": 3757500, + "end": 3790000, + "type": "amateur", + "name": "80m Ham Band" + }, + { + "start": 3790000, + "end": 3800000, + "type": "amateur1", + "name": "DX window 80m Ham Band|" + }, + { + "start": 3800000, + "end": 3950000, + "type": "aviation", + "name": "Aeronautical Mobile Service" + }, + { + "start": 3950000, + "end": 4000000, + "type": "broadcast", + "name": "Shortwave (75m) Broadcast" + }, + { + "start": 4000000, + "end": 4063500, + "type": "marine", + "name": "(Ship TX) Maritime" + }, + { + "start": 4063500, + "end": 4066500, + "type": "marine1", + "name": "ITU Ch. 401 (Ship TX)" + }, + { + "start": 4066500, + "end": 4069500, + "type": "marine", + "name": "402" + }, + { + "start": 4069500, + "end": 4072500, + "type": "marine1", + "name": "403" + }, + { + "start": 4072500, + "end": 4075500, + "type": "marine", + "name": "404" + }, + { + "start": 4075500, + "end": 4078500, + "type": "marine1", + "name": "405" + }, + { + "start": 4078500, + "end": 4081500, + "type": "marine", + "name": "406" + }, + { + "start": 4081500, + "end": 4084500, + "type": "marine1", + "name": "407" + }, + { + "start": 4084500, + "end": 4087500, + "type": "marine", + "name": "408" + }, + { + "start": 4087500, + "end": 4090500, + "type": "marine1", + "name": "409" + }, + { + "start": 4090500, + "end": 4093500, + "type": "marine", + "name": "410" + }, + { + "start": 4093500, + "end": 4096500, + "type": "marine1", + "name": "411" + }, + { + "start": 4096500, + "end": 4099500, + "type": "marine", + "name": "412" + }, + { + "start": 4099500, + "end": 4102500, + "type": "marine1", + "name": "413" + }, + { + "start": 4102500, + "end": 4105500, + "type": "marine", + "name": "414" + }, + { + "start": 4105500, + "end": 4108500, + "type": "marine1", + "name": "415" + }, + { + "start": 4108500, + "end": 4111500, + "type": "marine", + "name": "416" + }, + { + "start": 4111500, + "end": 4114500, + "type": "marine1", + "name": "417" + }, + { + "start": 4114500, + "end": 4117500, + "type": "marine", + "name": "418" + }, + { + "start": 4117500, + "end": 4120500, + "type": "marine1", + "name": "419" + }, + { + "start": 4120500, + "end": 4123500, + "type": "marine", + "name": "420" + }, + { + "start": 4123500, + "end": 4126500, + "type": "marine1", + "name": "421 (Distress/ Safety)" + }, + { + "start": 4126500, + "end": 4129500, + "type": "marine", + "name": "422" + }, + { + "start": 4129500, + "end": 4132500, + "type": "marine", + "name": "423" + }, + { + "start": 4132500, + "end": 4135500, + "type": "marine1", + "name": "424" + }, + { + "start": 4135500, + "end": 4138500, + "type": "marine", + "name": "425" + }, + { + "start": 4138500, + "end": 4141500, + "type": "marine1", + "name": "426" + }, + { + "start": 4141500, + "end": 4144500, + "type": "marine", + "name": "427" + }, + { + "start": 4144500, + "end": 4348000, + "type": "marine1", + "name": "(Ship TX) Maritime" + }, + { + "start": 4348000, + "end": 4349500, + "type": "marine1", + "name": "(Coast TX) Maritime" + }, + { + "start": 4349500, + "end": 4352500, + "type": "marine", + "name": "ITU Ch. 428 (Coast TX)" + }, + { + "start": 4352500, + "end": 4355500, + "type": "marine1", + "name": "429" + }, + { + "start": 4355500, + "end": 4358500, + "type": "marine1", + "name": "401" + }, + { + "start": 4358500, + "end": 4361500, + "type": "marine", + "name": "402" + }, + { + "start": 4361500, + "end": 4364500, + "type": "marine1", + "name": "403" + }, + { + "start": 4364500, + "end": 4367500, + "type": "marine", + "name": "404" + }, + { + "start": 4367500, + "end": 4370500, + "type": "marine1", + "name": "405" + }, + { + "start": 4370500, + "end": 4373500, + "type": "marine", + "name": "406" + }, + { + "start": 4373500, + "end": 4376500, + "type": "marine1", + "name": "407" + }, + { + "start": 4376500, + "end": 4379500, + "type": "marine", + "name": "408" + }, + { + "start": 4379500, + "end": 4382500, + "type": "marine1", + "name": "409" + }, + { + "start": 4382500, + "end": 4385500, + "type": "marine", + "name": "410" + }, + { + "start": 4385500, + "end": 4388500, + "type": "marine1", + "name": "411" + }, + { + "start": 4388500, + "end": 4391500, + "type": "marine", + "name": "412" + }, + { + "start": 4391500, + "end": 4394500, + "type": "marine1", + "name": "413" + }, + { + "start": 4394500, + "end": 4397500, + "type": "marine", + "name": "414" + }, + { + "start": 4397500, + "end": 4400500, + "type": "marine1", + "name": "415" + }, + { + "start": 4400500, + "end": 4403500, + "type": "marine", + "name": "416" + }, + { + "start": 4403500, + "end": 4406500, + "type": "marine1", + "name": "417" + }, + { + "start": 4406500, + "end": 4409500, + "type": "marine", + "name": "418" + }, + { + "start": 4409500, + "end": 4412500, + "type": "marine1", + "name": "419" + }, + { + "start": 4412500, + "end": 4415500, + "type": "marine", + "name": "420" + }, + { + "start": 4415500, + "end": 4418500, + "type": "marine1", + "name": "421" + }, + { + "start": 4418500, + "end": 4421500, + "type": "marine", + "name": "422" + }, + { + "start": 4421500, + "end": 4424500, + "type": "marine1", + "name": "423" + }, + { + "start": 4424500, + "end": 4427500, + "type": "marine", + "name": "424" + }, + { + "start": 4427500, + "end": 4430500, + "type": "marine1", + "name": "425" + }, + { + "start": 4430500, + "end": 4433500, + "type": "marine", + "name": "426" + }, + { + "start": 4433500, + "end": 4436500, + "type": "marine1", + "name": "427" + }, + { + "start": 4436500, + "end": 4623500, + "type": "marine1", + "name": "(Coast TX) Maritime" + }, + { + "start": 4623500, + "end": 4626500, + "type": "utility", + "name": "UVB-76 (Lower)" + }, + { + "start": 4626500, + "end": 4750000, + "type": "marine1", + "name": "(Coast TX) Maritime" + }, + { + "start": 4750000, + "end": 4808500, + "type": "broadcast", + "name": "Shortwave (Tropical Band 60m) Broadcast" + }, + { + "start": 4808500, + "end": 4811500, + "type": "utility", + "name": "UVB-76 (Upper)" + }, + { + "start": 4811500, + "end": 4995000, + "type": "broadcast", + "name": "Shortwave (Tropical Band 60m) Broadcast" + }, + { + "start": 4995000, + "end": 5003000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 5003000, + "end": 5005000, + "type": "utility", + "name": "Standard Frequency and Time Signal / Spatial research" + }, + { + "start": 5005000, + "end": 5060000, + "type": "broadcast", + "name": "Shortwave (Tropical Band 60m) Broadcast" + }, + { + "start": 5060000, + "end": 5330500, + "type": "aviation", + "name": "Maritime Mobile/ Private Land Mobile" + }, + { + "start": 5330500, + "end": 5333400, + "type": "amateur", + "name": "|60m Ham Band Ch. 1 (Not NL)" + }, + { + "start": 5333400, + "end": 5346500, + "type": "amateur1", + "name": "60m Ham Band (Not NL)" + }, + { + "start": 5346500, + "end": 5349400, + "type": "amateur", + "name": "Ch. 2 (60m) (Not NL)" + }, + { + "start": 5351500, + "end": 5366500, + "type": "amateur1", + "name": "60m Ham Band NL" + }, + { + "start": 5357000, + "end": 5359900, + "type": "amateur", + "name": "Ch. 3 (60m) (Not NL)" + }, + { + "start": 5359900, + "end": 5371500, + "type": "amateur1", + "name": "60m Ham Band (Not NL)" + }, + { + "start": 5371500, + "end": 5374400, + "type": "amateur", + "name": "Ch. 4 (60m) (Not NL)" + }, + { + "start": 5374400, + "end": 5403500, + "type": "amateur1", + "name": "60m Ham Band (Not NL)" + }, + { + "start": 5403500, + "end": 5406400, + "type": "amateur", + "name": "Ch. 5 60m Ham Band (Not NL)|" + }, + { + "start": 5406400, + "end": 5446500, + "type": "aviation", + "name": "Aeronautical/ Maritime" + }, + { + "start": 5446500, + "end": 5449500, + "type": "utility", + "name": "The Pip (Day)" + }, + { + "start": 5449500, + "end": 5900000, + "type": "aviation", + "name": "Aeronautical/ Maritime" + }, + { + "start": 5900000, + "end": 6200000, + "type": "broadcast", + "name": "Shortwave (49m) Broadcast" + }, + { + "start": 6200000, + "end": 6214750, + "type": "marine", + "name": "(Ship TX) Maritime" + }, + { + "start": 6213750, + "end": 6216250, + "type": "aviation", + "name": "Distress" + }, + { + "start": 6216250, + "end": 6342500, + "type": "marine", + "name": "(Ship TX) Maritime" + }, + { + "start": 6342500, + "end": 6765000, + "type": "aviation", + "name": "(Transoceanic Flights) Aeronautical and (Ship/Shore) Maritime" + }, + { + "start": 6765000, + "end": 6795000, + "type": "utility", + "name": "ISM Band (50m)" + }, + { + "start": 6795000, + "end": 7000000, + "type": "aviation", + "name": "Long Distance Communications" + }, + { + "start": 7000000, + "end": 7080000, + "type": "amateur", + "name": "|40m Ham Band" + }, + { + "start": 7080000, + "end": 7169000, + "type": "amateur1", + "name": "RTTY/Data" + }, + { + "start": 7169000, + "end": 7173000, + "type": "amateur", + "name": "SSTV" + }, + { + "start": 7173000, + "end": 7200000, + "type": "amateur1", + "name": "40m Ham Band|" + }, + { + "start": 7200000, + "end": 7450000, + "type": "broadcast", + "name": "Shortwave (41m) Broadcast" + }, + { + "start": 7450000, + "end": 7633500, + "type": "marine", + "name": "Maritime" + }, + { + "start": 7633500, + "end": 7636500, + "type": "marine", + "name": "MARS" + }, + { + "start": 7636500, + "end": 7850000, + "type": "marine", + "name": "Maritime" + }, + { + "start": 7850000, + "end": 8289750, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 8289750, + "end": 8292250, + "type": "marine1", + "name": "Distress" + }, + { + "start": 8292250, + "end": 8680000, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 8680000, + "end": 9108000, + "type": "marine1", + "name": "(Transoceanic Flights) Aeronautical and (Ship/Shore) Maritime" + }, + { + "start": 9108000, + "end": 9400000, + "type": "marine", + "name": "Maritime Mobile/ Private Land Mobile" + }, + { + "start": 9400000, + "end": 9900000, + "type": "broadcast", + "name": "Shortwave (31m) Broadcast" + }, + { + "start": 9900000, + "end": 9995000, + "type": "utility", + "name": "Private Land Mobile" + }, + { + "start": 9995000, + "end": 10003000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 10003000, + "end": 10005000, + "type": "utility", + "name": "Standard Frequency and Time Signal / Spatial research" + }, + { + "start": 10005000, + "end": 10100000, + "type": "aviation", + "name": "Aeronautical" + }, + { + "start": 10100000, + "end": 10130000, + "type": "amateur", + "name": "|30m Ham Band" + }, + { + "start": 10130000, + "end": 10140000, + "type": "amateur1", + "name": "RTTY" + }, + { + "start": 10140000, + "end": 10150000, + "type": "amateur", + "name": "Packet 30m Ham Band|" + }, + { + "start": 10150000, + "end": 11407000, + "type": "aviation", + "name": "Aeronautical" + }, + { + "start": 11407000, + "end": 11410000, + "type": "marine", + "name": "MARS" + }, + { + "start": 11410000, + "end": 11600000, + "type": "aviation", + "name": "Aeronautical" + }, + { + "start": 11600000, + "end": 12100000, + "type": "broadcast", + "name": "Shortwave (25m) Broadcast" + }, + { + "start": 12100000, + "end": 12288750, + "type": "aviation", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 12288750, + "end": 12291250, + "type": "aviation", + "name": "Distress" + }, + { + "start": 12291250, + "end": 12787900, + "type": "aviation", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 12791900, + "end": 13360000, + "type": "aviation", + "name": "(Transoceanic Flights) Aeronautical and (Ship/Shore) Maritime" + }, + { + "start": 13360000, + "end": 13410000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 13410000, + "end": 13553000, + "type": "aviation", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 13553000, + "end": 13567000, + "type": "amateur", + "name": "22m (HiFER) Band and 22m ISM" + }, + { + "start": 13567000, + "end": 13570000, + "type": "utility", + "name": "22m ISM Band" + }, + { + "start": 13570000, + "end": 13870000, + "type": "broadcast", + "name": "Shortwave (22m) Broadcast" + }, + { + "start": 13927000, + "end": 13930000, + "type": "marine", + "name": "MARS" + }, + { + "start": 14000000, + "end": 14070000, + "type": "amateur", + "name": "|20m Ham Band" + }, + { + "start": 14070000, + "end": 14095000, + "type": "amateur1", + "name": "RTTY" + }, + { + "start": 14095000, + "end": 14099500, + "type": "amateur", + "name": "Packet" + }, + { + "start": 14099500, + "end": 14100500, + "type": "amateur1", + "name": "NCDXF Beacons" + }, + { + "start": 14100500, + "end": 14112000, + "type": "amateur", + "name": "Packet" + }, + { + "start": 14112000, + "end": 14228000, + "type": "amateur1", + "name": "20m Ham Band" + }, + { + "start": 14228000, + "end": 14232000, + "type": "amateur", + "name": "SSTV" + }, + { + "start": 14232000, + "end": 14284000, + "type": "amateur1", + "name": "20m Ham Band" + }, + { + "start": 14284000, + "end": 14288000, + "type": "amateur", + "name": "AM calling frequency" + }, + { + "start": 14288000, + "end": 14350000, + "type": "amateur1", + "name": "20m Ham Band|" + }, + { + "start": 14350000, + "end": 14995000, + "type": "utility", + "name": "Private Land Mobile" + }, + { + "start": 14995000, + "end": 15005000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 15005000, + "end": 15100000, + "type": "aviation", + "name": "(Transoceanic Flights) Aeronautical Mobile" + }, + { + "start": 15100000, + "end": 15800000, + "type": "broadcast", + "name": "Shortwave (19m) Broadcast" + }, + { + "start": 15800000, + "end": 16418750, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 16418750, + "end": 16421250, + "type": "marine1", + "name": "Distress" + }, + { + "start": 16421250, + "end": 17480000, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 17480000, + "end": 17900000, + "type": "broadcast", + "name": "Shortwave (16m) Broadcast" + }, + { + "start": 17900000, + "end": 18068000, + "type": "aviation", + "name": "(Transoceanic Flights) Aeronautical" + }, + { + "start": 18068000, + "end": 18168000, + "type": "amateur", + "name": "17m Ham Band" + }, + { + "start": 18168000, + "end": 18900000, + "type": "marine", + "name": "(Ship/Shore) Maritime/ Fixed Service" + }, + { + "start": 18900000, + "end": 19020000, + "type": "broadcast", + "name": "Shortwave (15m) Broadcast" + }, + { + "start": 19020000, + "end": 19995000, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 19995000, + "end": 20005000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 20005000, + "end": 21000000, + "type": "utility", + "name": "Private Land Mobile" + }, + { + "start": 21000000, + "end": 21450000, + "type": "amateur", + "name": "15m Ham Band" + }, + { + "start": 21450000, + "end": 21850000, + "type": "broadcast", + "name": "Shortwave (13m) Broadcast" + }, + { + "start": 21850000, + "end": 22000000, + "type": "aviation", + "name": "Aeronautical Mobile" + }, + { + "start": 22000000, + "end": 24890000, + "type": "marine", + "name": "(Ship/Shore) Maritime" + }, + { + "start": 24890000, + "end": 24990000, + "type": "amateur", + "name": "12m Ham Band" + }, + { + "start": 24990000, + "end": 24995000, + "type": "marine", + "name": "Maritime" + }, + { + "start": 24995000, + "end": 25005000, + "type": "utility", + "name": "Standard Frequency and Time Signal" + }, + { + "start": 25005000, + "end": 25550000, + "type": "marine", + "name": "Maritime" + }, + { + "start": 25550000, + "end": 25670000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 25670000, + "end": 26100000, + "type": "broadcast", + "name": "Shortwave (11m) Broadcast" + }, + { + "start": 26100000, + "end": 26957000, + "type": "marine", + "name": "Maritime" + }, + { + "start": 26957000, + "end": 27283000, + "type": "utility", + "name": "10m ISM" + }, + { + "start": 27283000, + "end": 27410000, + "type": "marine", + "name": "Maritime" + }, + { + "start": 27410000, + "end": 28000000, + "type": "utility", + "name": "Meteorological Aids" + }, + { + "start": 28000000, + "end": 28070000, + "type": "amateur", + "name": "|10m Ham Band CW" + }, + { + "start": 28070000, + "end": 28120000, + "type": "amateur1", + "name": "NB modes digimodes" + }, + { + "start": 28120000, + "end": 28150000, + "type": "amateur", + "name": "NB modes digimodes stations (unatt.)" + }, + { + "start": 28150000, + "end": 28190000, + "type": "amateur1", + "name": "NB Modes" + }, + { + "start": 28190000, + "end": 28199000, + "type": "amateur", + "name": "IBP, regional time shared beacons" + }, + { + "start": 28199000, + "end": 28201000, + "type": "amateur1", + "name": "IBP, worldwide time shared beacons" + }, + { + "start": 28201000, + "end": 28225000, + "type": "amateur", + "name": "IBP, continuous duty beacons" + }, + { + "start": 28225000, + "end": 28300000, + "type": "amateur1", + "name": "All modes beacons" + }, + { + "start": 28300000, + "end": 28320000, + "type": "amateur", + "name": "All modes - digimodes stations (unatt.)" + }, + { + "start": 28320000, + "end": 29100000, + "type": "amateur1", + "name": "All modes" + }, + { + "start": 29100000, + "end": 29200000, + "type": "amateur", + "name": "All modes - FM simplex – 10 kHz channel" + }, + { + "start": 29200000, + "end": 29300000, + "type": "amateur1", + "name": "All modes - digimodes stations (unatt.)" + }, + { + "start": 29300000, + "end": 29510000, + "type": "amateur", + "name": "Satellite downlink" + }, + { + "start": 29510000, + "end": 29520000, + "type": "amateur1", + "name": "Guard channel" + }, + { + "start": 29520000, + "end": 29590000, + "type": "amateur", + "name": "All modes - FM repeater input (RH1 – RH8)" + }, + { + "start": 29600000, + "end": 29610000, + "type": "amateur1", + "name": "All modes - FM calling channel" + }, + { + "start": 29610000, + "end": 29620000, + "type": "amateur", + "name": "All modes - FM simplex repeater (parrot - input and output)" + }, + { + "start": 29620000, + "end": 29700000, + "type": "amateur1", + "name": "All modes - FM repeater outputs (RH1 – RH8) 10m Ham Band|" + }, + { + "start": 29700000, + "end": 40660000, + "type": "marine", + "name": "Fixed Mobile/ Maritime" + }, + { + "start": 40660000, + "end": 40700000, + "type": "utility", + "name": "8m ISM" + }, + { + "start": 40700000, + "end": 50000000, + "type": "marine", + "name": "Fixed Mobile/ Maritime" + }, + { + "start": 50000000, + "end": 52000000, + "type": "amateur", + "name": "6m Ham Band" + }, + { + "start": 54000000, + "end": 70000000, + "type": "broadcast", + "name": "Radiolocation/ Television VHF" + }, + { + "start": 70000000, + "end": 70500000, + "type": "amateur", + "name": "4m Ham Band (sec use)" + }, + { + "start": 73000000, + "end": 74600000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 76000000, + "end": 88000000, + "type": "utility", + "name": "Radiolocation/ FM Broadcast" + }, + { + "start": 88000000, + "end": 108000000, + "type": "broadcast", + "name": "FM Broadcast" + }, + { + "start": 108000000, + "end": 118000000, + "type": "aviation", + "name": "Air Band VOR/ILS" + }, + { + "start": 118000000, + "end": 121490000, + "type": "aviation", + "name": "Air Band Voice" + }, + { + "start": 121490000, + "end": 121510000, + "type": "aviation", + "name": "Civilian Aircraft Distress/ Emergency" + }, + { + "start": 121510000, + "end": 131545000, + "type": "aviation", + "name": "Air Band Voice" + }, + { + "start": 131545000, + "end": 131555000, + "type": "aviation", + "name": "ACARS" + }, + { + "start": 131555000, + "end": 136637500, + "type": "aviation", + "name": "Air Band Voice" + }, + { + "start": 136637500, + "end": 136662500, + "type": "aviation", + "name": "VDL-M2 (US)" + }, + { + "start": 136662500, + "end": 136687500, + "type": "aviation", + "name": "aviation" + }, + { + "start": 136687500, + "end": 136712500, + "type": "aviation", + "name": "VDL-M2 (US)" + }, + { + "start": 136712500, + "end": 136737500, + "type": "aviation", + "name": "VDL-M2 (EU)" + }, + { + "start": 136737500, + "end": 136762500, + "type": "aviation", + "name": "aviation" + }, + { + "start": 136762500, + "end": 136787500, + "type": "aviation", + "name": "VDL-M2 (EU)" + }, + { + "start": 136787500, + "end": 136812500, + "type": "aviation", + "name": "VDL-M2 (US)" + }, + { + "start": 136812500, + "end": 136837500, + "type": "aviation", + "name": "VDL-M2 (EU)" + }, + { + "start": 136837500, + "end": 136862500, + "type": "aviation", + "name": "aviation" + }, + { + "start": 136862500, + "end": 136887500, + "type": "aviation", + "name": "VDL-M2 (EU)" + }, + { + "start": 136887500, + "end": 136962500, + "type": "aviation", + "name": "aviation" + }, + { + "start": 136962500, + "end": 136987500, + "type": "aviation", + "name": "Worldwide VDL-M2" + }, + { + "start": 136987500, + "end": 137000000, + "type": "aviation", + "name": "aviation" + }, + { + "start": 137040000, + "end": 137080000, + "type": "satellite", + "name": "| METEOR" + }, + { + "start": 137080000, + "end": 137120000, + "type": "satellite1", + "name": "NOAA-19" + }, + { + "start": 137120000, + "end": 137160000, + "type": "satellite", + "name": "METEOR |" + }, + { + "start": 137333000, + "end": 137367000, + "type": "satellite1", + "name": "DSB NOAA-15 and NOAA-18" + }, + { + "start": 137600000, + "end": 137640000, + "type": "satellite", + "name": "NOAA-15" + }, + { + "start": 137753000, + "end": 137787000, + "type": "satellite1", + "name": "DSB NOAA-19" + }, + { + "start": 137892500, + "end": 137932500, + "type": "satellite", + "name": "NOAA-18" + }, + { + "start": 137175000, + "end": 137327500, + "type": "satellite1", + "name": "ORB. Seg. 1" + }, + { + "start": 137422500, + "end": 137472500, + "type": "satellite", + "name": "ORB. Seg. 2" + }, + { + "start": 137535000, + "end": 137585000, + "type": "satellite1", + "name": "Orbcomm Gateway" + }, + { + "start": 137650000, + "end": 137750000, + "type": "satellite", + "name": "ORB. Seg. 3" + }, + { + "start": 137787500, + "end": 137812500, + "type": "satellite1", + "name": "ORB. Seg. 4" + }, + { + "start": 144000000, + "end": 144035000, + "type": "amateur", + "name": "|2m Ham Band EME" + }, + { + "start": 144035000, + "end": 144150000, + "type": "amateur1", + "name": "CW" + }, + { + "start": 144150000, + "end": 144400000, + "type": "amateur", + "name": "SSB" + }, + { + "start": 144400000, + "end": 144480000, + "type": "amateur1", + "name": "Beacons" + }, + { + "start": 144480000, + "end": 144500000, + "type": "satellite", + "name": "ISS Voice Uplink + Beacons" + }, + { + "start": 144500000, + "end": 144800000, + "type": "amateur1", + "name": "Alle modes" + }, + { + "start": 144800000, + "end": 144990000, + "type": "amateur", + "name": "Digitale comm" + }, + { + "start": 144990000, + "end": 145570000, + "type": "amateur1", + "name": "Voice" + }, + { + "start": 145570000, + "end": 145800000, + "type": "amateur", + "name": "Repeaters Voice" + }, + { + "start": 145790000, + "end": 145810000, + "type": "satellite", + "name": "ISS Voice/ SSTV Downlink" + }, + { + "start": 145810000, + "end": 145815000, + "type": "satellite1", + "name": "Satellites" + }, + { + "start": 145815000, + "end": 145835000, + "type": "satellite", + "name": "ISS VHF Packet U/D" + }, + { + "start": 145835000, + "end": 145845000, + "type": "satellite1", + "name": "Satellites" + }, + { + "start": 145845000, + "end": 145855000, + "type": "satellite", + "name": "SO-50 Uplink" + }, + { + "start": 145855000, + "end": 145870000, + "type": "satellite1", + "name": "Satellites" + }, + { + "start": 145870000, + "end": 145890000, + "type": "satellite", + "name": "AO-92 Downlink" + }, + { + "start": 145890000, + "end": 145895000, + "type": "satellite1", + "name": "Satellites" + }, + { + "start": 145895000, + "end": 145905000, + "type": "satellite", + "name": "PO-101 Downlink" + }, + { + "start": 145905000, + "end": 145950000, + "type": "satellite1", + "name": "Satellites" + }, + { + "start": 145950000, + "end": 145970000, + "type": "satellite", + "name": "AO-91 Downlink" + }, + { + "start": 145970000, + "end": 145980000, + "type": "satellite1", + "name": "AO-85 Downlink" + }, + { + "start": 145980000, + "end": 145990000, + "type": "satellite", + "name": "AO-85 Downlink and ISS Repeater Uplink" + }, + { + "start": 145990000, + "end": 146000000, + "type": "satellite1", + "name": "ISS U/V Repeater Uplink 2m Ham Band|" + }, + { + "start": 146000000, + "end": 148000000, + "type": "amateur", + "name": "2m Band (Not NL)" + }, + { + "start": 148000000, + "end": 150000000, + "type": "satellite", + "name": "Orbcomm Uplink" + }, + { + "start": 150000000, + "end": 155987500, + "type": "marine", + "name": "Fixed Mobile" + }, + { + "start": 155987500, + "end": 156012500, + "type": "marine", + "name": "0" + }, + { + "start": 156012500, + "end": 156037500, + "type": "marine1", + "name": "60" + }, + { + "start": 156037500, + "end": 156062500, + "type": "marine", + "name": "1" + }, + { + "start": 156062500, + "end": 156087500, + "type": "marine1", + "name": "61" + }, + { + "start": 156087500, + "end": 156112500, + "type": "marine", + "name": "2" + }, + { + "start": 156112500, + "end": 156137500, + "type": "marine1", + "name": "62" + }, + { + "start": 156137500, + "end": 156162500, + "type": "marine", + "name": "3" + }, + { + "start": 156162500, + "end": 156187500, + "type": "marine1", + "name": "63" + }, + { + "start": 156187500, + "end": 156212500, + "type": "marine", + "name": "4" + }, + { + "start": 156212500, + "end": 156237500, + "type": "marine1", + "name": "64" + }, + { + "start": 156237500, + "end": 156262500, + "type": "marine", + "name": "5" + }, + { + "start": 156262500, + "end": 156287500, + "type": "marine1", + "name": "65" + }, + { + "start": 156287500, + "end": 156312500, + "type": "marine", + "name": "6 (Splx)" + }, + { + "start": 156312500, + "end": 156337500, + "type": "marine1", + "name": "66" + }, + { + "start": 156337500, + "end": 156362500, + "type": "marine", + "name": "7" + }, + { + "start": 156362500, + "end": 156387500, + "type": "marine1", + "name": "67 (Splx)" + }, + { + "start": 156387500, + "end": 156412500, + "type": "marine", + "name": "8 (Splx)" + }, + { + "start": 156412500, + "end": 156437500, + "type": "marine1", + "name": "68 (Splx)" + }, + { + "start": 156437500, + "end": 156462500, + "type": "marine", + "name": "9 (Splx)" + }, + { + "start": 156462500, + "end": 156487500, + "type": "marine1", + "name": "69 (Splx)" + }, + { + "start": 156487500, + "end": 156512500, + "type": "marine", + "name": "10 (Splx)" + }, + { + "start": 156512500, + "end": 156537500, + "type": "marine1", + "name": "70 (Splx)" + }, + { + "start": 156537500, + "end": 156562500, + "type": "marine", + "name": "11 (Splx)" + }, + { + "start": 156562500, + "end": 156587500, + "type": "marine1", + "name": "71 (Splx)" + }, + { + "start": 156587500, + "end": 156612500, + "type": "marine", + "name": "12 (Splx)" + }, + { + "start": 156612500, + "end": 156637500, + "type": "marine1", + "name": "72 (Splx)" + }, + { + "start": 156637500, + "end": 156662500, + "type": "marine", + "name": "13 (Splx)" + }, + { + "start": 156662500, + "end": 156687500, + "type": "marine1", + "name": "73 (Splx)" + }, + { + "start": 156687500, + "end": 156712500, + "type": "marine", + "name": "14 (Splx)" + }, + { + "start": 156712500, + "end": 156737500, + "type": "marine1", + "name": "74 (Splx)" + }, + { + "start": 156737500, + "end": 156762500, + "type": "marine", + "name": "15 (Splx)" + }, + { + "start": 156762500, + "end": 156787500, + "type": "marine1", + "name": "75 (Splx)" + }, + { + "start": 156787500, + "end": 156812500, + "type": "aviation", + "name": "International Distress (Ch. 16)" + }, + { + "start": 156812500, + "end": 156837500, + "type": "marine1", + "name": "76 (Splx)" + }, + { + "start": 156837500, + "end": 156862500, + "type": "marine", + "name": "17 (Splx)" + }, + { + "start": 156862500, + "end": 156887500, + "type": "marine1", + "name": "77 (Splx)" + }, + { + "start": 156887500, + "end": 156912500, + "type": "marine", + "name": "18" + }, + { + "start": 156912500, + "end": 156937500, + "type": "marine1", + "name": "78" + }, + { + "start": 156937500, + "end": 156962500, + "type": "marine", + "name": "19" + }, + { + "start": 156962500, + "end": 156987500, + "type": "marine1", + "name": "79" + }, + { + "start": 156987500, + "end": 157012500, + "type": "marine", + "name": "20" + }, + { + "start": 157012500, + "end": 157037500, + "type": "marine1", + "name": "80" + }, + { + "start": 157037500, + "end": 157062500, + "type": "marine", + "name": "21" + }, + { + "start": 157062500, + "end": 157087500, + "type": "marine1", + "name": "81" + }, + { + "start": 157087500, + "end": 157112500, + "type": "marine", + "name": "22" + }, + { + "start": 157112500, + "end": 157137500, + "type": "marine1", + "name": "82" + }, + { + "start": 157137500, + "end": 157162500, + "type": "marine", + "name": "23" + }, + { + "start": 157162500, + "end": 157187500, + "type": "marine1", + "name": "83" + }, + { + "start": 157187500, + "end": 157212500, + "type": "marine", + "name": "24" + }, + { + "start": 157212500, + "end": 157237500, + "type": "marine1", + "name": "84" + }, + { + "start": 157237500, + "end": 157262500, + "type": "marine", + "name": "25" + }, + { + "start": 157262500, + "end": 157287500, + "type": "marine1", + "name": "85" + }, + { + "start": 157287500, + "end": 157312500, + "type": "marine", + "name": "26" + }, + { + "start": 157312500, + "end": 157337500, + "type": "marine1", + "name": "86" + }, + { + "start": 157337500, + "end": 157362500, + "type": "marine", + "name": "27" + }, + { + "start": 157362500, + "end": 157387500, + "type": "marine1", + "name": "87 (Splx)" + }, + { + "start": 157387500, + "end": 157412500, + "type": "marine", + "name": "28" + }, + { + "start": 157412500, + "end": 157437500, + "type": "marine1", + "name": "88 (Splx)" + }, + { + "start": 157437500, + "end": 160587500, + "type": "marine1", + "name": "Marine" + }, + { + "start": 160587500, + "end": 160612500, + "type": "marine", + "name": "Marine VHF Ch. 0 (Coast Stations)" + }, + { + "start": 160612500, + "end": 160637500, + "type": "marine1", + "name": "60" + }, + { + "start": 160637500, + "end": 160662500, + "type": "marine", + "name": "1" + }, + { + "start": 160662500, + "end": 160687500, + "type": "marine1", + "name": "61" + }, + { + "start": 160687500, + "end": 160712500, + "type": "marine", + "name": "2" + }, + { + "start": 160712500, + "end": 160737500, + "type": "marine1", + "name": "62" + }, + { + "start": 160737500, + "end": 160762500, + "type": "marine", + "name": "3" + }, + { + "start": 160762500, + "end": 160787500, + "type": "marine1", + "name": "63" + }, + { + "start": 160787500, + "end": 160812500, + "type": "marine", + "name": "4" + }, + { + "start": 160812500, + "end": 160837500, + "type": "marine1", + "name": "64" + }, + { + "start": 160837500, + "end": 160862500, + "type": "marine", + "name": "5" + }, + { + "start": 160862500, + "end": 160887500, + "type": "marine1", + "name": "65" + }, + { + "start": 160887500, + "end": 160912500, + "type": "marine", + "name": "Marine" + }, + { + "start": 160912500, + "end": 160937500, + "type": "marine1", + "name": "66" + }, + { + "start": 160937500, + "end": 160962500, + "type": "marine", + "name": "7" + }, + { + "start": 161487500, + "end": 161512500, + "type": "marine1", + "name": "18" + }, + { + "start": 161512500, + "end": 161537500, + "type": "marine", + "name": "78" + }, + { + "start": 161537500, + "end": 161562500, + "type": "marine1", + "name": "19" + }, + { + "start": 161562500, + "end": 161587500, + "type": "marine", + "name": "79" + }, + { + "start": 161587500, + "end": 161612500, + "type": "marine1", + "name": "20" + }, + { + "start": 161612500, + "end": 161637500, + "type": "marine", + "name": "80" + }, + { + "start": 161637500, + "end": 161662500, + "type": "marine1", + "name": "21" + }, + { + "start": 161662500, + "end": 161687500, + "type": "marine", + "name": "81" + }, + { + "start": 161687500, + "end": 161712500, + "type": "marine1", + "name": "22" + }, + { + "start": 161712500, + "end": 161737500, + "type": "marine", + "name": "82" + }, + { + "start": 161737500, + "end": 161762500, + "type": "marine1", + "name": "23" + }, + { + "start": 161762500, + "end": 161787500, + "type": "marine", + "name": "83" + }, + { + "start": 161787500, + "end": 161812500, + "type": "marine1", + "name": "24" + }, + { + "start": 161812500, + "end": 161837500, + "type": "marine", + "name": "84" + }, + { + "start": 161837500, + "end": 161862500, + "type": "marine1", + "name": "25" + }, + { + "start": 161862500, + "end": 161887500, + "type": "marine", + "name": "85" + }, + { + "start": 161887500, + "end": 161912500, + "type": "marine1", + "name": "26" + }, + { + "start": 161912500, + "end": 161937500, + "type": "marine", + "name": "86" + }, + { + "start": 161937500, + "end": 161962500, + "type": "marine1", + "name": "27" + }, + { + "start": 161962500, + "end": 161987500, + "type": "marine", + "name": "AIS Ch. A (87B)" + }, + { + "start": 161987500, + "end": 162012500, + "type": "marine1", + "name": "88B/ 28" + }, + { + "start": 162012500, + "end": 162037500, + "type": "marine", + "name": "AIS Ch. B" + }, + { + "start": 162037500, + "end": 162137500, + "type": "marine1", + "name": "Marine" + }, + { + "start": 162137500, + "end": 162162500, + "type": "marine", + "name": "31" + }, + { + "start": 162162500, + "end": 174000000, + "type": "marine1", + "name": "Fixed Mobile/ Marine" + }, + { + "start": 174000000, + "end": 216000000, + "type": "broadcast", + "name": "Television VHF" + }, + { + "start": 216000000, + "end": 223000000, + "type": "aviation", + "name": "Radiolocation/ Television VHF" + }, + { + "start": 400050000, + "end": 400150000, + "type": "utility", + "name": "Standard Frequency and Time Signal-Satellite Service" + }, + { + "start": 400150000, + "end": 401000000, + "type": "satellite", + "name": "(NVNG)/ Mobile Satellite Service (MSS)" + }, + { + "start": 401000000, + "end": 403000000, + "type": "satellite1", + "name": "Earth Exploration Satellite" + }, + { + "start": 406000000, + "end": 406100000, + "type": "aviation", + "name": "Distress Beacons (S and RSAT| NOAAs 15, 18, 19)" + }, + { + "start": 406100000, + "end": 410000000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 430000000, + "end": 433050000, + "type": "amateur", + "name": "|70cm Ham Band" + }, + { + "start": 433050000, + "end": 434790000, + "type": "utility", + "name": "Shared 70cm Ham and 70cm ISM" + }, + { + "start": 434790000, + "end": 435172000, + "type": "amateur", + "name": "70cm Ham Band" + }, + { + "start": 435172000, + "end": 435192000, + "type": "amateur1", + "name": "AO-85 Uplink" + }, + { + "start": 435192000, + "end": 435240000, + "type": "amateur", + "name": "Satellite" + }, + { + "start": 435240000, + "end": 435260000, + "type": "amateur1", + "name": "AO-91 Uplink" + }, + { + "start": 435260000, + "end": 435340000, + "type": "amateur", + "name": "Satellite" + }, + { + "start": 435340000, + "end": 435360000, + "type": "satellite1", + "name": "AO-92 Uplink" + }, + { + "start": 435360000, + "end": 436785000, + "type": "satellite", + "name": "Satellite" + }, + { + "start": 436785000, + "end": 436805000, + "type": "satellite1", + "name": "SO-50 Downlink" + }, + { + "start": 436805000, + "end": 437490000, + "type": "satellite", + "name": "Satellite" + }, + { + "start": 437490000, + "end": 437510000, + "type": "satellite1", + "name": "PO-101 Uplink" + }, + { + "start": 437510000, + "end": 437540000, + "type": "satellite", + "name": "Satellite" + }, + { + "start": 437540000, + "end": 437560000, + "type": "satellite1", + "name": "ISS UHF Packet U/D" + }, + { + "start": 437560000, + "end": 437790000, + "type": "satellite", + "name": "Satellite" + }, + { + "start": 437790000, + "end": 437810000, + "type": "satellite1", + "name": "ISS U/V Repeater Downlink" + }, + { + "start": 437810000, + "end": 438000000, + "type": "satellite", + "name": "Satellite" + }, + { + "start": 438000000, + "end": 440000000, + "type": "amateur", + "name": "70cm Ham Band|" + }, + { + "start": 446000000, + "end": 446012500, + "type": "utility", + "name": "PMR446 Ch. 1" + }, + { + "start": 446012500, + "end": 446025000, + "type": "utility1", + "name": "2" + }, + { + "start": 446025000, + "end": 446037500, + "type": "utility", + "name": "3" + }, + { + "start": 446037500, + "end": 446050000, + "type": "utility1", + "name": "4" + }, + { + "start": 446050000, + "end": 446062500, + "type": "utility", + "name": "5" + }, + { + "start": 446062500, + "end": 446075000, + "type": "utility1", + "name": "6" + }, + { + "start": 446075000, + "end": 446087500, + "type": "utility", + "name": "7" + }, + { + "start": 446087500, + "end": 446100000, + "type": "utility1", + "name": "8" + }, + { + "start": 446100000, + "end": 446112500, + "type": "utility", + "name": "9" + }, + { + "start": 446112500, + "end": 446125000, + "type": "utility1", + "name": "10" + }, + { + "start": 446125000, + "end": 446137500, + "type": "utility", + "name": "11" + }, + { + "start": 446137500, + "end": 446150000, + "type": "utility1", + "name": "12" + }, + { + "start": 446150000, + "end": 446162500, + "type": "utility", + "name": "13" + }, + { + "start": 446162500, + "end": 446175000, + "type": "utility1", + "name": "14" + }, + { + "start": 446175000, + "end": 446187500, + "type": "utility", + "name": "15" + }, + { + "start": 446187500, + "end": 446200000, + "type": "utility1", + "name": "PMR446 Ch. 16" + }, + { + "start": 465986500, + "end": 465988500, + "type": "satellite", + "name": "Metops' DCP configuration control" + }, + { + "start": 470000000, + "end": 608000000, + "type": "broadcast", + "name": "Television UHF" + }, + { + "start": 608000000, + "end": 614000000, + "type": "utility", + "name": "Radio Astronomy (Ch.37)" + }, + { + "start": 614000000, + "end": 806000000, + "type": "broadcast", + "name": "Television UHF" + }, + { + "start": 902000000, + "end": 928000000, + "type": "utility", + "name": "33cm ISM" + }, + { + "start": 960000000, + "end": 977300000, + "type": "aviation", + "name": "Aviation" + }, + { + "start": 977300000, + "end": 978700000, + "type": "aviation", + "name": "ADSB 978" + }, + { + "start": 978700000, + "end": 1089950000, + "type": "aviation", + "name": "Aviation" + }, + { + "start": 1089950000, + "end": 1090050000, + "type": "aviation", + "name": "ADSB" + }, + { + "start": 1090050000, + "end": 1164000000, + "type": "aviation", + "name": "Aviation" + }, + { + "start": 1164000000, + "end": 1189000000, + "type": "satellite", + "name": "GPS L5 and GALILEO E5a" + }, + { + "start": 1189000000, + "end": 1214000000, + "type": "satellite1", + "name": "GALILEO E5a and GLONASS G3" + }, + { + "start": 1214000000, + "end": 1215000000, + "type": "satellite", + "name": "Radionavigation Satellite Service" + }, + { + "start": 1215000000, + "end": 1237000000, + "type": "satellite1", + "name": "GPS L2" + }, + { + "start": 1237000000, + "end": 1239600000, + "type": "satellite", + "name": "GPS L2 and GLONASS G2" + }, + { + "start": 1239600000, + "end": 1240000000, + "type": "satellite1", + "name": "GLONASS G2" + }, + { + "start": 1240000000, + "end": 1267346500, + "type": "amateur", + "name": "|23cm Ham Band" + }, + { + "start": 1267346500, + "end": 1267371500, + "type": "satellite", + "name": "AO-92 Uplink" + }, + { + "start": 1267371500, + "end": 1295800000, + "type": "amateur", + "name": "23cm Ham Band" + }, + { + "start": 1295800000, + "end": 1296080000, + "type": "amateur1", + "name": "EME" + }, + { + "start": 1296080000, + "end": 1300000000, + "type": "amateur", + "name": "23cm Ham Band|" + }, + { + "start": 1390000000, + "end": 1395000000, + "type": "utility", + "name": "Radio Astronomy (1390 - 1395 MHz Band)" + }, + { + "start": 1400000000, + "end": 1420404750, + "type": "satellite", + "name": "Earth Exploration-Satellite/ Radio Astronomy" + }, + { + "start": 1420404750, + "end": 1420406750, + "type": "utility", + "name": "Hygrogen Line" + }, + { + "start": 1420406750, + "end": 1427000000, + "type": "satellite", + "name": "Earth Exploration-Satellite/ Radio Astronomy" + }, + { + "start": 1525000000, + "end": 1544000000, + "type": "satellite", + "name": "Inmarsat Satellites" + }, + { + "start": 1544000000, + "end": 1545000000, + "type": "satellite", + "name": "GALILEO SAR Downlink" + }, + { + "start": 1545000000, + "end": 1559000000, + "type": "satellite1", + "name": "Inmarsat Satellites" + }, + { + "start": 1559000000, + "end": 1563000000, + "type": "satellite", + "name": "GALILEO E1" + }, + { + "start": 1563000000, + "end": 1587000000, + "type": "satellite1", + "name": "GPS L1 and GALILEO E1" + }, + { + "start": 1587000000, + "end": 1591000000, + "type": "satellite", + "name": "GALILEO E1" + }, + { + "start": 1591000000, + "end": 1593000000, + "type": "satellite1", + "name": "Radionavigation Satellite Service" + }, + { + "start": 1593000000, + "end": 1610000000, + "type": "satellite", + "name": "GLONASS G1" + }, + { + "start": 1610000000, + "end": 1610600000, + "type": "aviation", + "name": "Aviation Service, and the Mobile Satellite Service (MSS)" + }, + { + "start": 1610600000, + "end": 1616000000, + "type": "satellite", + "name": "Mobile Satellite Service (MSS)" + }, + { + "start": 1616000000, + "end": 1626000833, + "type": "satellite1", + "name": "Iridium Satellites" + }, + { + "start": 1626000833, + "end": 1626040833, + "type": "satellite", + "name": "Ch.1 Guard Channel (Iridium)" + }, + { + "start": 1626042500, + "end": 1626082500, + "type": "satellite1", + "name": "2 Guard Channel" + }, + { + "start": 1626084167, + "end": 1626124167, + "type": "satellite", + "name": "3 Quaternary Messaging" + }, + { + "start": 1626125833, + "end": 1626165833, + "type": "satellite1", + "name": "4 Tertiary Messaging" + }, + { + "start": 1626167500, + "end": 1626207500, + "type": "satellite", + "name": "5 Guard Channel" + }, + { + "start": 1626209167, + "end": 1626249167, + "type": "satellite1", + "name": "6 Guard Channel" + }, + { + "start": 1626250833, + "end": 1626290833, + "type": "satellite", + "name": "7 Ring Alert" + }, + { + "start": 1626292500, + "end": 1626332500, + "type": "satellite1", + "name": "8 Guard Channel" + }, + { + "start": 1626334167, + "end": 1626374167, + "type": "satellite", + "name": "9 Guard Channel" + }, + { + "start": 1626375833, + "end": 1626415833, + "type": "satellite1", + "name": "10 Secondary Messaging" + }, + { + "start": 1626417500, + "end": 1626457500, + "type": "satellite", + "name": "11 Primary Messaging" + }, + { + "start": 1626459167, + "end": 1626499167, + "type": "satellite1", + "name": "12 Guard Channel |Iridium" + }, + { + "start": 1626500000, + "end": 1660500000, + "type": "satellite", + "name": "Inmarsat Satellites" + }, + { + "start": 1660500000, + "end": 1668400000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 1668400000, + "end": 1670000000, + "type": "utility", + "name": "Meteorological Aids and Radio Astronomy" + }, + { + "start": 1670000000, + "end": 1675000000, + "type": "satellite", + "name": "Government Use Meteorological-Satellite" + }, + { + "start": 1675000000, + "end": 1696500000, + "type": "satellite1", + "name": "Meteorological Satellite" + }, + { + "start": 1696500000, + "end": 1697750000, + "type": "satellite", + "name": "HRPT Shared" + }, + { + "start": 1697750000, + "end": 1698250000, + "type": "satellite1", + "name": "NOAA-19 Center" + }, + { + "start": 1698250000, + "end": 1699750000, + "type": "satellite", + "name": "Shared" + }, + { + "start": 1699750000, + "end": 1700250000, + "type": "satellite1", + "name": "METEOR M2 Center" + }, + { + "start": 1700250000, + "end": 1701050000, + "type": "satellite", + "name": "Shared" + }, + { + "start": 1701050000, + "end": 1701550000, + "type": "satellite1", + "name": "Metop-A, Metop-B, FY-3C Center" + }, + { + "start": 1701550000, + "end": 1702250000, + "type": "satellite", + "name": "Shared" + }, + { + "start": 1702250000, + "end": 1702750000, + "type": "satellite1", + "name": "NOAA-15 Center" + }, + { + "start": 1702750000, + "end": 1704250000, + "type": "satellite", + "name": "Shared" + }, + { + "start": 1704250000, + "end": 1704750000, + "type": "satellite1", + "name": "FY-3A, FY-3B Center" + }, + { + "start": 1704750000, + "end": 1705250000, + "type": "satellite", + "name": "METEOR M2-2 Center" + }, + { + "start": 1705250000, + "end": 1706750000, + "type": "satellite1", + "name": "Shared" + }, + { + "start": 1706750000, + "end": 1707250000, + "type": "satellite", + "name": "NOAA-18, Metop-C Center" + }, + { + "start": 1707250000, + "end": 1708500000, + "type": "satellite1", + "name": "HRPT Shared" + }, + { + "start": 1708500000, + "end": 1710000000, + "type": "satellite", + "name": "Meteorological Satellite" + }, + { + "start": 2025000000, + "end": 2110000000, + "type": "satellite1", + "name": "Earth-to-Space and Space-to-Space Communications" + }, + { + "start": 2290000000, + "end": 2300000000, + "type": "utility", + "name": "Radio Astronomy" + }, + { + "start": 2300000000, + "end": 2310000000, + "type": "amateur", + "name": "|13cm Ham Band" + }, + { + "start": 2320000000, + "end": 2332500000, + "type": "satellite", + "name": "Satellite Digital Audio Radio Service (SDARS)" + }, + { + "start": 2332500000, + "end": 2345000000, + "type": "satellite", + "name": "SiriusXM Satellites" + }, + { + "start": 2345000000, + "end": 2360000000, + "type": "aviation", + "name": "Aviation Service and the Wireless Communications Service (WCS)" + }, + { + "start": 2360000000, + "end": 2390000000, + "type": "aviation", + "name": "Aviation" + }, + { + "start": 2390000000, + "end": 2393750000, + "type": "amateur", + "name": "13cm Ham Band (Upper)| Analog and Digital" + }, + { + "start": 2393750000, + "end": 2394750000, + "type": "amateur1", + "name": "Experimental" + }, + { + "start": 2394750000, + "end": 2400000000, + "type": "amateur", + "name": "Analog and Digital 13 cm HAM Band|" + }, + { + "start": 2400000000, + "end": 2401000000, + "type": "utility", + "name": "Shared Satellite and 13cm ISM" + }, + { + "start": 2401000000, + "end": 2410000000, + "type": "utility", + "name": "WiFi shared with Satellite and 13cm ISM" + }, + { + "start": 2410000000, + "end": 2411900000, + "type": "utility", + "name": "WiFi shared with Broadband Modes and 13cm ISM" + }, + { + "start": 2411900000, + "end": 2412100000, + "type": "utility", + "name": "WiFi Ch. 1 (Center)" + }, + { + "start": 2412100000, + "end": 2450000000, + "type": "utility", + "name": "WiFi shared with Broadband Modes 13cm ISM |13cm Ham Band" + }, + { + "start": 2450000000, + "end": 2451900000, + "type": "utility", + "name": "WiFi shared with ISM Band (13cm)" + }, + { + "start": 2451900000, + "end": 2452100000, + "type": "utility", + "name": "WiFi Ch. 9" + }, + { + "start": 2452100000, + "end": 2456900000, + "type": "utility", + "name": "WiFi shared with ISM Band (13cm)" + }, + { + "start": 2456900000, + "end": 2457100000, + "type": "utility", + "name": "WiFi Ch. 10" + }, + { + "start": 2457100000, + "end": 2461900000, + "type": "utility", + "name": "WiFi shared with ISM Band (13cm)" + }, + { + "start": 2461900000, + "end": 2462100000, + "type": "utility", + "name": "WiFi Ch. 11" + }, + { + "start": 2462100000, + "end": 2473000000, + "type": "utility", + "name": "WiFi shared with ISM Band (13cm)" + }, + { + "start": 2473000000, + "end": 2500000000, + "type": "utility", + "name": "ISM Band (13cm)" + } + ] +} \ No newline at end of file From 55ddd383d2f9c46463fb1bf4e6567855928a335d Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Fri, 29 Sep 2023 14:42:45 +0200 Subject: [PATCH 19/28] Fix #1199 --- core/src/module_com.cpp | 10 +++++----- core/src/module_com.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/module_com.cpp b/core/src/module_com.cpp index 7c721753..ae3a9ae7 100644 --- a/core/src/module_com.cpp +++ b/core/src/module_com.cpp @@ -2,7 +2,7 @@ #include bool ModuleComManager::registerInterface(std::string moduleName, std::string name, void (*handler)(int code, void* in, void* out, void* ctx), void* ctx) { - std::lock_guard lck(mtx); + std::lock_guard lck(mtx); if (interfaces.find(name) != interfaces.end()) { flog::error("Tried creating module interface with an existing name: {0}", name); return false; @@ -16,7 +16,7 @@ bool ModuleComManager::registerInterface(std::string moduleName, std::string nam } bool ModuleComManager::unregisterInterface(std::string name) { - std::lock_guard lck(mtx); + std::lock_guard lck(mtx); if (interfaces.find(name) == interfaces.end()) { flog::error("Tried to erase module interface with unknown name: {0}", name); return false; @@ -26,13 +26,13 @@ bool ModuleComManager::unregisterInterface(std::string name) { } bool ModuleComManager::interfaceExists(std::string name) { - std::lock_guard lck(mtx); + std::lock_guard lck(mtx); if (interfaces.find(name) == interfaces.end()) { return false; } return true; } std::string ModuleComManager::getModuleName(std::string name) { - std::lock_guard lck(mtx); + std::lock_guard lck(mtx); if (interfaces.find(name) == interfaces.end()) { flog::error("Tried to call unknown module interface: {0}", name); return ""; @@ -41,7 +41,7 @@ std::string ModuleComManager::getModuleName(std::string name) { } bool ModuleComManager::callInterface(std::string name, int code, void* in, void* out) { - std::lock_guard lck(mtx); + std::lock_guard lck(mtx); if (interfaces.find(name) == interfaces.end()) { flog::error("Tried to call unknown module interface: {0}", name); return false; diff --git a/core/src/module_com.h b/core/src/module_com.h index 7d6dd5bd..b3b6d16c 100644 --- a/core/src/module_com.h +++ b/core/src/module_com.h @@ -18,6 +18,6 @@ public: bool callInterface(std::string name, int code, void* in, void* out); private: - std::mutex mtx; + std::recursive_mutex mtx; std::map interfaces; }; \ No newline at end of file From 4b3b6976d627ba39bcb80b86adcfdacea742679e Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Fri, 29 Sep 2023 14:52:30 +0200 Subject: [PATCH 20/28] removed rpi install script since it is not to be used --- rpi_install.sh | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 rpi_install.sh diff --git a/rpi_install.sh b/rpi_install.sh deleted file mode 100644 index 51bf74d1..00000000 --- a/rpi_install.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -set -e - -[ $(id -u) = 0 ] && echo "Please do not run this script as root" && exit 100 - -echo "Installing dependencies" -sudo apt update -sudo apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ - libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget - -echo "Preparing build" -mkdir -p build -cd build -cmake .. -DOPT_BUILD_LIMESDR_SOURCE=ON - -echo "Building" -make - -echo "Installing" -sudo make install - -echo "Done!" From 5bf989f49dcad911162f7970e69602c9ce7d8925 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Fri, 29 Sep 2023 15:35:48 +0200 Subject: [PATCH 21/28] fixed android build --- core/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 59d38fc3..f194d7ae 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -108,7 +108,6 @@ elseif (ANDROID) ) target_link_libraries(sdrpp_core PUBLIC - /sdr-kit/${ANDROID_ABI}/lib/libcpu_features.a /sdr-kit/${ANDROID_ABI}/lib/libvolk.so /sdr-kit/${ANDROID_ABI}/lib/libfftw3f.so /sdr-kit/${ANDROID_ABI}/lib/libzstd.so From d10d420467799f45b6942246fc0690b12bda7387 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 2 Oct 2023 23:57:06 +0200 Subject: [PATCH 22/28] added MacOS M1 CI --- .github/workflows/build_all.yml | 57 ++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 293ab251..f4eaf298 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -137,6 +137,60 @@ jobs: with: name: sdrpp_macos_intel path: ${{runner.workspace}}/sdrpp_macos_intel.zip + + build_macos_arm: + runs-on: macos-latest-xlarge + + steps: + - uses: actions/checkout@v3 + + - name: Create Build Environment + run: cmake -E make_directory ${{runner.workspace}}/build + + - name: Update brew repositories + run: brew update + + - name: Install dependencies + run: brew install pkg-config libusb fftw glfw airspy airspyhf portaudio hackrf libbladerf codec2 zstd autoconf automake libtool && pip3 install mako + + - name: Install volk + run: git clone --recursive https://github.com/gnuradio/volk && cd volk && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ + + - name: Install SDRplay API + run: wget https://www.sdrplay.com/software/SDRplay_RSP_API-MacOSX-3.07.3.pkg && sudo installer -pkg SDRplay_RSP_API-MacOSX-3.07.3.pkg -target / + + - name: Install libiio + run: wget https://github.com/analogdevicesinc/libiio/archive/refs/tags/v0.25.zip && 7z x v0.25.zip && cd libiio-0.25 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ + + - name: Install libad9361 + run: git clone https://github.com/analogdevicesinc/libad9361-iio && cd libad9361-iio && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ + + - name: Install LimeSuite + run: git clone https://github.com/myriadrf/LimeSuite && cd LimeSuite && mkdir builddir && cd builddir && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ + + - name: Install libperseus + run: git clone https://github.com/Microtelecom/libperseus-sdr && cd libperseus-sdr && autoreconf -i && ./configure --prefix=/usr/local && make && make install && cd .. + + - name: Install more recent librtlsdr + run: git clone https://github.com/osmocom/rtl-sdr && cd rtl-sdr && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 LIBRARY_PATH=$(pkg-config --libs-only-L libusb-1.0 | sed 's/\-L//') && sudo make install && cd ../../ + + - name: Prepare CMake + working-directory: ${{runner.workspace}}/build + run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON -DOPT_BUILD_AUDIO_SOURCE=OFF -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release + + - name: Build + working-directory: ${{runner.workspace}}/build + run: make VERBOSE=1 -j6 + + - name: Create Archive + working-directory: ${{runner.workspace}} + run: cd $GITHUB_WORKSPACE && sh make_macos_bundle.sh ${{runner.workspace}}/build ./SDR++.app && zip -r ${{runner.workspace}}/sdrpp_macos_arm.zip SDR++.app + + - name: Save Archive + uses: actions/upload-artifact@v3 + with: + name: sdrpp_macos_arm + path: ${{runner.workspace}}/sdrpp_macos_arm.zip build_debian_buster: runs-on: ubuntu-latest @@ -325,7 +379,7 @@ jobs: path: ${{runner.workspace}}/sdrpp.apk create_full_archive: - needs: ['build_windows', 'build_macos', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_bookworm', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] + needs: ['build_windows', 'build_macos', 'build_macos_arm', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_bookworm', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] runs-on: ubuntu-latest steps: @@ -337,6 +391,7 @@ jobs: mkdir sdrpp_all && mv sdrpp_windows_x64/sdrpp_windows_x64.zip sdrpp_all/ && mv sdrpp_macos_intel/sdrpp_macos_intel.zip sdrpp_all/ && + mv sdrpp_macos_intel/sdrpp_macos_arm.zip sdrpp_all/ && mv sdrpp_debian_buster_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_buster_amd64.deb && mv sdrpp_debian_bullseye_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bullseye_amd64.deb && mv sdrpp_debian_bookworm_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bookworm_amd64.deb && From ec086ebbdf035e3ebcb111acaf51f4a8c4f90d23 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 9 Oct 2023 22:42:07 +0200 Subject: [PATCH 23/28] attempt at fixing M1 ci --- .github/workflows/build_all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index f4eaf298..2cc6136d 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -139,7 +139,7 @@ jobs: path: ${{runner.workspace}}/sdrpp_macos_intel.zip build_macos_arm: - runs-on: macos-latest-xlarge + runs-on: macos-13-xlarge steps: - uses: actions/checkout@v3 From 7c5d4226eb2ba103e17b4631e4e98dec982a6ffc Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 9 Oct 2023 22:43:39 +0200 Subject: [PATCH 24/28] removed MacOS CI since it required payment (ew...) --- .github/workflows/build_all.yml | 79 +-------------------------------- 1 file changed, 1 insertion(+), 78 deletions(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 2cc6136d..25ca8294 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -138,82 +138,6 @@ jobs: name: sdrpp_macos_intel path: ${{runner.workspace}}/sdrpp_macos_intel.zip - build_macos_arm: - runs-on: macos-13-xlarge - - steps: - - uses: actions/checkout@v3 - - - name: Create Build Environment - run: cmake -E make_directory ${{runner.workspace}}/build - - - name: Update brew repositories - run: brew update - - - name: Install dependencies - run: brew install pkg-config libusb fftw glfw airspy airspyhf portaudio hackrf libbladerf codec2 zstd autoconf automake libtool && pip3 install mako - - - name: Install volk - run: git clone --recursive https://github.com/gnuradio/volk && cd volk && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ - - - name: Install SDRplay API - run: wget https://www.sdrplay.com/software/SDRplay_RSP_API-MacOSX-3.07.3.pkg && sudo installer -pkg SDRplay_RSP_API-MacOSX-3.07.3.pkg -target / - - - name: Install libiio - run: wget https://github.com/analogdevicesinc/libiio/archive/refs/tags/v0.25.zip && 7z x v0.25.zip && cd libiio-0.25 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ - - - name: Install libad9361 - run: git clone https://github.com/analogdevicesinc/libad9361-iio && cd libad9361-iio && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ - - - name: Install LimeSuite - run: git clone https://github.com/myriadrf/LimeSuite && cd LimeSuite && mkdir builddir && cd builddir && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 && sudo make install && cd ../../ - - - name: Install libperseus - run: git clone https://github.com/Microtelecom/libperseus-sdr && cd libperseus-sdr && autoreconf -i && ./configure --prefix=/usr/local && make && make install && cd .. - - - name: Install more recent librtlsdr - run: git clone https://github.com/osmocom/rtl-sdr && cd rtl-sdr && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j6 LIBRARY_PATH=$(pkg-config --libs-only-L libusb-1.0 | sed 's/\-L//') && sudo make install && cd ../../ - - - name: Prepare CMake - working-directory: ${{runner.workspace}}/build - run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_PERSEUS_SOURCE=ON -DOPT_BUILD_AUDIO_SOURCE=OFF -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release - - - name: Build - working-directory: ${{runner.workspace}}/build - run: make VERBOSE=1 -j6 - - - name: Create Archive - working-directory: ${{runner.workspace}} - run: cd $GITHUB_WORKSPACE && sh make_macos_bundle.sh ${{runner.workspace}}/build ./SDR++.app && zip -r ${{runner.workspace}}/sdrpp_macos_arm.zip SDR++.app - - - name: Save Archive - uses: actions/upload-artifact@v3 - with: - name: sdrpp_macos_arm - path: ${{runner.workspace}}/sdrpp_macos_arm.zip - - build_debian_buster: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Create Docker Image - run: cd $GITHUB_WORKSPACE/docker_builds/debian_buster && docker build . --tag sdrpp_build - - - name: Run Container - run: docker run --name build -v $GITHUB_WORKSPACE:/root/SDRPlusPlus --env BUILD_NO="-$GITHUB_RUN_NUMBER" sdrpp_build /root/do_build.sh - - - name: Recover Deb Archive - working-directory: ${{runner.workspace}} - run: docker cp build:/root/SDRPlusPlus/sdrpp_debian_amd64.deb ./ - - - name: Save Deb Archive - uses: actions/upload-artifact@v3 - with: - name: sdrpp_debian_buster_amd64 - path: ${{runner.workspace}}/sdrpp_debian_amd64.deb - build_debian_bullseye: runs-on: ubuntu-latest @@ -379,7 +303,7 @@ jobs: path: ${{runner.workspace}}/sdrpp.apk create_full_archive: - needs: ['build_windows', 'build_macos', 'build_macos_arm', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_bookworm', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] + needs: ['build_windows', 'build_macos', 'build_debian_buster', 'build_debian_bullseye', 'build_debian_bookworm', 'build_debian_sid', 'build_ubuntu_focal', 'build_ubuntu_jammy', 'build_raspios_bullseye_armhf', 'build_android'] runs-on: ubuntu-latest steps: @@ -391,7 +315,6 @@ jobs: mkdir sdrpp_all && mv sdrpp_windows_x64/sdrpp_windows_x64.zip sdrpp_all/ && mv sdrpp_macos_intel/sdrpp_macos_intel.zip sdrpp_all/ && - mv sdrpp_macos_intel/sdrpp_macos_arm.zip sdrpp_all/ && mv sdrpp_debian_buster_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_buster_amd64.deb && mv sdrpp_debian_bullseye_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bullseye_amd64.deb && mv sdrpp_debian_bookworm_amd64/sdrpp_debian_amd64.deb sdrpp_all/sdrpp_debian_bookworm_amd64.deb && From 5f297b1a6948c9cb65ede737b05295169be14e7a Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Tue, 10 Oct 2023 15:21:55 +0200 Subject: [PATCH 25/28] undid the oopsie --- .github/workflows/build_all.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 25ca8294..849d0d55 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -138,6 +138,28 @@ jobs: name: sdrpp_macos_intel path: ${{runner.workspace}}/sdrpp_macos_intel.zip + build_debian_buster: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Create Docker Image + run: cd $GITHUB_WORKSPACE/docker_builds/debian_buster && docker build . --tag sdrpp_build + + - name: Run Container + run: docker run --name build -v $GITHUB_WORKSPACE:/root/SDRPlusPlus --env BUILD_NO="-$GITHUB_RUN_NUMBER" sdrpp_build /root/do_build.sh + + - name: Recover Deb Archive + working-directory: ${{runner.workspace}} + run: docker cp build:/root/SDRPlusPlus/sdrpp_debian_amd64.deb ./ + + - name: Save Deb Archive + uses: actions/upload-artifact@v3 + with: + name: sdrpp_debian_buster_amd64 + path: ${{runner.workspace}}/sdrpp_debian_amd64.deb + build_debian_bullseye: runs-on: ubuntu-latest From 78daed7879d3ff785bc5c4f70dbc7fc6b961bd94 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Wed, 11 Oct 2023 21:50:23 +0200 Subject: [PATCH 26/28] Implemented #1205 --- core/src/gui/main_window.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/gui/main_window.cpp b/core/src/gui/main_window.cpp index 93e90469..8c90ebd6 100644 --- a/core/src/gui/main_window.cpp +++ b/core/src/gui/main_window.cpp @@ -574,10 +574,22 @@ void MainWindow::draw() { // Handle scrollwheel int wheel = ImGui::GetIO().MouseWheel; if (wheel != 0 && (gui::waterfall.mouseInFFT || gui::waterfall.mouseInWaterfall)) { + // Select factor depending on modifier keys + double interval; + if (ImGui::IsKeyDown(ImGuiKey_LeftShift)) { + interval = vfo->snapInterval * 10.0; + } + else if (ImGui::IsKeyDown(ImGuiKey_LeftAlt)) { + interval = vfo->snapInterval * 0.1; + } + else { + interval = vfo->snapInterval; + } + double nfreq; if (vfo != NULL) { - nfreq = gui::waterfall.getCenterFrequency() + vfo->generalOffset + (vfo->snapInterval * wheel); - nfreq = roundl(nfreq / vfo->snapInterval) * vfo->snapInterval; + nfreq = gui::waterfall.getCenterFrequency() + vfo->generalOffset + (interval * wheel); + nfreq = roundl(nfreq / interval) * interval; } else { nfreq = gui::waterfall.getCenterFrequency() - (gui::waterfall.getViewBandwidth() * wheel / 20.0); From 4803271115a07f5665c1562cb8cb55171c57474d Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Sun, 29 Oct 2023 02:27:19 +0100 Subject: [PATCH 27/28] fix #1212 --- core/src/utils/riff.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/utils/riff.cpp b/core/src/utils/riff.cpp index 9074badc..479a141a 100644 --- a/core/src/utils/riff.cpp +++ b/core/src/utils/riff.cpp @@ -91,9 +91,9 @@ namespace riff { file.write((char*)&desc.hdr.size, sizeof(desc.hdr.size)); file.seekp(pos); - // If parent chunk, increment its size + // If parent chunk, increment its size by the size of the subchunk (adding the size of its header) if (!chunks.empty()) { - chunks.top().hdr.size += desc.hdr.size; + chunks.top().hdr.size += desc.hdr.size + 8; } } From 794d6ff5acf66d5da7fb7fceba7b952c95305960 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Sun, 29 Oct 2023 02:40:34 +0100 Subject: [PATCH 28/28] clean up --- core/src/utils/riff.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/utils/riff.cpp b/core/src/utils/riff.cpp index 479a141a..055a7f9e 100644 --- a/core/src/utils/riff.cpp +++ b/core/src/utils/riff.cpp @@ -91,9 +91,9 @@ namespace riff { file.write((char*)&desc.hdr.size, sizeof(desc.hdr.size)); file.seekp(pos); - // If parent chunk, increment its size by the size of the subchunk (adding the size of its header) + // If parent chunk, increment its size by the size of the sub-chunk plus the size of its header) if (!chunks.empty()) { - chunks.top().hdr.size += desc.hdr.size + 8; + chunks.top().hdr.size += desc.hdr.size + sizeof(ChunkHeader); } }