mirror of
				https://github.com/AlexandreRouma/SDRPlusPlus.git
				synced 2025-11-03 18:29:11 +01:00 
			
		
		
		
	bunch of bugfix and new features
This commit is contained in:
		
							
								
								
									
										8
									
								
								.github/workflows/build_all.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/build_all.yml
									
									
									
									
										vendored
									
									
								
							@@ -51,14 +51,14 @@ jobs:
 | 
			
		||||
          run: mkdir "C:/Program Files/codec2" ; mkdir "C:/Program Files/codec2/include" ; mkdir "C:/Program Files/codec2/include/codec2" ; mkdir "C:/Program Files/codec2/lib" ; cd "codec2" ; xcopy "src" "C:/Program Files/codec2/include" ; cd "build" ; xcopy "src" "C:/Program Files/codec2/lib" ; xcopy "codec2" "C:/Program Files/codec2/include/codec2"
 | 
			
		||||
 | 
			
		||||
        - name: Install vcpkg dependencies
 | 
			
		||||
          run: vcpkg install fftw3:x64-windows glfw3:x64-windows portaudio:x64-windows zstd:x64-windows boost:x64-windows boost-config:x64-windows
 | 
			
		||||
          run: vcpkg install fftw3:x64-windows glfw3:x64-windows portaudio:x64-windows zstd:x64-windows
 | 
			
		||||
 | 
			
		||||
        - name: Install rtaudio
 | 
			
		||||
          run: git clone https://github.com/thestk/rtaudio ; cd rtaudio ; git checkout 2f2fca4502d506abc50f6d4473b2836d24cfb1e3 ; mkdir build ; cd build ; cmake .. ; cmake --build . --config Release ; cmake --install .
 | 
			
		||||
 | 
			
		||||
        - name: Prepare CMake
 | 
			
		||||
          working-directory: ${{runner.workspace}}/build
 | 
			
		||||
          run: cmake "$Env:GITHUB_WORKSPACE" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.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_USRP_SOURCE=ON
 | 
			
		||||
          run: cmake "$Env:GITHUB_WORKSPACE" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.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
 | 
			
		||||
 | 
			
		||||
        - name: Build
 | 
			
		||||
          working-directory: ${{runner.workspace}}/build
 | 
			
		||||
@@ -87,7 +87,7 @@ jobs:
 | 
			
		||||
          run: brew update
 | 
			
		||||
 | 
			
		||||
        - name: Install dependencies
 | 
			
		||||
          run: brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 uhd zstd && pip3 install mako
 | 
			
		||||
          run: brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd && 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 ../../
 | 
			
		||||
