From 8d357475399b6fceba1af4087172559a41f04f0a Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 30 May 2020 21:37:27 +0200 Subject: [PATCH] FileRecordInterface: true dynamic allocation - MIMO plugins --- .../samplemimo/bladerf2mimo/bladerf2mimo.cpp | 45 ++++++++++++++----- plugins/samplemimo/testmi/testmi.cpp | 43 ++++++++++++------ 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp index 9137822a6..e2e6fef57 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp @@ -70,6 +70,12 @@ BladeRF2MIMO::BladeRF2MIMO(DeviceAPI *deviceAPI) : } } + std::vector::iterator it = m_fileSinks.begin(); + + for (; it != m_fileSinks.end(); ++it) { + *it = nullptr; + } + m_mimoType = MIMOHalfSynchronous; m_sampleMIFifo.init(2, 4096 * 64); m_sampleMOFifo.init(2, 4096 * 64); @@ -91,8 +97,10 @@ BladeRF2MIMO::~BladeRF2MIMO() for (; it != m_fileSinks.end(); ++it, istream++) { - m_deviceAPI->removeAncillarySink(*it, istream); - delete *it; + if (*it) { + m_deviceAPI->removeAncillarySink(*it, istream); + delete *it; + } } } @@ -141,10 +149,6 @@ void BladeRF2MIMO::closeDevice() void BladeRF2MIMO::init() { - m_fileSinks.push_back(new FileRecord(QString("test_0_%1.sdriq").arg(m_deviceAPI->getDeviceUID()))); - m_fileSinks.push_back(new FileRecord(QString("test_1_%1.sdriq").arg(m_deviceAPI->getDeviceUID()))); - m_deviceAPI->addAncillarySink(m_fileSinks[0], 0); - m_deviceAPI->addAncillarySink(m_fileSinks[1], 1); applySettings(m_settings, true); } @@ -373,17 +377,26 @@ bool BladeRF2MIMO::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSinks[istream]->setFileName(m_settings.m_fileRecordName + "_0.sdriq"); - } else { - m_fileSinks[istream]->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID(), istream)); + if (m_fileSinks[istream]) + { + m_deviceAPI->removeAncillarySink(m_fileSinks[istream], istream); + delete m_fileSinks[istream]; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSinks[istream] = new FileRecord(QString("%1_%2.sdriq"). arg(m_settings.m_fileRecordName).arg(istream)); + } else { + m_fileSinks[istream] = new FileRecord(QString("%1.sdriq").arg(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID(), istream))); + } + + m_deviceAPI->addAncillarySink(m_fileSinks[istream], istream); m_fileSinks[istream]->startRecording(); } else { m_fileSinks[istream]->stopRecording(); + delete m_fileSinks[istream]; + m_fileSinks[istream] = nullptr; } return true; @@ -821,9 +834,17 @@ bool BladeRF2MIMO::applySettings(const BladeRF2MIMOSettings& settings, bool forc { int sampleRate = settings.m_devSampleRate/(1<handleMessage(*notifFileSink0); // forward to file sinks + + if (m_fileSinks[0]) { + m_fileSinks[0]->handleMessage(*notifFileSink0); // forward to file sinks + } + DSPSignalNotification *notifFileSink1 = new DSPSignalNotification(sampleRate, settings.m_rxCenterFrequency); - m_fileSinks[1]->handleMessage(*notifFileSink0); // forward to file sinks + + if (m_fileSinks[1]) { + m_fileSinks[1]->handleMessage(*notifFileSink0); // forward to file sinks + } + DSPMIMOSignalNotification *notif0 = new DSPMIMOSignalNotification(sampleRate, settings.m_rxCenterFrequency, true, 0); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif0); DSPMIMOSignalNotification *notif1 = new DSPMIMOSignalNotification(sampleRate, settings.m_rxCenterFrequency, true, 1); diff --git a/plugins/samplemimo/testmi/testmi.cpp b/plugins/samplemimo/testmi/testmi.cpp index bc518dcff..42f796f2a 100644 --- a/plugins/samplemimo/testmi/testmi.cpp +++ b/plugins/samplemimo/testmi/testmi.cpp @@ -51,7 +51,13 @@ TestMI::TestMI(DeviceAPI *deviceAPI) : { m_mimoType = MIMOAsynchronous; m_sampleMIFifo.init(2, 96000 * 4); - //m_sampleSinkVectors.resize(2); + + std::vector::iterator it = m_fileSinks.begin(); + + for (; it != m_fileSinks.end(); ++it) { + *it = nullptr; + } + m_deviceAPI->setNbSourceStreams(2); m_networkManager = new QNetworkAccessManager(); connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); @@ -71,8 +77,11 @@ TestMI::~TestMI() for (; it != m_fileSinks.end(); ++it, istream++) { - m_deviceAPI->removeAncillarySink(*it, istream); - delete *it; + if (*it) + { + m_deviceAPI->removeAncillarySink(*it, istream); + delete *it; + } } } @@ -83,11 +92,6 @@ void TestMI::destroy() void TestMI::init() { - m_fileSinks.push_back(new FileRecord(QString("test_0_%1.sdriq").arg(m_deviceAPI->getDeviceUID()))); - m_fileSinks.push_back(new FileRecord(QString("test_1_%1.sdriq").arg(m_deviceAPI->getDeviceUID()))); - m_deviceAPI->addAncillarySink(m_fileSinks[0], 0); - m_deviceAPI->addAncillarySink(m_fileSinks[1], 1); - applySettings(m_settings, true); } @@ -237,17 +241,26 @@ bool TestMI::handleMessage(const Message& message) if (conf.getStartStop()) { - if (m_settings.m_fileRecordName.size() != 0) { - m_fileSinks[istream]->setFileName(m_settings.m_fileRecordName + "_0.sdriq"); - } else { - m_fileSinks[istream]->setFileName(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID(), istream)); + if (m_fileSinks[istream]) + { + m_deviceAPI->removeAncillarySink(m_fileSinks[istream], istream); + delete m_fileSinks[istream]; } + if (m_settings.m_fileRecordName.size() != 0) { + m_fileSinks[istream] = new FileRecord(QString("%1_%2.sdriq"). arg(m_settings.m_fileRecordName).arg(istream)); + } else { + m_fileSinks[istream] = new FileRecord(QString("%1.sdriq").arg(FileRecordInterface::genUniqueFileName(m_deviceAPI->getDeviceUID(), istream))); + } + + m_deviceAPI->addAncillarySink(m_fileSinks[istream], istream); m_fileSinks[istream]->startRecording(); } else { m_fileSinks[istream]->stopRecording(); + delete m_fileSinks[istream]; + m_fileSinks[istream] = nullptr; } return true; @@ -464,7 +477,11 @@ bool TestMI::applySettings(const TestMISettings& settings, bool force) { int sampleRate = settings.m_streams[istream].m_sampleRate/(1<handleMessage(notif); // forward to file sink + + if (m_fileSinks[istream]) { + m_fileSinks[istream]->handleMessage(notif); // forward to file sink + } + DSPMIMOSignalNotification *engineNotif = new DSPMIMOSignalNotification( sampleRate, settings.m_streams[istream].m_centerFrequency, true, istream); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(engineNotif);