Hello community, here is the log from the commit of package inspectrum for openSUSE:Factory checked in at 2020-06-09 00:04:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/inspectrum (Old) and /work/SRC/openSUSE:Factory/.inspectrum.new.3606 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "inspectrum" Tue Jun 9 00:04:43 2020 rev:4 rq:812422 version:0.2.2+git.20200527 Changes: -------- --- /work/SRC/openSUSE:Factory/inspectrum/inspectrum.changes 2018-06-29 22:28:39.370381109 +0200 +++ /work/SRC/openSUSE:Factory/.inspectrum.new.3606/inspectrum.changes 2020-06-09 00:06:06.865599363 +0200 @@ -1,0 +2,17 @@ +Sun Jun 07 19:39:15 UTC 2020 - [email protected] + +- Add patch: + * inspectrum-fix-with-qt-5.15.patch +- Update to version 0.2.2+git.20200527: + * Add file extensions for real sample file types + * frequencydemod: set modulation index based on tuner width + * Tighten transition band when tuner bandwidth is narrow + * SpectrogramPlot: Ignore negative frequencies for real signals + * SpectrogramPlot: Fix uses of fftSize where it should've been height() + * Add SampleAdapters for real samples + * Use double for sample rate + * Remove all usage of old SIGNAL/SLOT macros + * allow file format override from command line + * Fix override warnings + +------------------------------------------------------------------- Old: ---- inspectrum-0.2.2+git.20180603.tar.xz New: ---- inspectrum-0.2.2+git.20200527.tar.xz inspectrum-fix-with-qt-5.15.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ inspectrum.spec ++++++ --- /var/tmp/diff_new_pack.ARmXWy/_old 2020-06-09 00:06:07.985603336 +0200 +++ /var/tmp/diff_new_pack.ARmXWy/_new 2020-06-09 00:06:07.989603350 +0200 @@ -1,7 +1,7 @@ # # spec file for package inspectrum # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # Copyright (c) 2017, Martin Hauke <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -13,18 +13,19 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: inspectrum -Version: 0.2.2+git.20180603 +Version: 0.2.2+git.20200527 Release: 0 Summary: A tool for analysing captured signals from SDRs License: GPL-3.0-or-later Group: Productivity/Hamradio/Other URL: https://github.com/miek/inspectrum Source: %{name}-%{version}.tar.xz +Patch0: inspectrum-fix-with-qt-5.15.patch BuildRequires: boost-devel BuildRequires: cmake BuildRequires: gcc-c++ @@ -45,6 +46,7 @@ %prep %setup -q +%patch0 -p1 %build %cmake @@ -52,7 +54,6 @@ %install %cmake_install -install -d %{buildroot}/%{_datadir}/pixmaps/ install -Dm 0644 screenshot.jpg %{buildroot}/%{_datadir}/pixmaps/inspectrum.jpg %suse_update_desktop_file -c inspectrum inspectrum "Offline Radio Signal Analyser" inspectrum inspectrum "Network;HamRadio" ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.ARmXWy/_old 2020-06-09 00:06:08.037603521 +0200 +++ /var/tmp/diff_new_pack.ARmXWy/_new 2020-06-09 00:06:08.037603521 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/miek/inspectrum</param> - <param name="changesrevision">cfb153dc9661f2b14cbfa248827b5ce63de0ac9c</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">13843b4aeb0cff8b7787cdac466e7485437f851d</param></service></servicedata> \ No newline at end of file ++++++ inspectrum-0.2.2+git.20180603.tar.xz -> inspectrum-0.2.2+git.20200527.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/.travis.yml new/inspectrum-0.2.2+git.20200527/.travis.yml --- old/inspectrum-0.2.2+git.20180603/.travis.yml 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/.travis.yml 2020-05-27 19:08:54.000000000 +0200 @@ -3,7 +3,7 @@ cache: apt sudo: required -dist: trusty +dist: bionic os: - linux @@ -27,28 +27,17 @@ - qtbase5-dev - qtdeclarative5-dev - libfftw3-dev + - libliquid-dev before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - # cmake and pkg-config are already installed, liquid-dsp is handled by before_script. - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew cask uninstall oclint; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt5 fftw; fi - -before_script: - - pushd /tmp - - mkdir liquid-install - - git clone https://github.com/jgaeddert/liquid-dsp.git - - cd liquid-dsp - - ./bootstrap.sh - - ./configure --prefix=/tmp/liquid-install/ - - make - - make install - - popd + # cmake and pkg-config are already installed. + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt5 fftw liquid-dsp; fi script: - mkdir build - cd build - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export CMAKE_PREFIX_PATH=$(brew --prefix qt5)/lib/cmake; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then DYLIB_SUFFIX=dylib; else DYLIB_SUFFIX=so; fi - - CFLAGS="-g -Wall -Wextra -Werror -Wno-zero-length-array" cmake -DLIQUID_LIBRARIES=/tmp/liquid-install/lib/libliquid.$DYLIB_SUFFIX -DLIQUID_INCLUDES=/tmp/liquid-install/include/ .. + - CFLAGS="-g -Wall -Wextra -Werror -Wno-zero-length-array" cmake .. - make diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/README.md new/inspectrum-0.2.2+git.20200527/README.md --- old/inspectrum-0.2.2+git.20180603/README.md 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/README.md 2020-05-27 19:08:54.000000000 +0200 @@ -6,7 +6,7 @@ ## Try it ### Prerequisites - * cmake + * cmake >= 2.8.11 * fftw 3.x * [liquid-dsp](https://github.com/jgaeddert/liquid-dsp) >= v1.3.0 * pkg-config @@ -26,6 +26,10 @@ * `*.cs16` - Complex 16-bit signed integer samples (BladeRF) * `*.cs8` - Complex 8-bit signed integer samples (HackRF) * `*.cu8` - Complex 8-bit unsigned integer samples (RTL-SDR) + * `*.f32` - Real 32-bit floating point samples + * `*.s16` - Real 16-bit signed integer samples + * `*.s8` - Real 8-bit signed integer samples + * `*.u8` - Real 8-bit unsigned integer samples If an unknown file extension is loaded, inspectrum will default to `*.cf32`. @@ -35,6 +39,6 @@ * Plots of amplitude, frequency, phase and IQ samples * Cursors for measuring period, symbol rate and extracting symbols * Export of selected time period, filtered samples and demodulated data - + ## Contact * #inspectrum on freenode IRC diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/frequencydemod.cpp new/inspectrum-0.2.2+git.20200527/frequencydemod.cpp --- old/inspectrum-0.2.2+git.20180603/frequencydemod.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/frequencydemod.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -30,7 +30,7 @@ { auto in = static_cast<std::complex<float>*>(input); auto out = static_cast<float*>(output); - freqdem fdem = freqdem_create(0.05f); + freqdem fdem = freqdem_create(relativeBandwidth() / 2.0); for (int i = 0; i < count; i++) { freqdem_demodulate(fdem, in[i], &out[i]); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/inputsource.cpp new/inspectrum-0.2.2+git.20200527/inputsource.cpp --- old/inspectrum-0.2.2+git.20180603/inputsource.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/inputsource.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -63,7 +63,7 @@ size_t sampleSize() override { return sizeof(std::complex<int8_t>); } - + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { auto s = reinterpret_cast<const std::complex<int8_t>*>(src); std::transform(&s[start], &s[start + length], dest, @@ -80,7 +80,7 @@ size_t sampleSize() override { return sizeof(std::complex<uint8_t>); } - + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { auto s = reinterpret_cast<const std::complex<uint8_t>*>(src); std::transform(&s[start], &s[start + length], dest, @@ -92,6 +92,73 @@ } }; +class RealF32SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(float); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { + auto s = reinterpret_cast<const float*>(src); + std::transform(&s[start], &s[start + length], dest, + [](const float& v) -> std::complex<float> { + return {v, 0.0f}; + } + ); + } +}; + +class RealS16SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(int16_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { + auto s = reinterpret_cast<const int16_t*>(src); + std::transform(&s[start], &s[start + length], dest, + [](const int16_t& v) -> std::complex<float> { + const float k = 1.0f / 32768.0f; + return { v * k, 0.0f }; + } + ); + } +}; + +class RealS8SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(int8_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { + auto s = reinterpret_cast<const int8_t*>(src); + std::transform(&s[start], &s[start + length], dest, + [](const int8_t& v) -> std::complex<float> { + const float k = 1.0f / 128.0f; + return { v * k, 0.0f }; + } + ); + } +}; + +class RealU8SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(uint8_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override { + auto s = reinterpret_cast<const uint8_t*>(src); + std::transform(&s[start], &s[start + length], dest, + [](const uint8_t& v) -> std::complex<float> { + const float k = 1.0f / 128.0f; + return { (v - 127.4f) * k, 0 }; + } + ); + } +}; + InputSource::InputSource() { } @@ -117,7 +184,8 @@ void InputSource::openFile(const char *filename) { QFileInfo fileInfo(filename); - const auto suffix = fileInfo.suffix().toLower(); + std::string suffix = std::string(fileInfo.suffix().toLower().toUtf8().constData()); + if(_fmt!=""){ suffix = _fmt; } // allow fmt override if ((suffix == "cfile") || (suffix == "cf32") || (suffix == "fc32")) { sampleAdapter = std::unique_ptr<SampleAdapter>(new ComplexF32SampleAdapter()); } @@ -130,6 +198,22 @@ else if ((suffix == "cu8") || (suffix == "uc8")) { sampleAdapter = std::unique_ptr<SampleAdapter>(new ComplexU8SampleAdapter()); } + else if (suffix == "f32") { + sampleAdapter = std::unique_ptr<SampleAdapter>(new RealF32SampleAdapter()); + _realSignal = true; + } + else if (suffix == "s16") { + sampleAdapter = std::unique_ptr<SampleAdapter>(new RealS16SampleAdapter()); + _realSignal = true; + } + else if (suffix == "s8") { + sampleAdapter = std::unique_ptr<SampleAdapter>(new RealS8SampleAdapter()); + _realSignal = true; + } + else if (suffix == "u8") { + sampleAdapter = std::unique_ptr<SampleAdapter>(new RealU8SampleAdapter()); + _realSignal = true; + } else { sampleAdapter = std::unique_ptr<SampleAdapter>(new ComplexF32SampleAdapter()); } @@ -154,13 +238,13 @@ invalidate(); } -void InputSource::setSampleRate(size_t rate) +void InputSource::setSampleRate(double rate) { sampleRate = rate; invalidate(); } -size_t InputSource::rate() +double InputSource::rate() { return sampleRate; } @@ -184,3 +268,7 @@ return dest; } + +void InputSource::setFormat(std::string fmt){ + _fmt = fmt; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/inputsource.h new/inspectrum-0.2.2+git.20200527/inputsource.h --- old/inspectrum-0.2.2+git.20180603/inputsource.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/inputsource.h 2020-05-27 19:08:54.000000000 +0200 @@ -35,9 +35,11 @@ private: QFile *inputFile = nullptr; size_t sampleCount = 0; - size_t sampleRate = 0; + double sampleRate = 0.0; uchar *mmapData = nullptr; std::unique_ptr<SampleAdapter> sampleAdapter; + std::string _fmt; + bool _realSignal = false; public: InputSource(); @@ -48,8 +50,12 @@ size_t count() { return sampleCount; }; - void setSampleRate(size_t rate); - size_t rate(); + void setSampleRate(double rate); + void setFormat(std::string fmt); + double rate(); + bool realSignal() { + return _realSignal; + }; float relativeBandwidth() { return 1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/main.cpp new/inspectrum-0.2.2+git.20200527/main.cpp --- old/inspectrum-0.2.2+git.20180603/main.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/main.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -40,9 +40,18 @@ QCoreApplication::translate("main", "Set sample rate."), QCoreApplication::translate("main", "Hz")); parser.addOption(rateOption); + QCommandLineOption formatOption(QStringList() << "f" << "format", + QCoreApplication::translate("main", "Set file format."), + QCoreApplication::translate("main", "fmt")); + parser.addOption(formatOption); // Process the actual command line parser.process(a); + + // Check for file format override + if(parser.isSet(formatOption)){ + mainWin.setFormat(parser.value(formatOption)); + } const QStringList args = parser.positionalArguments(); if (args.size()>=1) @@ -50,8 +59,7 @@ if (parser.isSet(rateOption)) { bool ok; - // Use toDouble just for scientific notation support - int rate = parser.value(rateOption).toDouble(&ok); + auto rate = parser.value(rateOption).toDouble(&ok); if(!ok) { fputs("ERROR: could not parse rate\n", stderr); return 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/mainwindow.cpp new/inspectrum-0.2.2+git.20200527/mainwindow.cpp --- old/inspectrum-0.2.2+git.20180603/mainwindow.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/mainwindow.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -42,19 +42,19 @@ setCentralWidget(plots); // Connect dock inputs - connect(dock, SIGNAL(openFile(QString)), this, SLOT(openFile(QString))); - connect(dock->sampleRate, SIGNAL(textChanged(QString)), this, SLOT(setSampleRate(QString))); - connect(dock, SIGNAL(fftOrZoomChanged(int, int)), plots, SLOT(setFFTAndZoom(int, int))); - connect(dock->powerMaxSlider, SIGNAL(valueChanged(int)), plots, SLOT(setPowerMax(int))); - connect(dock->powerMinSlider, SIGNAL(valueChanged(int)), plots, SLOT(setPowerMin(int))); + connect(dock, &SpectrogramControls::openFile, this, &MainWindow::openFile); + connect(dock->sampleRate, static_cast<void (QLineEdit::*)(const QString&)>(&QLineEdit::textChanged), this, static_cast<void (MainWindow::*)(QString)>(&MainWindow::setSampleRate)); + connect(dock, static_cast<void (SpectrogramControls::*)(int, int)>(&SpectrogramControls::fftOrZoomChanged), plots, &PlotView::setFFTAndZoom); + connect(dock->powerMaxSlider, &QSlider::valueChanged, plots, &PlotView::setPowerMax); + connect(dock->powerMinSlider, &QSlider::valueChanged, plots, &PlotView::setPowerMin); connect(dock->cursorsCheckBox, &QCheckBox::stateChanged, plots, &PlotView::enableCursors); connect(dock->scalesCheckBox, &QCheckBox::stateChanged, plots, &PlotView::enableScales); connect(dock->cursorSymbolsSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), plots, &PlotView::setCursorSegments); // Connect dock outputs - connect(plots, SIGNAL(timeSelectionChanged(float)), dock, SLOT(timeSelectionChanged(float))); - connect(plots, SIGNAL(zoomIn()), dock, SLOT(zoomIn())); - connect(plots, SIGNAL(zoomOut()), dock, SLOT(zoomOut())); + connect(plots, &PlotView::timeSelectionChanged, dock, &SpectrogramControls::timeSelectionChanged); + connect(plots, &PlotView::zoomIn, dock, &SpectrogramControls::zoomIn); + connect(plots, &PlotView::zoomOut, dock, &SpectrogramControls::zoomOut); // Set defaults after making connections so everything is in sync dock->setDefaults(); @@ -98,7 +98,7 @@ void MainWindow::setSampleRate(QString rate) { - int sampleRate = rate.toInt(); + auto sampleRate = rate.toDouble(); input->setSampleRate(sampleRate); plots->setSampleRate(sampleRate); @@ -107,7 +107,12 @@ settings.setValue("SampleRate", sampleRate); } -void MainWindow::setSampleRate(int rate) +void MainWindow::setSampleRate(double rate) { dock->sampleRate->setText(QString::number(rate)); } + +void MainWindow::setFormat(QString fmt) +{ + input->setFormat(fmt.toUtf8().constData()); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/mainwindow.h new/inspectrum-0.2.2+git.20200527/mainwindow.h --- old/inspectrum-0.2.2+git.20180603/mainwindow.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/mainwindow.h 2020-05-27 19:08:54.000000000 +0200 @@ -30,12 +30,13 @@ public: MainWindow(); - void changeSampleRate(int rate); + void changeSampleRate(double rate); public slots: void openFile(QString fileName); void setSampleRate(QString rate); - void setSampleRate(int rate); + void setSampleRate(double rate); + void setFormat(QString fmt); private: SpectrogramControls *dock; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/plotview.cpp new/inspectrum-0.2.2+git.20200527/plotview.cpp --- old/inspectrum-0.2.2+git.20180603/plotview.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/plotview.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -41,7 +41,7 @@ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setMouseTracking(true); enableCursors(false); - connect(&cursors, SIGNAL(cursorsMoved()), this, SLOT(cursorsMoved())); + connect(&cursors, &Cursors::cursorsMoved, this, &PlotView::cursorsMoved); spectrogramPlot = new SpectrogramPlot(std::shared_ptr<SampleSource<std::complex<float>>>(mainSampleSource)); auto tunerOutput = std::dynamic_pointer_cast<SampleSource<std::complex<float>>>(spectrogramPlot->output()); @@ -563,7 +563,7 @@ viewport()->update(); } -void PlotView::setSampleRate(size_t rate) +void PlotView::setSampleRate(double rate) { sampleRate = rate; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/plotview.h new/inspectrum-0.2.2+git.20200527/plotview.h --- old/inspectrum-0.2.2+git.20180603/plotview.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/plotview.h 2020-05-27 19:08:54.000000000 +0200 @@ -35,7 +35,7 @@ public: PlotView(InputSource *input); - void setSampleRate(size_t rate); + void setSampleRate(double rate); signals: void timeSelectionChanged(float time); @@ -46,7 +46,7 @@ void cursorsMoved(); void enableCursors(bool enabled); void enableScales(bool enabled); - void invalidateEvent(); + void invalidateEvent() override; void repaint(); void setCursorSegments(int segments); void setFFTAndZoom(int fftSize, int zoomLevel); @@ -55,9 +55,9 @@ protected: void contextMenuEvent(QContextMenuEvent * event) override; - void paintEvent(QPaintEvent *event); - void resizeEvent(QResizeEvent * event); - void scrollContentsBy(int dx, int dy); + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent * event) override; + void scrollContentsBy(int dx, int dy) override; bool viewportEvent(QEvent *event) override; private: @@ -75,7 +75,7 @@ int powerMin; int powerMax; bool cursorsEnabled; - size_t sampleRate = 0; + double sampleRate = 0.0; bool timeScaleEnabled; int scrollZoomStepsAccumulated = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/samplebuffer.h new/inspectrum-0.2.2+git.20200527/samplebuffer.h --- old/inspectrum-0.2.2+git.20180603/samplebuffer.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/samplebuffer.h 2020-05-27 19:08:54.000000000 +0200 @@ -40,11 +40,11 @@ virtual size_t count() { return src->count(); }; - size_t rate() { + double rate() { return src->rate(); }; float relativeBandwidth() { - return 1; + return src->relativeBandwidth(); } }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/samplesource.h new/inspectrum-0.2.2+git.20200527/samplesource.h --- old/inspectrum-0.2.2+git.20180603/samplesource.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/samplesource.h 2020-05-27 19:08:54.000000000 +0200 @@ -33,7 +33,8 @@ virtual std::unique_ptr<T[]> getSamples(size_t start, size_t length) = 0; virtual void invalidateEvent() { }; virtual size_t count() = 0; - virtual size_t rate() = 0; + virtual double rate() = 0; virtual float relativeBandwidth() = 0; std::type_index sampleType() override; + virtual bool realSignal() { return false; }; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/spectrogramcontrols.cpp new/inspectrum-0.2.2+git.20200527/spectrogramcontrols.cpp --- old/inspectrum-0.2.2+git.20180603/spectrogramcontrols.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/spectrogramcontrols.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -36,7 +36,9 @@ layout->addRow(fileOpenButton); sampleRate = new QLineEdit(); - sampleRate->setValidator(new QIntValidator(this)); + auto double_validator = new QDoubleValidator(this); + double_validator->setBottom(0.0); + sampleRate->setValidator(double_validator); layout->addRow(new QLabel(tr("Sample rate:")), sampleRate); // Spectrogram settings @@ -94,12 +96,12 @@ widget->setLayout(layout); setWidget(widget); - connect(fftSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(fftSizeChanged(int))); - connect(zoomLevelSlider, SIGNAL(valueChanged(int)), this, SLOT(zoomLevelChanged(int))); - connect(fileOpenButton, SIGNAL(clicked()), this, SLOT(fileOpenButtonClicked())); - connect(cursorsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(cursorsStateChanged(int))); - connect(powerMinSlider, SIGNAL(valueChanged(int)), this, SLOT(powerMinChanged(int))); - connect(powerMaxSlider, SIGNAL(valueChanged(int)), this, SLOT(powerMaxChanged(int))); + connect(fftSizeSlider, &QSlider::valueChanged, this, &SpectrogramControls::fftSizeChanged); + connect(zoomLevelSlider, &QSlider::valueChanged, this, &SpectrogramControls::zoomLevelChanged); + connect(fileOpenButton, &QPushButton::clicked, this, &SpectrogramControls::fileOpenButtonClicked); + connect(cursorsCheckBox, &QCheckBox::stateChanged, this, &SpectrogramControls::cursorsStateChanged); + connect(powerMinSlider, &QSlider::valueChanged, this, &SpectrogramControls::powerMinChanged); + connect(powerMaxSlider, &QSlider::valueChanged, this, &SpectrogramControls::powerMaxChanged); } void SpectrogramControls::clearCursorLabels() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/spectrogramplot.cpp new/inspectrum-0.2.2+git.20200527/spectrogramplot.cpp --- old/inspectrum-0.2.2+git.20180603/spectrogramplot.cpp 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/spectrogramplot.cpp 2020-05-27 19:08:54.000000000 +0200 @@ -51,6 +51,9 @@ void SpectrogramPlot::invalidateEvent() { + // HACK: this makes sure we update the height for real signals (as InputSource is passed here before the file is opened) + setFFTSize(fftSize); + pixmapCache.clear(); fftCache.clear(); emit repaint(); @@ -71,6 +74,8 @@ int y = rect.y(); int plotHeight = rect.height(); + if (inputSource->realSignal()) + plotHeight *= 2; double bwPerPixel = (double)sampleRate / plotHeight; int tickHeight = 50; @@ -95,7 +100,8 @@ int tickpy = plotHeight / 2 - tick / bwPerPixel + y; int tickny = plotHeight / 2 + tick / bwPerPixel + y; - painter.drawLine(0, tickny, 30, tickny); + if (!inputSource->realSignal()) + painter.drawLine(0, tickny, 30, tickny); painter.drawLine(0, tickpy, 30, tickpy); if (tick != 0) { @@ -109,7 +115,8 @@ snprintf(buf, sizeof(buf), "-%d Hz", tick); } - painter.drawText(5, tickny - 5, buf); + if (!inputSource->realSignal()) + painter.drawText(5, tickny - 5, buf); buf[0] = ' '; painter.drawText(5, tickpy + 15, buf); @@ -128,7 +135,8 @@ int tickpy = plotHeight / 2 - tick / bwPerPixel + y; int tickny = plotHeight / 2 + tick / bwPerPixel + y; - painter.drawLine(0, tickny, 3, tickny); + if (!inputSource->realSignal()) + painter.drawLine(0, tickny, 3, tickny); painter.drawLine(0, tickpy, 3, tickpy); tick += bwPerTick; @@ -147,14 +155,14 @@ int xoffset = sampleOffset / getStride(); // Paint first (possibly partial) tile - painter.drawPixmap(QRect(rect.left(), rect.y(), linesPerTile() - xoffset, fftSize), *getPixmapTile(tileID), QRect(xoffset, 0, linesPerTile() - xoffset, fftSize)); + painter.drawPixmap(QRect(rect.left(), rect.y(), linesPerTile() - xoffset, height()), *getPixmapTile(tileID), QRect(xoffset, 0, linesPerTile() - xoffset, height())); tileID += getStride() * linesPerTile(); // Paint remaining tiles for (int x = linesPerTile() - xoffset; x < rect.right(); x += linesPerTile()) { // TODO: don't draw past rect.right() // TODO: handle partial final tile - painter.drawPixmap(QRect(x, rect.y(), linesPerTile(), fftSize), *getPixmapTile(tileID)); + painter.drawPixmap(QRect(x, rect.y(), linesPerTile(), height()), *getPixmapTile(tileID), QRect(0, 0, linesPerTile(), height())); tileID += getStride() * linesPerTile(); } } @@ -249,7 +257,7 @@ float cutoff = tuner.deviation() / (float)fftSize; float gain = pow(10.0f, powerMax / -10.0f); auto atten = 60.0f; - auto len = estimate_req_filter_len(0.05f, atten); + auto len = estimate_req_filter_len(std::min(cutoff, 0.05f), atten); auto taps = std::vector<float>(len); liquid_firdes_kaiser(len, cutoff, atten, 0.0f, taps.data()); std::transform(taps.begin(), taps.end(), taps.begin(), @@ -286,10 +294,14 @@ window[i] = 0.5f * (1.0f - cos(Tau * i / (fftSize - 1))); } - setHeight(fftSize); + if (inputSource->realSignal()) { + setHeight(fftSize/2); + } else { + setHeight(fftSize); + } auto dev = tuner.deviation(); auto centre = tuner.centre(); - tuner.setHeight(fftSize); + tuner.setHeight(height()); tuner.setDeviation( dev * sizeScale ); tuner.setCentre( centre * sizeScale ); } @@ -331,7 +343,7 @@ { tunerTransform->setFrequency(getTunerPhaseInc()); tunerTransform->setTaps(getTunerTaps()); - tunerTransform->setRelativeBandwith(tuner.deviation() * 2.0 / getStride()); + tunerTransform->setRelativeBandwith(tuner.deviation() * 2.0 / height()); // TODO: for invalidating traceplot cache, this shouldn't really go here QPixmapCache::clear(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/inspectrum-0.2.2+git.20180603/tunertransform.h new/inspectrum-0.2.2+git.20200527/tunertransform.h --- old/inspectrum-0.2.2+git.20180603/tunertransform.h 2018-06-03 12:12:59.000000000 +0200 +++ new/inspectrum-0.2.2+git.20200527/tunertransform.h 2020-05-27 19:08:54.000000000 +0200 @@ -35,5 +35,5 @@ void setFrequency(float frequency); void setTaps(std::vector<float> taps); void setRelativeBandwith(float bandwidth); - float relativeBandwidth(); + float relativeBandwidth() override; }; ++++++ inspectrum-fix-with-qt-5.15.patch ++++++ diff --git a/traceplot.cpp b/traceplot.cpp index 3704d24..04bdba8 100644 --- a/traceplot.cpp +++ b/traceplot.cpp @@ -20,6 +20,7 @@ #include <QPixmapCache> #include <QTextStream> #include <QtConcurrent> +#include <QPainterPath> #include "samplesource.h" #include "traceplot.h"
