From c556a16caaa401baf9d31c8f56f8e2fcb4f7f1b4 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 11 May 2016 11:34:44 +0200 Subject: [PATCH] Prepare multi device support in DSP Engine --- sdrbase/dsp/dspengine.cpp | 106 ++++++++++++++++++++------------------ sdrbase/dsp/dspengine.h | 39 +++++++------- 2 files changed, 77 insertions(+), 68 deletions(-) diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index 70994cb58..0fa59bbee 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -22,13 +22,19 @@ DSPEngine::DSPEngine() : m_audioSampleRate(48000) // Use default output device at 48 kHz { - m_deviceEngine = new DSPDeviceEngine(); + m_deviceEngines.push_back(new DSPDeviceEngine()); m_dvSerialSupport = false; } DSPEngine::~DSPEngine() { - delete m_deviceEngine; + std::vector::iterator it = m_deviceEngines.begin(); + + while (it != m_deviceEngines.end()) + { + delete *it; + ++it; + } } Q_GLOBAL_STATIC(DSPEngine, dspEngine) @@ -37,90 +43,90 @@ DSPEngine *DSPEngine::instance() return dspEngine; } -MessageQueue* DSPEngine::getInputMessageQueue() +MessageQueue* DSPEngine::getInputMessageQueue(uint deviceIndex) { - return m_deviceEngine->getInputMessageQueue(); + return m_deviceEngines[deviceIndex]->getInputMessageQueue(); } -MessageQueue* DSPEngine::getOutputMessageQueue() +MessageQueue* DSPEngine::getOutputMessageQueue(uint deviceIndex) { - return m_deviceEngine->getOutputMessageQueue(); + return m_deviceEngines[deviceIndex]->getOutputMessageQueue(); } -void DSPEngine::start() +void DSPEngine::start(uint deviceIndex) { - qDebug("DSPEngine::start"); - m_deviceEngine->start(); + qDebug("DSPEngine::start(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->start(); } -void DSPEngine::stop() +void DSPEngine::stop(uint deviceIndex) { - qDebug("DSPEngine::stop"); - m_audioOutput.stop(); - m_deviceEngine->stop(); + qDebug("DSPEngine::stop(%d)", deviceIndex); + m_audioOutput.stop(); // FIXME: do not stop here since it is global + m_deviceEngines[deviceIndex]->stop(); } -bool DSPEngine::initAcquisition() +bool DSPEngine::initAcquisition(uint deviceIndex) { - qDebug("DSPEngine::initAcquisition"); - return m_deviceEngine->initAcquisition(); + qDebug("DSPEngine::initAcquisition(%d)", deviceIndex); + return m_deviceEngines[deviceIndex]->initAcquisition(); } -bool DSPEngine::startAcquisition() +bool DSPEngine::startAcquisition(uint deviceIndex) { - qDebug("DSPEngine::startAcquisition"); - bool started = m_deviceEngine->startAcquisition(); + qDebug("DSPEngine::startAcquisition(%d)", deviceIndex); + bool started = m_deviceEngines[deviceIndex]->startAcquisition(); if (started) { - m_audioOutput.start(-1, m_audioSampleRate); + m_audioOutput.start(-1, m_audioSampleRate); // FIXME: do not start here since it is global m_audioSampleRate = m_audioOutput.getRate(); // update with actual rate } return started; } -void DSPEngine::stopAcquistion() +void DSPEngine::stopAcquistion(uint deviceIndex) { - qDebug("DSPEngine::stopAcquistion"); + qDebug("DSPEngine::stopAcquistion(%d)", deviceIndex); m_audioOutput.stop(); - m_deviceEngine->stopAcquistion(); + m_deviceEngines[deviceIndex]->stopAcquistion(); } -void DSPEngine::setSource(SampleSource* source) +void DSPEngine::setSource(SampleSource* source, uint deviceIndex) { - qDebug("DSPEngine::setSource"); - m_deviceEngine->setSource(source); + qDebug("DSPEngine::setSource(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->setSource(source); } -void DSPEngine::setSourceSequence(int sequence) +void DSPEngine::setSourceSequence(int sequence, uint deviceIndex) { - qDebug("DSPEngine::setSource"); - m_deviceEngine->setSourceSequence(sequence); + qDebug("DSPEngine::setSource(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->setSourceSequence(sequence); } -void DSPEngine::addSink(SampleSink* sink) +void DSPEngine::addSink(SampleSink* sink, uint deviceIndex) { - qDebug("DSPEngine::setSource"); - m_deviceEngine->addSink(sink); + qDebug("DSPEngine::setSource(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->addSink(sink); } -void DSPEngine::removeSink(SampleSink* sink) +void DSPEngine::removeSink(SampleSink* sink, uint deviceIndex) { - qDebug("DSPEngine::removeSink"); - m_deviceEngine->removeSink(sink); + qDebug("DSPEngine::removeSink(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->removeSink(sink); } -void DSPEngine::addThreadedSink(ThreadedSampleSink* sink) +void DSPEngine::addThreadedSink(ThreadedSampleSink* sink, uint deviceIndex) { - qDebug("DSPEngine::addThreadedSink"); - m_deviceEngine->addThreadedSink(sink); + qDebug("DSPEngine::addThreadedSink(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->addThreadedSink(sink); } -void DSPEngine::removeThreadedSink(ThreadedSampleSink* sink) +void DSPEngine::removeThreadedSink(ThreadedSampleSink* sink, uint deviceIndex) { - qDebug("DSPEngine::addThreadedSink"); - m_deviceEngine->removeThreadedSink(sink); + qDebug("DSPEngine::removeThreadedSink(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->removeThreadedSink(sink); } void DSPEngine::addAudioSink(AudioFifo* audioFifo) @@ -135,25 +141,25 @@ void DSPEngine::removeAudioSink(AudioFifo* audioFifo) m_audioOutput.removeFifo(audioFifo); } -void DSPEngine::configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection) +void DSPEngine::configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection, uint deviceIndex) { - qDebug("DSPEngine::configureCorrections"); - m_deviceEngine->configureCorrections(dcOffsetCorrection, iqImbalanceCorrection); + qDebug("DSPEngine::configureCorrections(%d)", deviceIndex); + m_deviceEngines[deviceIndex]->configureCorrections(dcOffsetCorrection, iqImbalanceCorrection); } -DSPDeviceEngine::State DSPEngine::state() const +DSPDeviceEngine::State DSPEngine::state(uint deviceIndex) const { - return m_deviceEngine->state(); + return m_deviceEngines[deviceIndex]->state(); } -QString DSPEngine::errorMessage() +QString DSPEngine::errorMessage(uint deviceIndex) { - return m_deviceEngine->errorMessage(); + return m_deviceEngines[deviceIndex]->errorMessage(); } -QString DSPEngine::sourceDeviceDescription() +QString DSPEngine::sourceDeviceDescription(uint deviceIndex) { - return m_deviceEngine->sourceDeviceDescription(); + return m_deviceEngines[deviceIndex]->sourceDeviceDescription(); } void DSPEngine::setDVSerialSupport(bool support) diff --git a/sdrbase/dsp/dspengine.h b/sdrbase/dsp/dspengine.h index e7966f12c..285c5db3c 100644 --- a/sdrbase/dsp/dspengine.h +++ b/sdrbase/dsp/dspengine.h @@ -19,6 +19,7 @@ #define INCLUDE_DSPENGINE_H #include +#include #include "dsp/dspdeviceengine.h" #include "audio/audiooutput.h" #include "util/export.h" @@ -37,36 +38,38 @@ public: static DSPEngine *instance(); - MessageQueue* getInputMessageQueue(); - MessageQueue* getOutputMessageQueue(); + MessageQueue* getInputMessageQueue(uint deviceIndex = 0); + MessageQueue* getOutputMessageQueue(uint deviceIndex = 0); uint getAudioSampleRate() const { return m_audioSampleRate; } - void start(); //!< Device engine(s) start - void stop(); //!< Device engine(s) stop + void start(uint deviceIndex = 0); //!< Device engine(s) start + void stop(uint deviceIndex = 0); //!< Device engine(s) stop - bool initAcquisition(); //!< Initialize acquisition sequence - bool startAcquisition(); //!< Start acquisition sequence - void stopAcquistion(); //!< Stop acquisition sequence + bool initAcquisition(uint deviceIndex = 0); //!< Initialize acquisition sequence + bool startAcquisition(uint deviceIndex = 0); //!< Start acquisition sequence + void stopAcquistion(uint deviceIndex = 0); //!< Stop acquisition sequence - void setSource(SampleSource* source); //!< Set the sample source type - void setSourceSequence(int sequence); //!< Set the sample source sequence in type + void setSource(SampleSource* source, uint deviceIndex = 0); //!< Set the sample source type + void setSourceSequence(int sequence, uint deviceIndex = 0); //!< Set the sample source sequence in type - void addSink(SampleSink* sink); //!< Add a sample sink - void removeSink(SampleSink* sink); //!< Remove a sample sink + void addSink(SampleSink* sink, uint deviceIndex = 0); //!< Add a sample sink + void removeSink(SampleSink* sink, uint deviceIndex = 0); //!< Remove a sample sink - void addThreadedSink(ThreadedSampleSink* sink); //!< Add a sample sink that will run on its own thread - void removeThreadedSink(ThreadedSampleSink* sink); //!< Remove a sample sink that runs on its own thread + void addThreadedSink(ThreadedSampleSink* sink, uint deviceIndex = 0); //!< Add a sample sink that will run on its own thread + void removeThreadedSink(ThreadedSampleSink* sink, uint deviceIndex = 0); //!< Remove a sample sink that runs on its own thread void addAudioSink(AudioFifo* audioFifo); //!< Add the audio sink void removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink - void configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection); //!< Configure DSP corrections + void configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection, uint deviceIndex = 0); //!< Configure DSP corrections - DSPDeviceEngine::State state() const; + DSPDeviceEngine::State state(uint deviceIndex = 0) const; - QString errorMessage(); //!< Return the current error message - QString sourceDeviceDescription(); //!< Return the source device description + QString errorMessage(uint deviceIndex = 0); //!< Return the current error message + QString sourceDeviceDescription(uint deviceIndex = 0); //!< Return the source device description + + // Serial DV methods: bool hasDVSerialSupport() { @@ -94,7 +97,7 @@ public: } private: - DSPDeviceEngine *m_deviceEngine; + std::vector m_deviceEngines; AudioOutput m_audioOutput; uint m_audioSampleRate; bool m_dvSerialSupport;