diff --git a/plugins/samplesource/airspy/airspyinput.cpp b/plugins/samplesource/airspy/airspyinput.cpp index c2645e7e1..b1c1a58ca 100644 --- a/plugins/samplesource/airspy/airspyinput.cpp +++ b/plugins/samplesource/airspy/airspyinput.cpp @@ -330,7 +330,7 @@ bool AirspyInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/airspyhf/airspyhfinput.cpp b/plugins/samplesource/airspyhf/airspyhfinput.cpp index c8d67dcf4..7d9bffb8d 100644 --- a/plugins/samplesource/airspyhf/airspyhfinput.cpp +++ b/plugins/samplesource/airspyhf/airspyhfinput.cpp @@ -340,7 +340,7 @@ bool AirspyHFInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/bladerf1input/bladerf1input.cpp b/plugins/samplesource/bladerf1input/bladerf1input.cpp index 7a538d0c6..92b2e1077 100644 --- a/plugins/samplesource/bladerf1input/bladerf1input.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1input.cpp @@ -298,7 +298,7 @@ bool Bladerf1Input::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/bladerf2input/bladerf2input.cpp b/plugins/samplesource/bladerf2input/bladerf2input.cpp index 605c83fe2..5fee2f3d1 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2input.cpp @@ -726,7 +726,7 @@ bool BladeRF2Input::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/fcdpro/fcdproinput.cpp b/plugins/samplesource/fcdpro/fcdproinput.cpp index f43549c4d..af6304bc3 100644 --- a/plugins/samplesource/fcdpro/fcdproinput.cpp +++ b/plugins/samplesource/fcdpro/fcdproinput.cpp @@ -304,7 +304,7 @@ bool FCDProInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp index bbe3131e7..e4624c7c4 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp @@ -306,7 +306,7 @@ bool FCDProPlusInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index 80d1c0ff7..d78181947 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -279,7 +279,7 @@ bool HackRFInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp index ac022f926..c3c270b01 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp @@ -219,7 +219,7 @@ bool KiwiSDRInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index c9fcb5455..eff01b1b7 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -755,7 +755,7 @@ bool LimeSDRInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/localinput/localinput.cpp b/plugins/samplesource/localinput/localinput.cpp index 9016418e0..b41234292 100644 --- a/plugins/samplesource/localinput/localinput.cpp +++ b/plugins/samplesource/localinput/localinput.cpp @@ -180,7 +180,7 @@ bool LocalInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/perseus/perseusinput.cpp b/plugins/samplesource/perseus/perseusinput.cpp index ab66e35b0..3ecfbedd4 100644 --- a/plugins/samplesource/perseus/perseusinput.cpp +++ b/plugins/samplesource/perseus/perseusinput.cpp @@ -214,7 +214,7 @@ bool PerseusInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp index 1bcb1704e..9d76d9c82 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp @@ -216,7 +216,7 @@ bool PlutoSDRInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/remoteinput/remoteinput.cpp b/plugins/samplesource/remoteinput/remoteinput.cpp index f2dc048bc..4b1c32bd1 100644 --- a/plugins/samplesource/remoteinput/remoteinput.cpp +++ b/plugins/samplesource/remoteinput/remoteinput.cpp @@ -177,7 +177,7 @@ bool RemoteInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index 71552fc94..a5ce495a2 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -327,7 +327,7 @@ bool RTLSDRInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/sdrplay/sdrplayinput.cpp b/plugins/samplesource/sdrplay/sdrplayinput.cpp index 297f625c7..f63093199 100644 --- a/plugins/samplesource/sdrplay/sdrplayinput.cpp +++ b/plugins/samplesource/sdrplay/sdrplayinput.cpp @@ -321,7 +321,7 @@ bool SDRPlayInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp index 71d8e3911..50e0c4889 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp @@ -807,7 +807,7 @@ bool SoapySDRInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/plugins/samplesource/testsource/testsourceinput.cpp b/plugins/samplesource/testsource/testsourceinput.cpp index c5f2a3dd9..29e0b0479 100644 --- a/plugins/samplesource/testsource/testsourceinput.cpp +++ b/plugins/samplesource/testsource/testsourceinput.cpp @@ -198,7 +198,7 @@ bool TestSourceInput::handleMessage(const Message& message) if (m_settings.m_fileRecordName.size() != 0) { m_fileSink->setFileName(m_settings.m_fileRecordName); } else { - m_fileSink->genUniqueFileName(m_deviceAPI->getDeviceUID()); + m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); } m_fileSink->startRecording(); diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index 06ba83230..e5ee119be 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -4,7 +4,9 @@ if(WIN32) set(OPUS_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/external/windows/libopus/include") set(OPUS_LIBRARIES "${CMAKE_SOURCE_DIR}/external/windows/libopus/lib/x64/libopus.lib") endif() + find_package(Opus REQUIRED) +find_package(LibSigMF) if(FFTW3F_FOUND) set(sdrbase_SOURCES @@ -99,6 +101,7 @@ set(sdrbase_SOURCES dsp/filterrc.cpp dsp/filtermbe.cpp dsp/filerecord.cpp + dsp/filerecordinterface.cpp dsp/freqlockcomplex.cpp dsp/interpolator.cpp dsp/glscopesettings.cpp @@ -227,6 +230,7 @@ set(sdrbase_HEADERS dsp/filterrc.h dsp/filtermbe.h dsp/filerecord.h + dsp/filerecordinterface.h dsp/freqlockcomplex.h dsp/gfft.h dsp/glscopesettings.h @@ -341,6 +345,7 @@ target_link_libraries(sdrbase ${sdrbase_FFTW3F_LIB} ${sdrbase_SERIALDV_LIB} ${sdrbase_LIMERFE_LIB} + ${sdrbase_LIBSIGMF_LIB} Qt5::Core Qt5::Multimedia Qt5::WebSockets diff --git a/sdrbase/dsp/filerecord.cpp b/sdrbase/dsp/filerecord.cpp index 3d7543512..5fca6b04a 100644 --- a/sdrbase/dsp/filerecord.cpp +++ b/sdrbase/dsp/filerecord.cpp @@ -19,7 +19,6 @@ #include #include -#include #include "dsp/dspcommands.h" #include "util/simpleserializer.h" @@ -64,15 +63,6 @@ void FileRecord::setFileName(const QString& filename) } } -void FileRecord::genUniqueFileName(uint deviceUID, int istream) -{ - if (istream < 0) { - setFileName(QString("rec%1_%2.sdriq").arg(deviceUID).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz"))); - } else { - setFileName(QString("rec%1_%2_%3.sdriq").arg(deviceUID).arg(istream).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz"))); - } -} - void FileRecord::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly) { (void) positiveOnly; diff --git a/sdrbase/dsp/filerecord.h b/sdrbase/dsp/filerecord.h index d0a855c0e..ac793e15e 100644 --- a/sdrbase/dsp/filerecord.h +++ b/sdrbase/dsp/filerecord.h @@ -18,17 +18,18 @@ #ifndef INCLUDE_FILERECORD_H #define INCLUDE_FILERECORD_H -#include #include #include #include - #include + +#include "dsp/basebandsamplesink.h" +#include "dsp/filerecordinterface.h" #include "export.h" class Message; -class SDRBASE_API FileRecord : public BasebandSampleSink { +class SDRBASE_API FileRecord : public BasebandSampleSink, public FileRecordInterface { public: #pragma pack(push, 1) @@ -49,15 +50,14 @@ public: quint64 getByteCount() const { return m_byteCount; } - void setFileName(const QString& filename); - void genUniqueFileName(uint deviceUID, int istream = -1); + virtual void setFileName(const QString& filename); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly); virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& message); - void startRecording(); - void stopRecording(); + virtual void startRecording(); + virtual void stopRecording(); bool isRecording() const { return m_recordOn; } static bool readHeader(std::ifstream& samplefile, Header& header); //!< returns true if CRC checksum is correct else false static void writeHeader(std::ofstream& samplefile, Header& header); diff --git a/sdrbase/dsp/filerecordinterface.cpp b/sdrbase/dsp/filerecordinterface.cpp new file mode 100644 index 000000000..a06fa8bb1 --- /dev/null +++ b/sdrbase/dsp/filerecordinterface.cpp @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2020 Edouard Griffiths, F4EXB // +// // +// File recorder in SigMF format single channel for SI plugins // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "filerecordinterface.h" + +QString FileRecordInterface::genUniqueFileName(unsigned int deviceUID, int istream) +{ + if (istream < 0) { + return QString("rec%1_%2.sdriq").arg(deviceUID).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz")); + } else { + return QString("rec%1_%2_%3.sdriq").arg(deviceUID).arg(istream).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz")); + } +} diff --git a/sdrbase/dsp/filerecordinterface.h b/sdrbase/dsp/filerecordinterface.h new file mode 100644 index 000000000..39146e94e --- /dev/null +++ b/sdrbase/dsp/filerecordinterface.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2020 Edouard Griffiths, F4EXB // +// // +// File recorder in SigMF format single channel for SI plugins // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_FILERECORD_INTERFACE_H +#define INCLUDE_FILERECORD_INTERFACE_H + +#include + +#include "export.h" + +class SDRBASE_API FileRecordInterface { +public: + virtual void setFileName(const QString &filename) = 0; + virtual void startRecording() = 0; + virtual void stopRecording() = 0; + static QString genUniqueFileName(unsigned int deviceUID, int istream = -1); +}; + + +#endif // INCLUDE_FILERECORD_INTERFACE_H \ No newline at end of file