@@ -106,7 +106,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
        - 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_USRP_SOURCE=ON -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release
 | 
			
		||||
          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 -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release
 | 
			
		||||
 | 
			
		||||
        - name: Build
 | 
			
		||||
          working-directory: ${{runner.workspace}}/build
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,11 @@ int sdrpp_main(int argc, char* argv[]) {
 | 
			
		||||
    bool serverMode = (bool)core::args["server"];
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
    // Free console if the user hasn't asked for a console and not in server mode
 | 
			
		||||
    if (!core::args["con"].b() && !serverMode) { FreeConsole(); }
 | 
			
		||||
 | 
			
		||||
    // Set error mode to avoid abnoxious popups
 | 
			
		||||
    SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Check root directory
 | 
			
		||||
@@ -168,8 +172,12 @@ int sdrpp_main(int argc, char* argv[]) {
 | 
			
		||||
    defConfig["moduleInstances"]["File Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["HackRF Source"]["module"] = "hackrf_source";
 | 
			
		||||
    defConfig["moduleInstances"]["HackRF Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["Hermes Source"]["module"] = "hermes_source";
 | 
			
		||||
    defConfig["moduleInstances"]["Hermes Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["LimeSDR Source"]["module"] = "limesdr_source";
 | 
			
		||||
    defConfig["moduleInstances"]["LimeSDR Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["PlutoSDR Source"]["module"] = "plutosdr_source";
 | 
			
		||||
    defConfig["moduleInstances"]["PlutoSDR Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["RFspace Source"]["module"] = "rfspace_source";
 | 
			
		||||
    defConfig["moduleInstances"]["RFspace Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["RTL-SDR Source"]["module"] = "rtl_sdr_source";
 | 
			
		||||
@@ -184,8 +192,6 @@ int sdrpp_main(int argc, char* argv[]) {
 | 
			
		||||
    defConfig["moduleInstances"]["SoapySDR Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["SpyServer Source"]["module"] = "spyserver_source";
 | 
			
		||||
    defConfig["moduleInstances"]["SpyServer Source"]["enabled"] = true;
 | 
			
		||||
    defConfig["moduleInstances"]["PlutoSDR Source"]["module"] = "plutosdr_source";
 | 
			
		||||
    defConfig["moduleInstances"]["PlutoSDR Source"]["enabled"] = true;
 | 
			
		||||
 | 
			
		||||
    defConfig["moduleInstances"]["Audio Sink"] = "audio_sink";
 | 
			
		||||
    defConfig["moduleInstances"]["Network Sink"] = "network_sink";
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ namespace dsp::compression {
 | 
			
		||||
            if (pcmType == PCMType::PCM_TYPE_F32) {
 | 
			
		||||
                *scaler = 0;
 | 
			
		||||
                memcpy(dataBuf, in, count * sizeof(complex_t));
 | 
			
		||||
                return count;
 | 
			
		||||
                return 8 + (count * sizeof(complex_t));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Find maximum value
 | 
			
		||||
 
 | 
			
		||||
@@ -171,4 +171,4 @@ namespace dsp::multirate {
 | 
			
		||||
        double _outSamplerate;
 | 
			
		||||
        Mode mode;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,8 @@
 | 
			
		||||
template <class K, class T>
 | 
			
		||||
class OptionList {
 | 
			
		||||
public:
 | 
			
		||||
    OptionList() { updateText(); }
 | 
			
		||||
 | 
			
		||||
    void define(K key, std::string name, T value) {
 | 
			
		||||
        if (keyExists(key)) { throw std::runtime_error("Key already exists"); }
 | 
			
		||||
        if (nameExists(name)) { throw std::runtime_error("Name already exists"); }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ cd /root
 | 
			
		||||
apt update
 | 
			
		||||
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 libuhd-dev
 | 
			
		||||
            libcodec2-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -18,7 +18,7 @@ cp inc/* /usr/include/
 | 
			
		||||
cd SDRPlusPlus
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
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_USRP_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
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ cd /root
 | 
			
		||||
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 libuhd-dev
 | 
			
		||||
            libcodec2-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -18,7 +18,7 @@ cp inc/* /usr/include/
 | 
			
		||||
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_USRP_SOURCE=ON
 | 
			
		||||
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
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ cd /root
 | 
			
		||||
apt update
 | 
			
		||||
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 libuhd-dev
 | 
			
		||||
            libcodec2-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -18,7 +18,7 @@ cp inc/* /usr/include/
 | 
			
		||||
cd SDRPlusPlus
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
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_USRP_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
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ apt update
 | 
			
		||||
# Install dependencies and tools
 | 
			
		||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspy-dev \
 | 
			
		||||
            libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \
 | 
			
		||||
            libcodec2-dev libudev-dev libuhd-dev
 | 
			
		||||
            libcodec2-dev libudev-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -56,7 +56,7 @@ echo 'Cflags: -I/usr/include/codec2' >> /usr/share/pkgconfig/codec2.pc
 | 
			
		||||
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_OVERRIDE_STD_FILESYSTEM=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON
 | 
			
		||||
cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_OVERRIDE_STD_FILESYSTEM=ON -DOPT_BUILD_M17_DECODER=ON
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
# Generate package
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ cd /root
 | 
			
		||||
apt update
 | 
			
		||||
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 libuhd-dev
 | 
			
		||||
            libcodec2-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -18,7 +18,7 @@ cp inc/* /usr/include/
 | 
			
		||||
cd SDRPlusPlus
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
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_USRP_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
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ cd /root
 | 
			
		||||
apt update
 | 
			
		||||
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 libuhd-dev
 | 
			
		||||
            libcodec2-dev
 | 
			
		||||
 | 
			
		||||
# Install SDRPlay libraries
 | 
			
		||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
 | 
			
		||||
@@ -18,7 +18,7 @@ cp inc/* /usr/include/
 | 
			
		||||
cd SDRPlusPlus
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
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_USRP_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
 | 
			
		||||
make VERBOSE=1 -j2
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules
 | 
			
		||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/sdrpp_server_source/sdrpp_server_source.dylib
 | 
			
		||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/soapy_source/soapy_source.dylib
 | 
			
		||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/spyserver_source/spyserver_source.dylib
 | 
			
		||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/usrp_source/usrp_source.dylib
 | 
			
		||||
# bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/usrp_source/usrp_source.dylib
 | 
			
		||||
 | 
			
		||||
# Sink modules
 | 
			
		||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ cp $build_dir/source_modules/soapy_source/Release/soapy_source.dll sdrpp_windows
 | 
			
		||||
 | 
			
		||||
cp $build_dir/source_modules/spyserver_source/Release/spyserver_source.dll sdrpp_windows_x64/modules/
 | 
			
		||||
 | 
			
		||||
cp $build_dir/source_modules/usrp_source/Release/usrp_source.dll sdrpp_windows_x64/modules/
 | 
			
		||||
# cp $build_dir/source_modules/usrp_source/Release/usrp_source.dll sdrpp_windows_x64/modules/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Copy sink modules
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								readme.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								readme.md
									
									
									
									
									
								
							@@ -21,6 +21,14 @@ SDR++ is a cross-platform and open source SDR software with the aim of being blo
 | 
			
		||||
 | 
			
		||||
# Installing
 | 
			
		||||
 | 
			
		||||
## Nightly Builds
 | 
			
		||||
 | 
			
		||||
Nightly builds contain the very latest features and bugfixes. They are usually just stable as [normal releases](https://github.com/AlexandreRouma/SDRPlusPlus/releases) but are available basically minutes to hours after a change has been pushed to the code.
 | 
			
		||||
 | 
			
		||||
You can download them [here](https://www.sdrpp.org/nightly). It'll redirect you to the latest nightly on GitHub, scroll down to "Artifacts" and click on the version for your OS.
 | 
			
		||||
 | 
			
		||||
GitHub currently requires an account for the files to be downloadable so make sure you are logged in.
 | 
			
		||||
 | 
			
		||||
## Windows
 | 
			
		||||
 | 
			
		||||
Download the latest release from [the Releases page](https://github.com/AlexandreRouma/SDRPlusPlus/releases) and extract to the directory of your choice.
 | 
			
		||||
@@ -277,7 +285,8 @@ Make sure to install portaudio as it'll be needed later.
 | 
			
		||||
An example install command would be:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 && pip3 install mako zstd
 | 
			
		||||
brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd
 | 
			
		||||
pip3 install mako
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Install volk
 | 
			
		||||
@@ -331,7 +340,7 @@ Modules in beta are still included in releases for the most part but not enabled
 | 
			
		||||
| sdrpp_server_source | Working    | -                 | OPT_BUILD_SDRPP_SERVER_SOURCE | ✅              | ✅                     | ✅                         |
 | 
			
		||||
| soapy_source        | Working    | soapysdr          | OPT_BUILD_SOAPY_SOURCE        | ✅              | ✅                     | ✅                         |
 | 
			
		||||
| spyserver_source    | Working    | -                 | OPT_BUILD_SPYSERVER_SOURCE    | ✅              | ✅                     | ✅                         |
 | 
			
		||||
| usrp_source         | Beta       | libuhd            | OPT_BUILD_USRP_SOURCE         | ⛔              | ✅                     | ⛔                         |
 | 
			
		||||
| usrp_source         | Beta       | libuhd            | OPT_BUILD_USRP_SOURCE         | ⛔              | ⛔                     | ⛔                         |
 | 
			
		||||
 | 
			
		||||
## Sinks
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ else ()
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
if(WIN32)
 | 
			
		||||
  target_link_libraries(hermes_source PRIVATE wsock32 ws2_32)
 | 
			
		||||
    target_link_libraries(hermes_source PRIVATE wsock32 ws2_32 iphlpapi)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Install directives
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,15 @@ namespace hermes {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::start() {
 | 
			
		||||
        sendMetisControl((MetisControl)(METIS_CTRL_IQ | METIS_CTRL_NO_WD));
 | 
			
		||||
        for (int i = 0; i < HERMES_METIS_REPEAT; i++) {
 | 
			
		||||
            sendMetisControl((MetisControl)(METIS_CTRL_IQ | METIS_CTRL_NO_WD));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::stop() {
 | 
			
		||||
        sendMetisControl(METIS_CTRL_NONE);
 | 
			
		||||
        for (int i = 0; i < HERMES_METIS_REPEAT; i++) {
 | 
			
		||||
            sendMetisControl(METIS_CTRL_NONE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::setSamplerate(HermesLiteSamplerate samplerate) {
 | 
			
		||||
@@ -32,13 +36,44 @@ namespace hermes {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::setFrequency(double freq) {
 | 
			
		||||
        this->freq = freq;
 | 
			
		||||
        writeReg(HL_REG_TX1_NCO_FREQ, freq);
 | 
			
		||||
        autoeFilters(freq);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::setGain(int gain) {
 | 
			
		||||
        writeReg(HL_REG_RX_LNA, gain | (1 << 6));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::autoeFilters(double freq) {
 | 
			
		||||
        uint8_t filt = (freq >= 3000000.0) ? (1 << 6) : 0;
 | 
			
		||||
        
 | 
			
		||||
        if (freq <= 2000000.0) {
 | 
			
		||||
            filt |= (1 << 0);
 | 
			
		||||
        }
 | 
			
		||||
        else if (freq <= 4000000.0) {
 | 
			
		||||
            filt |= (1 << 1);
 | 
			
		||||
        }
 | 
			
		||||
        else if (freq <= 7300000.0) {
 | 
			
		||||
            filt |= (1 << 2);
 | 
			
		||||
        }
 | 
			
		||||
        else if (freq <= 14350000.0) {
 | 
			
		||||
            filt |= (1 << 3);
 | 
			
		||||
        }
 | 
			
		||||
        else if (freq <= 21450000.0) {
 | 
			
		||||
            filt |= (1 << 4);
 | 
			
		||||
        }
 | 
			
		||||
        else if (freq <= 29700000.0) {
 | 
			
		||||
            filt |= (1 << 5);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Write only if the config actually changed
 | 
			
		||||
        if (filt != lastFilt) {
 | 
			
		||||
            lastFilt = filt;
 | 
			
		||||
            writeI2C(I2C_PORT_2, 0x20, 0x0A, filt);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::sendMetisUSB(uint8_t endpoint, void* frame0, void* frame1) {
 | 
			
		||||
        // Build packet
 | 
			
		||||
        uint32_t seq = usbSeq++;
 | 
			
		||||
@@ -79,6 +114,8 @@ namespace hermes {
 | 
			
		||||
 | 
			
		||||
        sendMetisUSB(2, frame);
 | 
			
		||||
 | 
			
		||||
        // TODO: Wait for response
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -96,6 +133,15 @@ namespace hermes {
 | 
			
		||||
        sendMetisUSB(2, frame);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::writeI2C(I2CPort port, uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
        uint32_t wdata = data;
 | 
			
		||||
        wdata |= reg << 8;
 | 
			
		||||
        wdata |= (addr & 0x7F) << 16;
 | 
			
		||||
        wdata |= 1 << 23;
 | 
			
		||||
        wdata |= 0x06 << 24;
 | 
			
		||||
        writeReg(HL_REG_I2C_1 + port, wdata);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Client::worker() {
 | 
			
		||||
        uint8_t rbuf[2048];
 | 
			
		||||
        MetisUSBPacket* pkt = (MetisUSBPacket*)rbuf;
 | 
			
		||||
@@ -147,7 +193,7 @@ namespace hermes {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<Info> discover() {
 | 
			
		||||
        auto sock = net::openudp("192.168.0.255", 1024);
 | 
			
		||||
        auto sock = net::openudp("0.0.0.0", 1024);
 | 
			
		||||
        
 | 
			
		||||
        // Build discovery packet
 | 
			
		||||
        uint8_t discoveryPkt[64];
 | 
			
		||||
@@ -155,18 +201,23 @@ namespace hermes {
 | 
			
		||||
        *(uint16_t*)&discoveryPkt[0] = htons(HERMES_METIS_SIGNATURE);
 | 
			
		||||
        discoveryPkt[2] = METIS_PKT_DISCOVER;
 | 
			
		||||
 | 
			
		||||
        // Get interface list
 | 
			
		||||
        auto ifaces = net::listInterfaces();
 | 
			
		||||
 | 
			
		||||
        // Send the packet 5 times to make sure it's received
 | 
			
		||||
        for (int i = 0; i < HERMES_DISCOVER_REPEAT; i++) {
 | 
			
		||||
            sock->send(discoveryPkt, sizeof(discoveryPkt));
 | 
			
		||||
        for (const auto& [name, iface] : ifaces) {
 | 
			
		||||
            net::Address baddr(iface.broadcast, 1024);
 | 
			
		||||
            for (int i = 0; i < HERMES_METIS_REPEAT; i++) {
 | 
			
		||||
                sock->send(discoveryPkt, sizeof(discoveryPkt), &baddr);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        std::vector<Info> devices;
 | 
			
		||||
 | 
			
		||||
        while (true) {
 | 
			
		||||
            // Wait for a response
 | 
			
		||||
            net::Address addr;
 | 
			
		||||
            uint8_t resp[1024];
 | 
			
		||||
            int len = sock->recv(resp, sizeof(resp), false, HERMES_DISCOVER_TIMEOUT, &addr);
 | 
			
		||||
            int len = sock->recv(resp, sizeof(resp), false, HERMES_METIS_TIMEOUT, &addr);
 | 
			
		||||
            
 | 
			
		||||
            // Give up if timeout or error
 | 
			
		||||
            if (len <= 0) { break; }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,8 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <thread>
 | 
			
		||||
 | 
			
		||||
#define HERMES_DISCOVER_REPEAT  5
 | 
			
		||||
#define HERMES_DISCOVER_TIMEOUT 1000
 | 
			
		||||
#define HERMES_METIS_REPEAT     5
 | 
			
		||||
#define HERMES_METIS_TIMEOUT    1000
 | 
			
		||||
#define HERMES_METIS_SIGNATURE  0xEFFE
 | 
			
		||||
#define HERMES_HPSDR_USB_SYNC   0x7F
 | 
			
		||||
 | 
			
		||||
@@ -80,6 +80,11 @@ namespace hermes {
 | 
			
		||||
        HL_SAMP_RATE_384KHZ = 3
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum I2CPort {
 | 
			
		||||
        I2C_PORT_1 = 0,
 | 
			
		||||
        I2C_PORT_2
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
#pragma pack(push, 1)
 | 
			
		||||
    struct HPSDRUSBHeader {
 | 
			
		||||
        uint8_t sync[3];
 | 
			
		||||
@@ -130,6 +135,7 @@ namespace hermes {
 | 
			
		||||
        void setSamplerate(HermesLiteSamplerate samplerate);
 | 
			
		||||
        void setFrequency(double freq);
 | 
			
		||||
        void setGain(int gain);
 | 
			
		||||
        void autoeFilters(double freq);
 | 
			
		||||
 | 
			
		||||
        dsp::stream<dsp::complex_t> out;
 | 
			
		||||
 | 
			
		||||
@@ -140,13 +146,19 @@ namespace hermes {
 | 
			
		||||
        uint32_t readReg(uint8_t addr);
 | 
			
		||||
        void writeReg(uint8_t addr, uint32_t val); 
 | 
			
		||||
 | 
			
		||||
        void writeI2C(I2CPort port, uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        void worker();
 | 
			
		||||
 | 
			
		||||
        bool open = true;
 | 
			
		||||
        double freq = 0;
 | 
			
		||||
 | 
			
		||||
        std::thread workerThread;
 | 
			
		||||
        std::shared_ptr<net::Socket> sock;
 | 
			
		||||
        uint32_t usbSeq = 0;
 | 
			
		||||
        uint8_t lastFilt = 0;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,15 +48,6 @@ public:
 | 
			
		||||
        handler.stopHandler = stop;
 | 
			
		||||
        handler.tuneHandler = tune;
 | 
			
		||||
        handler.stream = &stream;
 | 
			
		||||
        
 | 
			
		||||
        // TODO: Move the refresh and first select to the select event instead
 | 
			
		||||
        refresh();
 | 
			
		||||
 | 
			
		||||
        // Select device
 | 
			
		||||
        config.acquire();
 | 
			
		||||
        selectedMac = config.conf["device"];
 | 
			
		||||
        config.release();
 | 
			
		||||
        selectMac(selectedMac);
 | 
			
		||||
 | 
			
		||||
        sigpath::sourceManager.registerSource("Hermes", &handler);
 | 
			
		||||
    }
 | 
			
		||||
@@ -132,6 +123,20 @@ private:
 | 
			
		||||
 | 
			
		||||
    static void menuSelected(void* ctx) {
 | 
			
		||||
        HermesSourceModule* _this = (HermesSourceModule*)ctx;
 | 
			
		||||
 | 
			
		||||
        if (_this->firstSelect) {
 | 
			
		||||
            _this->firstSelect = false;
 | 
			
		||||
 | 
			
		||||
            // Refresh
 | 
			
		||||
            _this->refresh();
 | 
			
		||||
 | 
			
		||||
            // Select device
 | 
			
		||||
            config.acquire();
 | 
			
		||||
            _this->selectedMac = config.conf["device"];
 | 
			
		||||
            config.release();
 | 
			
		||||
            _this->selectMac(_this->selectedMac);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        core::setInputSampleRate(_this->sampleRate);
 | 
			
		||||
        spdlog::info("HermesSourceModule '{0}': Menu Select!", _this->name);
 | 
			
		||||
    }
 | 
			
		||||
@@ -257,6 +262,8 @@ private:
 | 
			
		||||
    int srId = 0;
 | 
			
		||||
    int gain = 0;
 | 
			
		||||
 | 
			
		||||
    bool firstSelect = true;
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<hermes::Client> dev;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
#include "net.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <codecvt>
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#define WOULD_BLOCK (WSAGetLastError() == WSAEWOULDBLOCK)
 | 
			
		||||
@@ -246,6 +247,60 @@ namespace net {
 | 
			
		||||
 | 
			
		||||
    // === Creation functions ===
 | 
			
		||||
 | 
			
		||||
    std::map<std::string, InterfaceInfo> listInterfaces() {
 | 
			
		||||
        // Init library if needed
 | 
			
		||||
        init();
 | 
			
		||||
 | 
			
		||||
        std::map<std::string, InterfaceInfo> ifaces;
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
        // Pre-allocate buffer
 | 
			
		||||
        ULONG size = sizeof(IP_ADAPTER_ADDRESSES);
 | 
			
		||||
        PIP_ADAPTER_ADDRESSES addresses = (PIP_ADAPTER_ADDRESSES)malloc(size);
 | 
			
		||||
 | 
			
		||||
        // Reallocate to real size
 | 
			
		||||
        if (GetAdaptersAddresses(AF_INET, 0, NULL, addresses, &size) == ERROR_BUFFER_OVERFLOW) {
 | 
			
		||||
            addresses = (PIP_ADAPTER_ADDRESSES)realloc(addresses, size);
 | 
			
		||||
            if (GetAdaptersAddresses(AF_INET, 0, NULL, addresses, &size)) {
 | 
			
		||||
                throw std::exception("Could not list network interfaces");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Save data
 | 
			
		||||
        std::wstring_convert<std::codecvt_utf8<wchar_t>> utfConv;
 | 
			
		||||
        for (auto iface = addresses; iface; iface = iface->Next) {
 | 
			
		||||
            InterfaceInfo info;
 | 
			
		||||
            auto ip = iface->FirstUnicastAddress;
 | 
			
		||||
            if (!ip || ip->Address.lpSockaddr->sa_family != AF_INET) { continue; }
 | 
			
		||||
            info.address = ntohl(*(uint32_t*)&ip->Address.lpSockaddr->sa_data[2]);
 | 
			
		||||
            info.netmask = ~((1 << (32 - ip->OnLinkPrefixLength)) - 1);
 | 
			
		||||
            info.broadcast = info.address | (~info.netmask);
 | 
			
		||||
            ifaces[utfConv.to_bytes(iface->FriendlyName)] = info;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Free tables
 | 
			
		||||
        free(addresses);
 | 
			
		||||
#else
 | 
			
		||||
        // Get iface list
 | 
			
		||||
        struct ifaddrs* addresses = NULL;
 | 
			
		||||
        getifaddrs(&addresses);
 | 
			
		||||
 | 
			
		||||
        // Save data
 | 
			
		||||
        for (auto iface = addresses; iface; iface = iface->ifa_next) {
 | 
			
		||||
            if (iface->ifa_addr->sa_family != AF_INET) { continue; }
 | 
			
		||||
            InterfaceInfo info;
 | 
			
		||||
            info.address = ntohl(*(uint32_t*)&iface->ifa_addr->sa_data[2]);
 | 
			
		||||
            info.netmask = ntohl(*(uint32_t*)&iface->ifa_netmask->sa_data[2]);
 | 
			
		||||
            info.broadcast = info.address | (~info.netmask);
 | 
			
		||||
            ifaces[iface->ifa_name] = info;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Free iface list
 | 
			
		||||
        freeifaddrs(addresses);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return ifaces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<Listener> listen(const Address& addr) {
 | 
			
		||||
        // Init library if needed
 | 
			
		||||
        init();
 | 
			
		||||
 
 | 
			
		||||
@@ -2,10 +2,12 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <mutex>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#include <WinSock2.h>
 | 
			
		||||
#include <WS2tcpip.h>
 | 
			
		||||
#include <iphlpapi.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
@@ -16,6 +18,7 @@
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <poll.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <ifaddrs.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace net {
 | 
			
		||||
@@ -30,6 +33,12 @@ namespace net {
 | 
			
		||||
    class Socket;
 | 
			
		||||
    class Listener;
 | 
			
		||||
 | 
			
		||||
    struct InterfaceInfo {
 | 
			
		||||
        IP_t address;
 | 
			
		||||
        IP_t netmask;
 | 
			
		||||
        IP_t broadcast;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    class Address {
 | 
			
		||||
        friend Socket;
 | 
			
		||||
        friend Listener;
 | 
			
		||||
@@ -198,6 +207,12 @@ namespace net {
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a list of the network interface.
 | 
			
		||||
     * @return List of network interfaces and their addresses.
 | 
			
		||||
     */
 | 
			
		||||
    std::map<std::string, InterfaceInfo> listInterfaces();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create TCP listener.
 | 
			
		||||
     * @param addr Address to listen on.
 | 
			
		||||
 
 | 
			
		||||
@@ -115,11 +115,9 @@ private:
 | 
			
		||||
            if (!_this->client) { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO: Set configuration here
 | 
			
		||||
        if (_this->client) {
 | 
			
		||||
            _this->client->setFrequency(_this->freq);
 | 
			
		||||
            _this->client->start();
 | 
			
		||||
        }
 | 
			
		||||
        // Set configuration
 | 
			
		||||
        _this->client->setFrequency(_this->freq);
 | 
			
		||||
        _this->client->start();
 | 
			
		||||
 | 
			
		||||
        _this->running = true;
 | 
			
		||||
        spdlog::info("SDRPPServerSourceModule '{0}': Start!", _this->name);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,6 @@ public:
 | 
			
		||||
        this->name = name;
 | 
			
		||||
 | 
			
		||||
        sampleRate = 8000000.0;
 | 
			
		||||
        // TODO: REMOVE
 | 
			
		||||
        samplerates.define(8000000, "8MHz", 8000000.0);
 | 
			
		||||
 | 
			
		||||
        handler.ctx = this;
 | 
			
		||||
        handler.selectHandler = menuSelected;
 | 
			
		||||
@@ -42,15 +40,6 @@ public:
 | 
			
		||||
        handler.tuneHandler = tune;
 | 
			
		||||
        handler.stream = &stream;
 | 
			
		||||
 | 
			
		||||
        // List devices
 | 
			
		||||
        refresh();
 | 
			
		||||
 | 
			
		||||
        // Select device
 | 
			
		||||
        config.acquire();
 | 
			
		||||
        selectedSer = config.conf["device"];
 | 
			
		||||
        config.release();
 | 
			
		||||
        select(selectedSer);
 | 
			
		||||
 | 
			
		||||
        sigpath::sourceManager.registerSource("USRP", &handler);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -212,6 +201,20 @@ private:
 | 
			
		||||
 | 
			
		||||
    static void menuSelected(void* ctx) {
 | 
			
		||||
        USRPSourceModule* _this = (USRPSourceModule*)ctx;
 | 
			
		||||
 | 
			
		||||
        if (_this->firstSelect) {
 | 
			
		||||
            _this->firstSelect = false;
 | 
			
		||||
 | 
			
		||||
            // List devices
 | 
			
		||||
            _this->refresh();
 | 
			
		||||
 | 
			
		||||
            // Select device
 | 
			
		||||
            config.acquire();
 | 
			
		||||
            _this->selectedSer = config.conf["device"];
 | 
			
		||||
            config.release();
 | 
			
		||||
            _this->select(_this->selectedSer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        core::setInputSampleRate(_this->sampleRate);
 | 
			
		||||
        spdlog::info("USRPSourceModule '{0}': Menu Select!", _this->name);
 | 
			
		||||
    }
 | 
			
		||||
@@ -406,6 +409,8 @@ private:
 | 
			
		||||
    uhd::usrp::multi_usrp::sptr dev;
 | 
			
		||||
    uhd::rx_streamer::sptr streamer;
 | 
			
		||||
 | 
			
		||||
    bool firstSelect = true;
 | 
			
		||||
 | 
			
		||||
    std::thread workerThread;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user