mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-02-03 09:44:01 -05:00
Deep redesign: debug phase #2: App starting
This commit is contained in:
parent
d23da25354
commit
d6ae378e52
@ -153,6 +153,7 @@ private:
|
||||
AudioFifo* m_audioFifo;
|
||||
};
|
||||
|
||||
/*
|
||||
class SDRANGELOVE_API DSPConfigureSpectrumVis : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
@ -172,7 +173,7 @@ private:
|
||||
int m_fftSize;
|
||||
int m_overlapPercent;
|
||||
FFTWindow::Function m_window;
|
||||
};
|
||||
};*/
|
||||
|
||||
class SDRANGELOVE_API DSPConfigureCorrection : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
@ -127,7 +127,7 @@ private slots:
|
||||
void handleData(); //!< Handle data when samples from source FIFO are ready to be processed
|
||||
void handleSourceMessages(); //!< Handle source message output
|
||||
void handleInputMessages(); //!< Handle input message queue
|
||||
void handleSynchronousMessages(const Message& message); //!< Handle synchronous messages with the thread
|
||||
void handleSynchronousMessages(); //!< Handle synchronous messages with the thread
|
||||
};
|
||||
|
||||
#endif // INCLUDE_DSPENGINE_H
|
||||
|
@ -5,12 +5,35 @@
|
||||
#include "dsp/fftengine.h"
|
||||
#include "fftwindow.h"
|
||||
#include "util/export.h"
|
||||
#include "util/message.h"
|
||||
|
||||
class GLSpectrum;
|
||||
class MessageQueue;
|
||||
|
||||
class SDRANGELOVE_API SpectrumVis : public SampleSink {
|
||||
|
||||
public:
|
||||
class SDRANGELOVE_API MsgConfigureSpectrumVis : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
MsgConfigureSpectrumVis(int fftSize, int overlapPercent, FFTWindow::Function window) :
|
||||
Message(),
|
||||
m_fftSize(fftSize),
|
||||
m_overlapPercent(overlapPercent),
|
||||
m_window(window)
|
||||
{ }
|
||||
|
||||
int getFFTSize() const { return m_fftSize; }
|
||||
int getOverlapPercent() const { return m_overlapPercent; }
|
||||
FFTWindow::Function getWindow() const { return m_window; }
|
||||
|
||||
private:
|
||||
int m_fftSize;
|
||||
int m_overlapPercent;
|
||||
FFTWindow::Function m_window;
|
||||
};
|
||||
|
||||
SpectrumVis(GLSpectrum* glSpectrum = NULL);
|
||||
virtual ~SpectrumVis();
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <QMainWindow>
|
||||
#include <QTimer>
|
||||
#include "settings/settings.h"
|
||||
#include "util/messagequeue.h"
|
||||
#include "util/export.h"
|
||||
|
||||
class QLabel;
|
||||
@ -36,7 +37,6 @@ class SampleSource;
|
||||
class PluginAPI;
|
||||
class PluginGUI;
|
||||
class ChannelMarker;
|
||||
class MessageQueue;
|
||||
class PluginManager;
|
||||
class PluginInterface;
|
||||
|
||||
@ -51,7 +51,7 @@ public:
|
||||
explicit MainWindow(QWidget* parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
MessageQueue* getMessageQueue() { return m_messageQueue; }
|
||||
MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
|
||||
void addChannelCreateAction(QAction* action);
|
||||
void addChannelRollup(QWidget* widget);
|
||||
@ -73,7 +73,7 @@ private:
|
||||
|
||||
AudioDeviceInfo* m_audioDeviceInfo;
|
||||
|
||||
MessageQueue* m_messageQueue;
|
||||
MessageQueue m_inputMessageQueue;
|
||||
|
||||
Settings m_settings;
|
||||
|
||||
|
@ -120,8 +120,8 @@ private:
|
||||
SampleSourceRegistrations m_sampleSourceRegistrations;
|
||||
SampleSourceDevices m_sampleSourceDevices;
|
||||
|
||||
QString m_sampleSource;
|
||||
PluginGUI* m_sampleSourceInstance;
|
||||
QString m_sampleSourceName;
|
||||
PluginGUI* m_sampleSourcePluginGUI;
|
||||
|
||||
void loadPlugins(const QDir& dir);
|
||||
void renameChannelInstances();
|
||||
|
@ -9,6 +9,7 @@
|
||||
class Message;
|
||||
|
||||
class SDRANGELOVE_API SampleSink : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SampleSink();
|
||||
virtual ~SampleSink();
|
||||
@ -22,9 +23,11 @@ public:
|
||||
MessageQueue *getOutputMessageQueue() { return &m_outputMessageQueue; } //!< Get the queue for asynchronous outbound communication
|
||||
|
||||
protected:
|
||||
void handleInputMessages();
|
||||
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
||||
MessageQueue m_outputMessageQueue; //!< Queue for asynchronous outbound communication
|
||||
|
||||
protected slots:
|
||||
void handleInputMessages();
|
||||
};
|
||||
|
||||
#endif // INCLUDE_SAMPLESINK_H
|
||||
|
@ -45,7 +45,7 @@ public:
|
||||
void start(); //!< this thread start()
|
||||
void stop(); //!< this thread exit() and wait()
|
||||
|
||||
bool sendWaitSink(const Message& cmd); //!< Send message to sink synchronously
|
||||
bool sendWaitSink(Message& cmd); //!< Send message to sink synchronously
|
||||
void feed(SampleVector::const_iterator& begin, SampleVector::const_iterator& end, bool positiveOnly); //!< Feed sink with samples
|
||||
|
||||
QString getSampleSinkObjectName() const;
|
||||
@ -56,7 +56,9 @@ protected:
|
||||
|
||||
private:
|
||||
void run(); //!< this thread run() method
|
||||
void handleSynchronousMessages(const Message& message); //!< Handle synchronous messages with the thread
|
||||
|
||||
private slots:
|
||||
void handleSynchronousMessages(); //!< Handle synchronous messages with the thread
|
||||
};
|
||||
|
||||
#endif // INCLUDE_THREADEDSAMPLESINK_H
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
virtual PluginGUI* createChannel(const QString& channelName) { return NULL; }
|
||||
|
||||
virtual SampleSourceDevices enumSampleSources() { return SampleSourceDevices(); }
|
||||
virtual PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address) { return NULL; }
|
||||
virtual PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address) { return NULL; }
|
||||
};
|
||||
|
||||
Q_DECLARE_INTERFACE(PluginInterface, "de.maintech.SDRangelove.PluginInterface/0.1");
|
||||
|
@ -36,16 +36,18 @@ public:
|
||||
SyncMessenger();
|
||||
~SyncMessenger();
|
||||
|
||||
int sendWait(const Message& message, unsigned long msPollTime = 100); //!< Send message and waits for its process completion
|
||||
int sendWait(Message& message, unsigned long msPollTime = 100); //!< Send message and waits for its process completion
|
||||
Message* getMessage() const { return m_message; }
|
||||
void done(int result = 0); //!< Processing of the message is complete
|
||||
|
||||
signals:
|
||||
void messageSent(const Message& message);
|
||||
void messageSent();
|
||||
|
||||
protected:
|
||||
QWaitCondition m_waitCondition;
|
||||
QMutex m_mutex;
|
||||
QAtomicInt m_complete;
|
||||
Message *m_message;
|
||||
int m_result;
|
||||
};
|
||||
|
||||
|
@ -64,7 +64,7 @@ PluginInterface::SampleSourceDevices BlderfPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* BlderfPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* BlderfPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.bladerf") {
|
||||
BladerfGui* gui = new BladerfGui(m_pluginAPI);
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -43,7 +43,7 @@ PluginInterface::SampleSourceDevices FCDPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* FCDPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* FCDPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.fcd") {
|
||||
FCDGui* gui = new FCDGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -65,7 +65,7 @@ PluginInterface::SampleSourceDevices FileSourcePlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* FileSourcePlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* FileSourcePlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.filesource") {
|
||||
FileSourceGui* gui = new FileSourceGui(m_pluginAPI);
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -40,7 +40,7 @@ PluginInterface::SampleSourceDevices GNURadioPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* GNURadioPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* GNURadioPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.gr-osmosdr") {
|
||||
GNURadioGui* gui = new GNURadioGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -57,7 +57,7 @@ PluginInterface::SampleSourceDevices OsmoSDRPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* OsmoSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* OsmoSDRPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.osmo-sdr") {
|
||||
OsmoSDRGui* gui = new OsmoSDRGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -55,7 +55,7 @@ PluginInterface::SampleSourceDevices RTLSDRPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* RTLSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* RTLSDRPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.rtl-sdr") {
|
||||
RTLSDRGui* gui = new RTLSDRGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -43,7 +43,7 @@ PluginInterface::SampleSourceDevices V4LPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* V4LPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* V4LPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.v4l") {
|
||||
V4LGui* gui = new V4LGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -44,7 +44,7 @@ PluginInterface::SampleSourceDevices V4LPlugin::enumSampleSources()
|
||||
return result;
|
||||
}
|
||||
|
||||
PluginGUI* V4LPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||
PluginGUI* V4LPlugin::createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address)
|
||||
{
|
||||
if(sourceName == "org.osmocom.sdr.samplesource.v4l") {
|
||||
V4LGui* gui = new V4LGui(m_pluginAPI);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
|
||||
SampleSourceDevices enumSampleSources();
|
||||
PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address);
|
||||
PluginGUI* createSampleSourcePluginGUI(const QString& sourceName, const QByteArray& address);
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -31,7 +31,7 @@ MESSAGE_CLASS_DEFINITION(DSPAddThreadedSink, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPRemoveThreadedSink, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPAddAudioSink, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPRemoveAudioSink, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPConfigureSpectrumVis, Message)
|
||||
//MESSAGE_CLASS_DEFINITION(DSPConfigureSpectrumVis, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPConfigureCorrection, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPEngineReport, Message)
|
||||
MESSAGE_CLASS_DEFINITION(DSPConfigureScopeVis, Message)
|
||||
|
@ -59,11 +59,11 @@ void DSPEngine::run()
|
||||
qDebug() << "DSPEngine::run";
|
||||
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
||||
connect(&m_syncMessenger, SIGNAL(messageSent(const Message&)), this, SLOT(handleSynchronousMessages(const Message&)), Qt::QueuedConnection);
|
||||
connect(&m_syncMessenger, SIGNAL(messageSent()), this, SLOT(handleSynchronousMessages()), Qt::QueuedConnection);
|
||||
|
||||
m_state = StIdle;
|
||||
|
||||
//handleInputMessages();
|
||||
m_syncMessenger.done(); // Release start() that is waiting in main trhead
|
||||
exec();
|
||||
}
|
||||
|
||||
@ -87,7 +87,7 @@ bool DSPEngine::initAcquisition()
|
||||
qDebug() << "DSPEngine::initAcquisition";
|
||||
DSPAcquisitionInit cmd;
|
||||
|
||||
return m_syncMessenger.sendWait(cmd) == StReady;
|
||||
return m_syncMessenger.sendWait(cmd) == StReady;
|
||||
}
|
||||
|
||||
bool DSPEngine::startAcquisition()
|
||||
@ -189,8 +189,6 @@ void DSPEngine::dcOffset(SampleVector::iterator begin, SampleVector::iterator en
|
||||
int qo = 0;
|
||||
Sample corr((qint16)m_iOffset, (qint16)m_qOffset);
|
||||
|
||||
qDebug() << "DSPEngine::dcOffset";
|
||||
|
||||
// sum and correct in one pass
|
||||
for(SampleVector::iterator it = begin; it < end; it++)
|
||||
{
|
||||
@ -212,8 +210,6 @@ void DSPEngine::imbalance(SampleVector::iterator begin, SampleVector::iterator e
|
||||
int qMin = 0;
|
||||
int qMax = 0;
|
||||
|
||||
qDebug() << "DSPEngine::imbalance";
|
||||
|
||||
// find value ranges for both I and Q
|
||||
// both intervals should be same same size (for a perfect circle)
|
||||
for (SampleVector::iterator it = begin; it < end; it++)
|
||||
@ -258,8 +254,6 @@ void DSPEngine::imbalance(SampleVector::iterator begin, SampleVector::iterator e
|
||||
|
||||
void DSPEngine::work()
|
||||
{
|
||||
qDebug() << "DSPEngine::work";
|
||||
|
||||
SampleFifo* sampleFifo = m_sampleSource->getSampleFifo();
|
||||
std::size_t samplesDone = 0;
|
||||
bool positiveOnly = false;
|
||||
@ -503,90 +497,77 @@ void DSPEngine::handleSetSource(SampleSource* source)
|
||||
|
||||
void DSPEngine::handleData()
|
||||
{
|
||||
qDebug() << "DSPEngine::handleData";
|
||||
|
||||
if(m_state == StRunning)
|
||||
{
|
||||
work();
|
||||
}
|
||||
}
|
||||
|
||||
void DSPEngine::handleSynchronousMessages(const Message& message)
|
||||
void DSPEngine::handleSynchronousMessages()
|
||||
{
|
||||
qDebug() << "DSPEngine::handleSynchronousMessages";
|
||||
Message *message = m_syncMessenger.getMessage();
|
||||
|
||||
if (DSPExit::match(message))
|
||||
if (DSPExit::match(*message))
|
||||
{
|
||||
gotoIdle();
|
||||
m_state = StNotStarted;
|
||||
exit();
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPAcquisitionInit::match(message))
|
||||
else if (DSPAcquisitionInit::match(*message))
|
||||
{
|
||||
m_state = gotoIdle();
|
||||
|
||||
if(m_state == StIdle) {
|
||||
m_state = gotoInit(); // State goes ready if init is performed
|
||||
}
|
||||
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPAcquisitionStart::match(message))
|
||||
else if (DSPAcquisitionStart::match(*message))
|
||||
{
|
||||
if(m_state == StReady) {
|
||||
m_state = gotoRunning();
|
||||
}
|
||||
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPAcquisitionStop::match(message))
|
||||
else if (DSPAcquisitionStop::match(*message))
|
||||
{
|
||||
m_state = gotoIdle();
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPGetSourceDeviceDescription::match(message))
|
||||
else if (DSPGetSourceDeviceDescription::match(*message))
|
||||
{
|
||||
((DSPGetSourceDeviceDescription&) message).setDeviceDescription(m_deviceDescription);
|
||||
m_syncMessenger.done(m_state);
|
||||
((DSPGetSourceDeviceDescription*) message)->setDeviceDescription(m_deviceDescription);
|
||||
}
|
||||
else if (DSPGetErrorMessage::match(message))
|
||||
else if (DSPGetErrorMessage::match(*message))
|
||||
{
|
||||
((DSPGetErrorMessage&) message).setErrorMessage(m_errorMessage);
|
||||
m_syncMessenger.done(m_state);
|
||||
((DSPGetErrorMessage*) message)->setErrorMessage(m_errorMessage);
|
||||
}
|
||||
else if (DSPSetSource::match(message)) {
|
||||
handleSetSource(((DSPSetSource&) message).getSampleSource());
|
||||
m_syncMessenger.done(m_state);
|
||||
else if (DSPSetSource::match(*message)) {
|
||||
handleSetSource(((DSPSetSource*) message)->getSampleSource());
|
||||
}
|
||||
else if (DSPAddSink::match(message))
|
||||
else if (DSPAddSink::match(*message))
|
||||
{
|
||||
SampleSink* sink = ((DSPAddSink&)message).getSampleSink();
|
||||
SampleSink* sink = ((DSPAddSink*) message)->getSampleSink();
|
||||
m_sampleSinks.push_back(sink);
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPRemoveSink::match(message))
|
||||
else if (DSPRemoveSink::match(*message))
|
||||
{
|
||||
SampleSink* sink = ((DSPRemoveSink&)message).getSampleSink();
|
||||
SampleSink* sink = ((DSPRemoveSink*) message)->getSampleSink();
|
||||
|
||||
if(m_state == StRunning) {
|
||||
sink->stop();
|
||||
}
|
||||
|
||||
m_sampleSinks.remove(sink);
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPAddThreadedSink::match(message))
|
||||
else if (DSPAddThreadedSink::match(*message))
|
||||
{
|
||||
SampleSink* sink = ((DSPAddThreadedSink&) message).getSampleSink();
|
||||
SampleSink* sink = ((DSPAddThreadedSink*) message)->getSampleSink();
|
||||
ThreadedSampleSink *threadedSink = new ThreadedSampleSink(sink);
|
||||
m_threadedSampleSinks.push_back(threadedSink);
|
||||
threadedSink->start();
|
||||
m_syncMessenger.done(m_state);
|
||||
}
|
||||
else if (DSPRemoveThreadedSink::match(message))
|
||||
else if (DSPRemoveThreadedSink::match(*message))
|
||||
{
|
||||
SampleSink* sink = ((DSPRemoveThreadedSink&) message).getSampleSink();
|
||||
SampleSink* sink = ((DSPRemoveThreadedSink*) message)->getSampleSink();
|
||||
ThreadedSampleSinks::iterator threadedSinkIt = m_threadedSampleSinks.begin();
|
||||
|
||||
for (; threadedSinkIt != m_threadedSampleSinks.end(); ++threadedSinkIt)
|
||||
@ -608,15 +589,13 @@ void DSPEngine::handleSynchronousMessages(const Message& message)
|
||||
delete (*threadedSinkIt);
|
||||
}
|
||||
}
|
||||
else if (DSPAddAudioSink::match(message))
|
||||
else if (DSPAddAudioSink::match(*message))
|
||||
{
|
||||
m_audioSink.addFifo(((DSPAddAudioSink&) message).getAudioFifo());
|
||||
m_syncMessenger.done(m_state);
|
||||
m_audioSink.addFifo(((DSPAddAudioSink*) message)->getAudioFifo());
|
||||
}
|
||||
else if (DSPRemoveAudioSink::match(message))
|
||||
else if (DSPRemoveAudioSink::match(*message))
|
||||
{
|
||||
m_audioSink.removeFifo(((DSPRemoveAudioSink&) message).getAudioFifo());
|
||||
m_syncMessenger.done(m_state);
|
||||
m_audioSink.removeFifo(((DSPRemoveAudioSink*) message)->getAudioFifo());
|
||||
}
|
||||
|
||||
m_syncMessenger.done(m_state);
|
||||
@ -630,7 +609,7 @@ void DSPEngine::handleInputMessages()
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
qDebug("DSPEngine::handleInputMessages: Message: %s", message->getIdentifier());
|
||||
qDebug(" - message: %s", message->getIdentifier());
|
||||
|
||||
if (DSPConfigureCorrection::match(*message))
|
||||
{
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
SampleSink::SampleSink()
|
||||
{
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessage()));
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
}
|
||||
|
||||
SampleSink::~SampleSink()
|
||||
|
@ -12,6 +12,8 @@ double log2f(double n)
|
||||
}
|
||||
#endif
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgConfigureSpectrumVis, Message)
|
||||
|
||||
SpectrumVis::SpectrumVis(GLSpectrum* glSpectrum) :
|
||||
SampleSink(),
|
||||
m_fft(FFTEngine::create()),
|
||||
@ -32,7 +34,7 @@ SpectrumVis::~SpectrumVis()
|
||||
|
||||
void SpectrumVis::configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, FFTWindow::Function window)
|
||||
{
|
||||
DSPConfigureSpectrumVis* cmd = new DSPConfigureSpectrumVis(fftSize, overlapPercent, window);
|
||||
MsgConfigureSpectrumVis* cmd = new MsgConfigureSpectrumVis(fftSize, overlapPercent, window);
|
||||
msgQueue->push(cmd);
|
||||
}
|
||||
|
||||
@ -138,9 +140,9 @@ void SpectrumVis::stop()
|
||||
|
||||
bool SpectrumVis::handleMessage(const Message& message)
|
||||
{
|
||||
if (DSPConfigureSpectrumVis::match(message))
|
||||
if (MsgConfigureSpectrumVis::match(message))
|
||||
{
|
||||
DSPConfigureSpectrumVis& conf = (DSPConfigureSpectrumVis&) message;
|
||||
MsgConfigureSpectrumVis& conf = (MsgConfigureSpectrumVis&) message;
|
||||
handleConfigure(conf.getFFTSize(), conf.getOverlapPercent(), conf.getWindow());
|
||||
return true;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <QThread>
|
||||
#include <QDebug>
|
||||
#include "dsp/threadedsamplesink.h"
|
||||
#include "dsp/dspcommands.h"
|
||||
#include "util/message.h"
|
||||
|
||||
ThreadedSampleSink::ThreadedSampleSink(SampleSink* sampleSink) :
|
||||
@ -16,18 +17,24 @@ ThreadedSampleSink::~ThreadedSampleSink()
|
||||
|
||||
void ThreadedSampleSink::start()
|
||||
{
|
||||
qDebug() << "ThreadedSampleSink::start";
|
||||
DSPPing cmd;
|
||||
QThread::start();
|
||||
m_syncMessenger.sendWait(cmd);
|
||||
}
|
||||
|
||||
void ThreadedSampleSink::stop()
|
||||
{
|
||||
qDebug() << "ThreadedSampleSink::stop";
|
||||
exit();
|
||||
wait();
|
||||
}
|
||||
|
||||
void ThreadedSampleSink::run()
|
||||
{
|
||||
connect(&m_syncMessenger, SIGNAL(messageSent(const Message&)), this, SLOT(handleSynchronousMessages(const Message&)), Qt::QueuedConnection);
|
||||
qDebug() << "ThreadedSampleSink::run";
|
||||
connect(&m_syncMessenger, SIGNAL(messageSent()), this, SLOT(handleSynchronousMessages()), Qt::QueuedConnection);
|
||||
m_syncMessenger.done(); // Release start() that is waiting in calling trhead
|
||||
exec();
|
||||
}
|
||||
|
||||
@ -36,14 +43,17 @@ void ThreadedSampleSink::feed(SampleVector::const_iterator& begin, SampleVector:
|
||||
m_sampleSink->feed(begin, end, positiveOnly);
|
||||
}
|
||||
|
||||
bool ThreadedSampleSink::sendWaitSink(const Message& cmd)
|
||||
bool ThreadedSampleSink::sendWaitSink(Message& cmd)
|
||||
{
|
||||
m_syncMessenger.sendWait(cmd);
|
||||
}
|
||||
|
||||
void ThreadedSampleSink::handleSynchronousMessages(const Message& message)
|
||||
void ThreadedSampleSink::handleSynchronousMessages()
|
||||
{
|
||||
m_sampleSink->handleMessage(message); // just delegate to the sink
|
||||
qDebug() << "ThreadedSampleSink::handleSynchronousMessages";
|
||||
Message *message = m_syncMessenger.getMessage();
|
||||
qDebug() << " - message: " << message->getIdentifier();
|
||||
m_sampleSink->handleMessage(*message); // just delegate to the sink
|
||||
m_syncMessenger.done();
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow),
|
||||
m_audioDeviceInfo(new AudioDeviceInfo),
|
||||
m_messageQueue(new MessageQueue),
|
||||
m_settings(),
|
||||
m_dspEngine(DSPEngine::instance()),
|
||||
m_lastEngineState((DSPEngine::State)-1),
|
||||
@ -85,7 +84,7 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||
ui->menu_Window->addAction(ui->presetDock->toggleViewAction());
|
||||
ui->menu_Window->addAction(ui->channelDock->toggleViewAction());
|
||||
|
||||
connect(m_messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
|
||||
//connect(m_dspEngine->getReportQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection);
|
||||
|
||||
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
||||
@ -108,7 +107,7 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||
m_dspEngine->addSink(m_fileSink);
|
||||
|
||||
ui->glSpectrum->connectTimer(m_masterTimer);
|
||||
ui->glSpectrumGUI->setBuddies(m_dspEngine->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
|
||||
ui->glSpectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
|
||||
|
||||
loadSettings();
|
||||
|
||||
@ -141,7 +140,6 @@ MainWindow::~MainWindow()
|
||||
|
||||
m_dspEngine->stop();
|
||||
|
||||
delete m_messageQueue;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
@ -345,7 +343,7 @@ void MainWindow::handleMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_messageQueue->pop()) != 0)
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
qDebug("Message: %s", message->getIdentifier());
|
||||
std::cerr << "MainWindow::handleMessages: " << message->getIdentifier() << std::endl;
|
||||
|
@ -16,7 +16,7 @@ QDockWidget* PluginAPI::createMainWindowDock(Qt::DockWidgetArea dockWidgetArea,
|
||||
|
||||
MessageQueue* PluginAPI::getMainWindowMessageQueue()
|
||||
{
|
||||
return m_mainWindow->getMessageQueue();
|
||||
return m_mainWindow->getInputMessageQueue();
|
||||
}
|
||||
|
||||
void PluginAPI::setInputGUI(QWidget* inputGUI)
|
||||
|
@ -16,8 +16,8 @@ PluginManager::PluginManager(MainWindow* mainWindow, DSPEngine* dspEngine, QObje
|
||||
m_pluginAPI(this, mainWindow, dspEngine),
|
||||
m_mainWindow(mainWindow),
|
||||
m_dspEngine(dspEngine),
|
||||
m_sampleSource(),
|
||||
m_sampleSourceInstance(NULL)
|
||||
m_sampleSourceName(),
|
||||
m_sampleSourcePluginGUI(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@ -123,12 +123,16 @@ void PluginManager::loadSettings(const Preset* preset)
|
||||
|
||||
renameChannelInstances();
|
||||
|
||||
if(m_sampleSourceInstance != NULL) {
|
||||
qDebug() << "m_sampleSourceInstance->deserializeGeneral (" << m_sampleSourceInstance->getName().toStdString().c_str() << ")";
|
||||
m_sampleSourceInstance->deserializeGeneral(preset->getSourceGeneralConfig());
|
||||
if(m_sampleSource == preset->getSource()) {
|
||||
qDebug() << "m_sampleSourceInstance->deserialize";
|
||||
m_sampleSourceInstance->deserialize(preset->getSourceConfig());
|
||||
if(m_sampleSourcePluginGUI != 0)
|
||||
{
|
||||
/* FIXME: remove in pluginGUI and preset
|
||||
qDebug() << "m_sampleSourcePluginGUI->deserializeGeneral (" << m_sampleSourcePluginGUI->getName().toStdString().c_str() << ")";
|
||||
m_sampleSourcePluginGUI->deserializeGeneral(preset->getSourceGeneralConfig());
|
||||
*/
|
||||
if(m_sampleSourceName == preset->getSource())
|
||||
{
|
||||
qDebug() << "m_sampleSourcePluginGUI->deserialize (" << m_sampleSourceName .toStdString().c_str() << ")";
|
||||
m_sampleSourcePluginGUI->deserialize(preset->getSourceConfig());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -148,9 +152,9 @@ bool PluginManager::ChannelInstanceRegistration::operator<(const ChannelInstance
|
||||
|
||||
void PluginManager::saveSettings(Preset* preset)
|
||||
{
|
||||
if(m_sampleSourceInstance != NULL) {
|
||||
preset->setSourceConfig(m_sampleSource, m_sampleSourceInstance->serializeGeneral(), m_sampleSourceInstance->serialize());
|
||||
preset->setCenterFrequency(m_sampleSourceInstance->getCenterFrequency());
|
||||
if(m_sampleSourcePluginGUI != NULL) {
|
||||
preset->setSourceConfig(m_sampleSourceName, m_sampleSourcePluginGUI->serializeGeneral(), m_sampleSourcePluginGUI->serialize());
|
||||
preset->setCenterFrequency(m_sampleSourcePluginGUI->getCenterFrequency());
|
||||
} else {
|
||||
preset->setSourceConfig(QString::null, QByteArray(), QByteArray());
|
||||
}
|
||||
@ -169,21 +173,21 @@ void PluginManager::freeAll()
|
||||
reg.m_gui->destroy();
|
||||
}
|
||||
|
||||
if(m_sampleSourceInstance != NULL) {
|
||||
if(m_sampleSourcePluginGUI != NULL) {
|
||||
m_dspEngine->setSource(NULL);
|
||||
m_sampleSourceInstance->destroy();
|
||||
m_sampleSourceInstance = NULL;
|
||||
m_sampleSource.clear();
|
||||
m_sampleSourcePluginGUI->destroy();
|
||||
m_sampleSourcePluginGUI = NULL;
|
||||
m_sampleSourceName.clear();
|
||||
}
|
||||
}
|
||||
|
||||
bool PluginManager::handleMessage(const Message& message)
|
||||
{
|
||||
if (m_sampleSourceInstance != 0)
|
||||
if (m_sampleSourcePluginGUI != 0)
|
||||
{
|
||||
if ((message.getDestination() == 0) || (message.getDestination() == m_sampleSourceInstance))
|
||||
if ((message.getDestination() == 0) || (message.getDestination() == m_sampleSourcePluginGUI))
|
||||
{
|
||||
if (m_sampleSourceInstance->handleMessage(message))
|
||||
if (m_sampleSourcePluginGUI->handleMessage(message))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -227,18 +231,18 @@ int PluginManager::selectSampleSource(int index)
|
||||
|
||||
m_dspEngine->stopAcquistion();
|
||||
|
||||
if(m_sampleSourceInstance != NULL) {
|
||||
if(m_sampleSourcePluginGUI != NULL) {
|
||||
m_dspEngine->stopAcquistion();
|
||||
m_dspEngine->setSource(NULL);
|
||||
m_sampleSourceInstance->destroy();
|
||||
m_sampleSourceInstance = NULL;
|
||||
m_sampleSource.clear();
|
||||
m_sampleSourcePluginGUI->destroy();
|
||||
m_sampleSourcePluginGUI = NULL;
|
||||
m_sampleSourceName.clear();
|
||||
}
|
||||
|
||||
if(index == -1) {
|
||||
if(!m_sampleSource.isEmpty()) {
|
||||
if(!m_sampleSourceName.isEmpty()) {
|
||||
for(int i = 0; i < m_sampleSourceDevices.count(); i++) {
|
||||
if(m_sampleSourceDevices[i].m_sourceName == m_sampleSource) {
|
||||
if(m_sampleSourceDevices[i].m_sourceName == m_sampleSourceName) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
@ -252,9 +256,9 @@ int PluginManager::selectSampleSource(int index)
|
||||
if(index == -1)
|
||||
return -1;
|
||||
|
||||
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
||||
qDebug() << "m_sampleSource at index " << index << " is " << m_sampleSource.toStdString().c_str();
|
||||
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
||||
m_sampleSourceName = m_sampleSourceDevices[index].m_sourceName;
|
||||
qDebug() << "m_sampleSource at index " << index << " is " << m_sampleSourceName.toStdString().c_str();
|
||||
m_sampleSourcePluginGUI = m_sampleSourceDevices[index].m_plugin->createSampleSourcePluginGUI(m_sampleSourceName, m_sampleSourceDevices[index].m_address);
|
||||
return index;
|
||||
}
|
||||
|
||||
@ -266,12 +270,12 @@ int PluginManager::selectSampleSource(const QString& source)
|
||||
|
||||
m_dspEngine->stopAcquistion();
|
||||
|
||||
if(m_sampleSourceInstance != NULL) {
|
||||
if(m_sampleSourcePluginGUI != NULL) {
|
||||
m_dspEngine->stopAcquistion();
|
||||
m_dspEngine->setSource(NULL);
|
||||
m_sampleSourceInstance->destroy();
|
||||
m_sampleSourceInstance = NULL;
|
||||
m_sampleSource.clear();
|
||||
m_sampleSourcePluginGUI->destroy();
|
||||
m_sampleSourcePluginGUI = NULL;
|
||||
m_sampleSourceName.clear();
|
||||
}
|
||||
|
||||
qDebug("finding sample source [%s]", qPrintable(source));
|
||||
@ -289,9 +293,9 @@ int PluginManager::selectSampleSource(const QString& source)
|
||||
if(index == -1)
|
||||
return -1;
|
||||
|
||||
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
||||
qDebug() << "m_sampleSource at index " << index << " is " << m_sampleSource.toStdString().c_str();
|
||||
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
||||
m_sampleSourceName = m_sampleSourceDevices[index].m_sourceName;
|
||||
qDebug() << "m_sampleSource at index " << index << " is " << m_sampleSourceName.toStdString().c_str();
|
||||
m_sampleSourcePluginGUI = m_sampleSourceDevices[index].m_plugin->createSampleSourcePluginGUI(m_sampleSourceName, m_sampleSourceDevices[index].m_address);
|
||||
return index;
|
||||
}
|
||||
|
||||
|
@ -28,12 +28,13 @@ SyncMessenger::SyncMessenger() :
|
||||
SyncMessenger::~SyncMessenger()
|
||||
{}
|
||||
|
||||
int SyncMessenger::sendWait(const Message& message, unsigned long msPollTime)
|
||||
int SyncMessenger::sendWait(Message& message, unsigned long msPollTime)
|
||||
{
|
||||
m_message = &message;
|
||||
m_mutex.lock();
|
||||
m_complete.testAndSetAcquire(0, 1);
|
||||
|
||||
emit messageSent(message);
|
||||
emit messageSent();
|
||||
|
||||
while (!m_complete.testAndSetAcquire(0, 1))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user