diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp index 85fb2ebeb..4c062e739 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp @@ -36,6 +36,9 @@ FCDProPlusGui::FCDProPlusGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : m_sampleSource(NULL), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { + m_sampleSource = new FCDProPlusInput(m_deviceAPI); + m_deviceAPI->setSource(m_sampleSource); + ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); @@ -59,9 +62,6 @@ FCDProPlusGui::FCDProPlusGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : displaySettings(); - m_sampleSource = new FCDProPlusInput(m_deviceAPI); - m_deviceAPI->setSource(m_sampleSource); - char recFileNameCStr[30]; sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); m_fileSink = new FileRecord(std::string(recFileNameCStr)); diff --git a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp index 6769d542d..1878012d0 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusinput.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusinput.cpp @@ -38,33 +38,46 @@ FCDProPlusInput::FCDProPlusInput(DeviceSourceAPI *deviceAPI) : m_dev(0), m_settings(), m_FCDThread(0), - m_deviceDescription(fcd_traits::displayedName) + m_deviceDescription(fcd_traits::displayedName), + m_running(false) { + openDevice(); } FCDProPlusInput::~FCDProPlusInput() { - stop(); + if (m_running) stop(); + closeDevice(); +} + +bool FCDProPlusInput::openDevice() +{ + int device = m_deviceAPI->getSampleSourceSequence(); + qDebug() << "FCDProPlusInput::openDevice with device #" << device; + + m_dev = fcdOpen(fcd_traits::vendorId, fcd_traits::productId, device); + + if (m_dev == 0) + { + qCritical("FCDProPlusInput::start: could not open FCD"); + return false; + } + + return true; } bool FCDProPlusInput::start(int device) { - qDebug() << "FCDProPlusInput::start with device #" << device; - QMutexLocker mutexLocker(&m_mutex); +// QMutexLocker mutexLocker(&m_mutex); - if (m_FCDThread) - { - return false; - } + if (!m_dev) { + return false; + } - m_dev = fcdOpen(fcd_traits::vendorId, fcd_traits::productId, device); + if (m_running) stop(); - if (m_dev == 0) - { - qCritical("FCDProPlusInput::start: could not open FCD"); - return false; - } + qDebug() << "FCDProPlusInput::start"; /* Apply settings before streaming to avoid bus contention; * there is very little spare bandwidth on a full speed USB device. @@ -87,13 +100,21 @@ bool FCDProPlusInput::start(int device) m_FCDThread->startWork(); - mutexLocker.unlock(); +// mutexLocker.unlock(); applySettings(m_settings, true); qDebug("FCDProPlusInput::started"); + m_running = true; + return true; } +void FCDProPlusInput::closeDevice() +{ + fcdClose(m_dev); + m_dev = 0; +} + void FCDProPlusInput::stop() { QMutexLocker mutexLocker(&m_mutex); @@ -106,8 +127,7 @@ void FCDProPlusInput::stop() m_FCDThread = 0; } - fcdClose(m_dev); - m_dev = 0; + m_running = false; } const QString& FCDProPlusInput::getDeviceDescription() const diff --git a/plugins/samplesource/fcdproplus/fcdproplusinput.h b/plugins/samplesource/fcdproplus/fcdproplusinput.h index 9e1971a81..7ecec3357 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusinput.h +++ b/plugins/samplesource/fcdproplus/fcdproplusinput.h @@ -76,6 +76,8 @@ public: void set_lo_ppm(); private: + bool openDevice(); + void closeDevice(); void applySettings(const FCDProPlusSettings& settings, bool force); DeviceSourceAPI *m_deviceAPI; @@ -84,6 +86,7 @@ private: FCDProPlusSettings m_settings; FCDProPlusThread* m_FCDThread; QString m_deviceDescription; + bool m_running; }; #endif // INCLUDE_FCD_H