diff --git a/plugins/samplesource/airspy/airspyinput.cpp b/plugins/samplesource/airspy/airspyinput.cpp index b1c1a58ca..3c36a26f3 100644 --- a/plugins/samplesource/airspy/airspyinput.cpp +++ b/plugins/samplesource/airspy/airspyinput.cpp @@ -49,17 +49,15 @@ const qint64 AirspyInput::loHighLimitFreq = 1900000000L; AirspyInput::AirspyInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), - m_dev(0), + m_dev(nullptr), m_airspyThread(0), m_deviceDescription("Airspy"), m_running(false) { openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); - m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } @@ -73,8 +71,12 @@ AirspyInput::~AirspyInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); } @@ -327,17 +329,27 @@ bool AirspyInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -578,7 +590,11 @@ bool AirspyInput::applySettings(const AirspySettings& settings, bool force) { int sampleRate = m_sampleRates[m_settings.m_devSampleRateIndex]/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/airspyhf/airspyhfinput.cpp b/plugins/samplesource/airspyhf/airspyhfinput.cpp index 7d9bffb8d..66d772c1f 100644 --- a/plugins/samplesource/airspyhf/airspyhfinput.cpp +++ b/plugins/samplesource/airspyhf/airspyhfinput.cpp @@ -51,6 +51,7 @@ const qint64 AirspyHFInput::loHighLimitFreqVHF = 260000000L; AirspyHFInput::AirspyHFInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_dev(0), m_airspyHFThread(0), @@ -74,8 +75,12 @@ AirspyHFInput::~AirspyHFInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); } @@ -337,17 +342,27 @@ bool AirspyHFInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -602,7 +617,11 @@ bool AirspyHFInput::applySettings(const AirspyHFSettings& settings, bool force) { int sampleRate = m_sampleRates[sampleRateIndex]/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/bladerf1input/bladerf1input.cpp b/plugins/samplesource/bladerf1input/bladerf1input.cpp index 92b2e1077..4085fb2d4 100644 --- a/plugins/samplesource/bladerf1input/bladerf1input.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1input.cpp @@ -44,6 +44,7 @@ MESSAGE_CLASS_DEFINITION(Bladerf1Input::MsgFileRecord, Message) Bladerf1Input::Bladerf1Input(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_dev(0), m_bladerfThread(0), @@ -70,8 +71,12 @@ Bladerf1Input::~Bladerf1Input() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); m_deviceAPI->setBuddySharedPtr(0); } @@ -295,17 +300,27 @@ bool Bladerf1Input::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -567,7 +582,11 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, bool fo { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/bladerf2input/bladerf2input.cpp b/plugins/samplesource/bladerf2input/bladerf2input.cpp index 5fee2f3d1..10e5ac39c 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2input.cpp @@ -47,6 +47,7 @@ MESSAGE_CLASS_DEFINITION(BladeRF2Input::MsgReportGainRange, Message) BladeRF2Input::BladeRF2Input(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_deviceDescription("BladeRF2Input"), m_running(false), @@ -67,9 +68,7 @@ BladeRF2Input::BladeRF2Input(DeviceAPI *deviceAPI) : } } - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } @@ -83,8 +82,12 @@ BladeRF2Input::~BladeRF2Input() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); } @@ -700,7 +703,11 @@ bool BladeRF2Input::handleMessage(const Message& message) { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } @@ -723,17 +730,27 @@ bool BladeRF2Input::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -964,7 +981,11 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/fcdpro/fcdproinput.cpp b/plugins/samplesource/fcdpro/fcdproinput.cpp index af6304bc3..a0230cf15 100644 --- a/plugins/samplesource/fcdpro/fcdproinput.cpp +++ b/plugins/samplesource/fcdpro/fcdproinput.cpp @@ -43,6 +43,7 @@ MESSAGE_CLASS_DEFINITION(FCDProInput::MsgFileRecord, Message) FCDProInput::FCDProInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_dev(0), m_settings(), m_FCDThread(0), @@ -51,9 +52,7 @@ FCDProInput::FCDProInput(DeviceAPI *deviceAPI) : { m_fcdFIFO.setSize(20*fcd_traits::convBufSize); openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } @@ -67,8 +66,11 @@ FCDProInput::~FCDProInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } closeDevice(); } @@ -301,17 +303,27 @@ bool FCDProInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -562,7 +574,11 @@ void FCDProInput::applySettings(const FCDProSettings& settings, bool force) if (forwardChange) { DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits::sampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } } diff --git a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp index e4624c7c4..5443e5ebd 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp @@ -43,6 +43,7 @@ MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgFileRecord, Message) FCDProPlusInput::FCDProPlusInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_dev(0), m_settings(), m_FCDThread(0), @@ -51,9 +52,7 @@ FCDProPlusInput::FCDProPlusInput(DeviceAPI *deviceAPI) : { m_fcdFIFO.setSize(20*fcd_traits::convBufSize); openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } @@ -67,8 +66,11 @@ FCDProPlusInput::~FCDProPlusInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } closeDevice(); } @@ -303,17 +305,27 @@ bool FCDProPlusInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -473,7 +485,11 @@ void FCDProPlusInput::applySettings(const FCDProPlusSettings& settings, bool for if (forwardChange) { DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits::sampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } } diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index d78181947..2a2bdae9a 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -45,6 +45,7 @@ MESSAGE_CLASS_DEFINITION(HackRFInput::MsgStartStop, Message) HackRFInput::HackRFInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_dev(0), m_hackRFThread(0), @@ -53,10 +54,7 @@ HackRFInput::HackRFInput(DeviceAPI *deviceAPI) : { openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); - m_deviceAPI->setBuddySharedPtr(&m_sharedParams); m_networkManager = new QNetworkAccessManager(); @@ -72,8 +70,12 @@ HackRFInput::~HackRFInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); m_deviceAPI->setBuddySharedPtr(0); } @@ -276,17 +278,27 @@ bool HackRFInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -337,7 +349,11 @@ bool HackRFInput::handleMessage(const Message& message) m_settings.m_centerFrequency = settings.m_centerFrequency; int sampleRate = m_settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); return true; @@ -562,7 +578,11 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp index c3c270b01..8c455d589 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp @@ -46,6 +46,7 @@ MESSAGE_CLASS_DEFINITION(KiwiSDRInput::MsgSetStatus, Message) KiwiSDRInput::KiwiSDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_kiwiSDRWorker(nullptr), m_deviceDescription(), @@ -54,9 +55,7 @@ KiwiSDRInput::KiwiSDRInput(DeviceAPI *deviceAPI) : { m_kiwiSDRWorkerThread.start(); - m_fileSink = new FileRecord(); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); if (!m_sampleFifo.setSize(getSampleRate() * 2)) { qCritical("KiwiSDRInput::KiwiSDRInput: Could not allocate SampleFifo"); @@ -78,8 +77,11 @@ KiwiSDRInput::~KiwiSDRInput() m_kiwiSDRWorkerThread.quit(); m_kiwiSDRWorkerThread.wait(); - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } } void KiwiSDRInput::destroy() @@ -216,17 +218,27 @@ bool KiwiSDRInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -318,7 +330,11 @@ bool KiwiSDRInput::applySettings(const KiwiSDRSettings& settings, bool force) DSPSignalNotification *notif = new DSPSignalNotification( getSampleRate(), settings.m_centerFrequency); - m_fileSink->handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index eff01b1b7..0ece323c1 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -52,6 +52,7 @@ MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgStartStop, Message) LimeSDRInput::LimeSDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_limeSDRInputThread(0), m_deviceDescription("LimeSDRInput"), @@ -65,9 +66,7 @@ LimeSDRInput::LimeSDRInput(DeviceAPI *deviceAPI) : resumeTxBuddies(); resumeRxBuddies(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -82,8 +81,12 @@ LimeSDRInput::~LimeSDRInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + suspendRxBuddies(); suspendTxBuddies(); closeDevice(); @@ -752,17 +755,27 @@ bool LimeSDRInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -1339,7 +1352,11 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc int sampleRate = m_settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/localinput/localinput.cpp b/plugins/samplesource/localinput/localinput.cpp index b41234292..dce0a796f 100644 --- a/plugins/samplesource/localinput/localinput.cpp +++ b/plugins/samplesource/localinput/localinput.cpp @@ -44,15 +44,14 @@ MESSAGE_CLASS_DEFINITION(LocalInput::MsgReportSampleRateAndFrequency, Message) LocalInput::LocalInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_centerFrequency(0), m_deviceDescription("LocalInput") { m_sampleFifo.setSize(96000 * 4); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -63,8 +62,12 @@ LocalInput::~LocalInput() disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; stop(); - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } } void LocalInput::destroy() @@ -168,7 +171,12 @@ bool LocalInput::handleMessage(const Message& message) if (DSPSignalNotification::match(message)) { DSPSignalNotification& notif = (DSPSignalNotification&) message; - return m_fileSink->handleMessage(notif); // forward to file sink + + if (m_fileSink) { + return m_fileSink->handleMessage(notif); // forward to file sink + } else { + return false; + } } else if (MsgFileRecord::match(message)) { @@ -177,17 +185,27 @@ bool LocalInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; diff --git a/plugins/samplesource/perseus/perseusinput.cpp b/plugins/samplesource/perseus/perseusinput.cpp index 3ecfbedd4..7254a4c64 100644 --- a/plugins/samplesource/perseus/perseusinput.cpp +++ b/plugins/samplesource/perseus/perseusinput.cpp @@ -41,16 +41,14 @@ MESSAGE_CLASS_DEFINITION(PerseusInput::MsgStartStop, Message) PerseusInput::PerseusInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), - m_fileSink(0), + m_fileSink(nullptr), m_deviceDescription("PerseusInput"), m_running(false), m_perseusThread(0), m_perseusDescriptor(0) { openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -61,8 +59,12 @@ PerseusInput::~PerseusInput() disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; - closeDevice(); + + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } } void PerseusInput::destroy() @@ -211,17 +213,27 @@ bool PerseusInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -421,7 +433,11 @@ bool PerseusInput::applySettings(const PerseusSettings& settings, bool force) { int sampleRate = m_sampleRates[sampleRateIndex]/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp index 9d76d9c82..43c55d928 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp @@ -44,7 +44,7 @@ MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgStartStop, Message) PlutoSDRInput::PlutoSDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), - m_fileSink(0), + m_fileSink(nullptr), m_deviceDescription("PlutoSDRInput"), m_running(false), m_plutoRxBuffer(0), @@ -66,9 +66,7 @@ PlutoSDRInput::PlutoSDRInput(DeviceAPI *deviceAPI) : resumeBuddies(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -78,8 +76,13 @@ PlutoSDRInput::~PlutoSDRInput() { disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + suspendBuddies(); closeDevice(); resumeBuddies(); @@ -213,17 +216,27 @@ bool PlutoSDRInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -748,7 +761,11 @@ bool PlutoSDRInput::applySettings(const PlutoSDRInputSettings& settings, bool fo int sampleRate = m_settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/remoteinput/remoteinput.cpp b/plugins/samplesource/remoteinput/remoteinput.cpp index 4b1c32bd1..8f6c26a61 100644 --- a/plugins/samplesource/remoteinput/remoteinput.cpp +++ b/plugins/samplesource/remoteinput/remoteinput.cpp @@ -48,6 +48,7 @@ MESSAGE_CLASS_DEFINITION(RemoteInput::MsgStartStop, Message) RemoteInput::RemoteInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_remoteInputUDPHandler(0), m_deviceDescription(), @@ -56,9 +57,7 @@ RemoteInput::RemoteInput(DeviceAPI *deviceAPI) : m_sampleFifo.setSize(96000 * 4); m_remoteInputUDPHandler = new RemoteInputUDPHandler(&m_sampleFifo, m_deviceAPI); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -69,9 +68,14 @@ RemoteInput::~RemoteInput() disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; stop(); - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; - delete m_remoteInputUDPHandler; + + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + + delete m_remoteInputUDPHandler; } void RemoteInput::destroy() @@ -165,7 +169,12 @@ bool RemoteInput::handleMessage(const Message& message) if (DSPSignalNotification::match(message)) { DSPSignalNotification& notif = (DSPSignalNotification&) message; - return m_fileSink->handleMessage(notif); // forward to file sink + + if (m_fileSink) { + return m_fileSink->handleMessage(notif); // forward to file sink + } else { + return false; + } } else if (MsgFileRecord::match(message)) { @@ -174,17 +183,27 @@ bool RemoteInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index a5ce495a2..d2f1778bd 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -52,6 +52,7 @@ const int RTLSDRInput::sampleRateHighRangeMax = 2400000U; RTLSDRInput::RTLSDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_dev(0), m_rtlSDRThread(0), @@ -59,11 +60,7 @@ RTLSDRInput::RTLSDRInput(DeviceAPI *deviceAPI) : m_running(false) { openDevice(); - - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); - m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } @@ -77,8 +74,11 @@ RTLSDRInput::~RTLSDRInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } closeDevice(); } @@ -324,17 +324,27 @@ bool RTLSDRInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -568,7 +578,11 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) { int sampleRate = m_settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/sdrplay/sdrplayinput.cpp b/plugins/samplesource/sdrplay/sdrplayinput.cpp index f63093199..bb024ba6e 100644 --- a/plugins/samplesource/sdrplay/sdrplayinput.cpp +++ b/plugins/samplesource/sdrplay/sdrplayinput.cpp @@ -46,6 +46,7 @@ MESSAGE_CLASS_DEFINITION(SDRPlayInput::MsgStartStop, Message) SDRPlayInput::SDRPlayInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_variant(SDRPlayUndef), m_settings(), m_dev(0), @@ -55,9 +56,7 @@ SDRPlayInput::SDRPlayInput(DeviceAPI *deviceAPI) : m_running(false) { openDevice(); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -72,8 +71,12 @@ SDRPlayInput::~SDRPlayInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } + closeDevice(); } @@ -318,17 +321,27 @@ bool SDRPlayInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -614,7 +627,11 @@ bool SDRPlayInput::applySettings(const SDRPlaySettings& settings, bool forwardCh { int sampleRate = getSampleRate(); DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency); - m_fileSink->handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp index 50e0c4889..e28d5489f 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp @@ -45,6 +45,7 @@ MESSAGE_CLASS_DEFINITION(SoapySDRInput::MsgReportGainChange, Message) SoapySDRInput::SoapySDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_deviceDescription("SoapySDRInput"), m_running(false), @@ -56,9 +57,7 @@ SoapySDRInput::SoapySDRInput(DeviceAPI *deviceAPI) : initStreamArgSettings(m_settings); initDeviceArgSettings(m_settings); - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -73,8 +72,11 @@ SoapySDRInput::~SoapySDRInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } closeDevice(); } @@ -804,17 +806,27 @@ bool SoapySDRInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -1270,7 +1282,11 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } diff --git a/plugins/samplesource/testsource/testsourceinput.cpp b/plugins/samplesource/testsource/testsourceinput.cpp index 29e0b0479..634d92a08 100644 --- a/plugins/samplesource/testsource/testsourceinput.cpp +++ b/plugins/samplesource/testsource/testsourceinput.cpp @@ -42,15 +42,14 @@ MESSAGE_CLASS_DEFINITION(TestSourceInput::MsgStartStop, Message) TestSourceInput::TestSourceInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), + m_fileSink(nullptr), m_settings(), m_testSourceThread(0), m_deviceDescription(), m_running(false), m_masterTimer(deviceAPI->getMasterTimer()) { - m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->setNbSourceStreams(1); - m_deviceAPI->addAncillarySink(m_fileSink); if (!m_sampleFifo.setSize(96000 * 4)) { qCritical("TestSourceInput::TestSourceInput: Could not allocate SampleFifo"); @@ -69,8 +68,11 @@ TestSourceInput::~TestSourceInput() stop(); } - m_deviceAPI->removeAncillarySink(m_fileSink); - delete m_fileSink; + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + } } void TestSourceInput::destroy() @@ -195,17 +197,27 @@ bool TestSourceInput::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSink->setFileName(m_settings.m_fileRecordName); - } else { - m_fileSink->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + if (m_fileSink) + { + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSink = new FileRecord(m_settings.m_fileRecordName); + } else { + m_fileSink = new FileRecord(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID())); + } + + m_deviceAPI->addAncillarySink(m_fileSink); m_fileSink->startRecording(); } else { m_fileSink->stopRecording(); + m_deviceAPI->removeAncillarySink(m_fileSink); + delete m_fileSink; + m_fileSink = nullptr; } return true; @@ -389,7 +401,11 @@ bool TestSourceInput::applySettings(const TestSourceSettings& settings, bool for { int sampleRate = settings.m_sampleRate/(1<handleMessage(*notif); // forward to file sink + + if (m_fileSink) { + m_fileSink->handleMessage(*notif); // forward to file sink + } + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); }