diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp index bb66eb41a..e0822da33 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp @@ -240,14 +240,14 @@ uint8_t *SDRdaemonBuffer::readData(uint32_t length) if (m_readCount + length < m_rawSize) { - m_readCount += length; return &m_rawBuffer[readCount]; + m_readCount += length; } else { - std::memcpy((void *) m_frameBuffer, (const void *) &m_rawBuffer[readCount], m_rawSize - m_rawCount); - m_readCount = length - (m_rawSize - m_rawCount); - std::memcpy((void *) m_frameBuffer, (const void *) &m_frameBuffer[m_rawSize - m_rawCount], m_readCount); + std::memcpy((void *) m_frameBuffer, (const void *) &m_rawBuffer[readCount], m_rawSize - m_readCount); // read last bit from raw buffer + m_readCount = length - (m_rawSize - m_readCount); + std::memcpy((void *) &m_frameBuffer[m_rawSize - m_readCount], (const void *) m_frameBuffer, m_readCount); // read the rest at start of raw buffer return m_frameBuffer; } } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp index f5005be78..3b172c93e 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp @@ -29,6 +29,42 @@ MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonUDPLink, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonWork, Message) +void SDRdaemonInput::updateLink(const QString& address, quint16 port) +{ + QMutexLocker mutexLocker(&m_mutex); + bool wasRunning = false; + + if ((m_address != address) || (m_port != port)) + { + if (m_SDRdaemonThread != 0) + { + wasRunning = m_SDRdaemonThread->isRunning(); + + if (wasRunning) + { + m_SDRdaemonThread->stopWork(); + } + } + + if (m_SDRdaemonThread != 0) + { + m_SDRdaemonThread->updateLink(address, port); + + if (wasRunning) + { + m_SDRdaemonThread->startWork(); + } + } + + m_address = address; + m_port = port; + + qDebug() << "SDRdaemonInput::updateLink:" + << " address: " << m_address.toStdString().c_str() + << "port: " << m_port; + } +} + MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonStreamTiming, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonAcquisition, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonStreamData, Message) @@ -72,7 +108,6 @@ bool SDRdaemonInput::start(int device) return false; } - m_SDRdaemonThread->setSamplerate(m_sampleRate); m_SDRdaemonThread->connectTimer(m_masterTimer); m_SDRdaemonThread->startWork(); m_deviceDescription = "SDRdaemon"; @@ -173,75 +208,3 @@ bool SDRdaemonInput::handleMessage(const Message& message) } } -void SDRdaemonInput::updateLink(const QString& address, quint16 port) -{ - QMutexLocker mutexLocker(&m_mutex); - bool wasRunning = false; - - if ((m_address != address) || (m_port != port)) - { - if (m_SDRdaemonThread != 0) - { - wasRunning = m_SDRdaemonThread->isRunning(); - - if (wasRunning) - { - m_SDRdaemonThread->stopWork(); - } - } - - if (m_SDRdaemonThread != 0) - { - m_SDRdaemonThread->updateLink(address, port); - - if (wasRunning) - { - m_SDRdaemonThread->startWork(); - } - } - - m_address = address; - m_port = port; - - qDebug() << "SDRdaemonInput::updateLink:" - << " address: " << m_address.toStdString().c_str() - << "port: " << m_port; - } -} - -void SDRdaemonInput:: updateSampleRate(int sampleRate) -{ - QMutexLocker mutexLocker(&m_mutex); - bool wasRunning = false; - - if (m_sampleRate != sampleRate) - { - m_sampleRate = sampleRate; - - if (m_SDRdaemonThread != 0) - { - wasRunning = m_SDRdaemonThread->isRunning(); - - if (wasRunning) - { - m_SDRdaemonThread->stopWork(); - } - } - - if (m_SDRdaemonThread != 0) - { - m_SDRdaemonThread->setSamplerate(m_sampleRate); - - if (wasRunning) - { - m_SDRdaemonThread->startWork(); - } - } - - DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency); - DSPEngine::instance()->getInputMessageQueue()->push(notif); - - qDebug() << "SDRdaemonInput::updateSampleRate:" - << " sample rate: " << m_sampleRate; - } -} diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h index 46d0fef0b..5666ce8e9 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h @@ -179,7 +179,6 @@ private: const QTimer& m_masterTimer; void updateLink(const QString& address, quint16 port); - void updateSampleRate(int sampleRate); }; #endif // INCLUDE_SDRDAEMONINPUT_H diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp index 222e5ea5d..a3c360cd7 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp @@ -43,6 +43,19 @@ SDRdaemonThread::SDRdaemonThread(SampleFifo* sampleFifo, QObject* parent) : m_samplerate(0) { m_udpBuf = new char[m_udpPayloadSize]; + m_dataSocket = new QUdpSocket(this); + + if (m_dataSocket->bind(m_dataAddress, m_dataPort)) + { + qDebug("SDRdaemonThread::SDRdaemonThread: bind data socket to port %d", m_dataPort); + connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); + m_dataConnected = true; + } + else + { + qWarning("SDRdaemonThread::SDRdaemonThread: cannot bind data port %d", m_dataPort); + m_dataConnected = false; + } } SDRdaemonThread::~SDRdaemonThread() @@ -64,27 +77,17 @@ void SDRdaemonThread::startWork() { qDebug() << "SDRdaemonThread::startWork: "; - if (!m_dataSocket) { - m_dataSocket = new QUdpSocket(this); - } - - if (m_dataSocket->bind(m_dataAddress, m_dataPort)) + if (!m_dataConnected) { - qDebug("SDRdaemonThread::startWork: bind data socket to port %d", m_dataPort); connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); - - m_startWaitMutex.lock(); - start(); - while(!m_running) - m_startWaiter.wait(&m_startWaitMutex, 100); - m_startWaitMutex.unlock(); m_dataConnected = true; } - else - { - qWarning("SDRdaemonThread::startWork: cannot bind data port %d", m_dataPort); - m_dataConnected = false; - } + + m_startWaitMutex.lock(); + start(); + while(!m_running) + m_startWaiter.wait(&m_startWaitMutex, 100); + m_startWaitMutex.unlock(); } void SDRdaemonThread::stopWork() @@ -93,11 +96,7 @@ void SDRdaemonThread::stopWork() if (m_dataConnected) { disconnect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); - } - - if (m_dataSocket) { - delete m_dataSocket; - m_dataSocket = 0; + m_dataConnected = false; } m_running = false; @@ -106,33 +105,69 @@ void SDRdaemonThread::stopWork() void SDRdaemonThread::setSamplerate(uint32_t samplerate) { + bool wasRunning = m_running; + qDebug() << "SDRdaemonThread::setSamplerate:" << " new:" << samplerate << " old:" << m_samplerate; - if (samplerate != m_samplerate) + if (m_running) { - if (m_running) { - stopWork(); - } - - m_samplerate = samplerate; - m_chunksize = (m_samplerate / m_rateDivider)*4; // TODO: implement FF and slow motion here. 4 corresponds to live. 2 is half speed, 8 is doulbe speed - m_bufsize = m_chunksize; - - if (m_buf == 0) { - qDebug() << " - Allocate buffer"; - m_buf = (quint8*) malloc(m_bufsize); - } else { - qDebug() << " - Re-allocate buffer"; - m_buf = (quint8*) realloc((void*) m_buf, m_bufsize); - } - - qDebug() << " - size: " << m_bufsize - << " #samples: " << (m_bufsize/4); + stopWork(); + m_running = false; } - //m_samplerate = samplerate; + m_samplerate = samplerate; + m_chunksize = (m_samplerate / m_rateDivider)*4; // TODO: implement FF and slow motion here. 4 corresponds to live. 2 is half speed, 8 is doulbe speed + m_bufsize = m_chunksize; + + if (m_buf == 0) { + qDebug() << " - Allocate buffer"; + m_buf = (quint8*) malloc(m_bufsize); + } else { + qDebug() << " - Re-allocate buffer"; + m_buf = (quint8*) realloc((void*) m_buf, m_bufsize); + } + + qDebug() << " - size: " << m_bufsize + << " #samples: " << (m_bufsize/4); + + if (wasRunning) + { + startWork(); + m_running = true; + } +} + +void SDRdaemonThread::updateLink(const QString& address, quint16 port) +{ + if (m_dataSocket) { + delete m_dataSocket; + m_dataSocket = 0; + } + + m_dataSocket = new QUdpSocket(this); + m_dataPort = port; + + if (m_dataAddress.setAddress(address)) + { + if (m_dataSocket->bind(m_dataAddress, m_dataPort)) + { + qDebug("SDRdaemonThread::startWork: bind data socket to port %d", m_dataPort); + connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); + m_dataConnected = true; + } + else + { + qWarning("SDRdaemonThread::updateLink: cannot bind data port %d", m_dataPort); + m_dataConnected = false; + } + } + else + { + qWarning("SDRdaemonThread::updateLink: cannot set data address: %s", qPrintable(address)); + m_dataConnected = false; + } } void SDRdaemonThread::run() @@ -183,7 +218,13 @@ void SDRdaemonThread::dataReadyRead() if (m_sdrDaemonBuffer.readMeta(m_udpBuf, readBytes)) { - setSamplerate(m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate); + uint32_t sampleRate = m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate; + + if (m_samplerate != sampleRate) + { + setSamplerate(sampleRate); + m_samplerate = sampleRate; + } } else if (m_sdrDaemonBuffer.isSync()) { diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonthread.h b/plugins/samplesource/sdrdaemon/sdrdaemonthread.h index 046d108e7..35e9fb9ca 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonthread.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonthread.h @@ -42,7 +42,6 @@ public: void startWork(); void stopWork(); - void setSamplerate(uint32_t samplerate); void updateLink(const QString& address, quint16 port); bool isRunning() const { return m_running; } std::size_t getSamplesCount() const { return m_samplesCount; } @@ -59,7 +58,7 @@ private: QUdpSocket *m_dataSocket; QHostAddress m_dataAddress; - int m_dataPort; + quint16 m_dataPort; bool m_dataConnected; quint8 *m_buf; char *m_udpBuf; @@ -74,6 +73,7 @@ private: static const int m_rateDivider; static const int m_udpPayloadSize; + void setSamplerate(uint32_t samplerate); void run(); private slots: void tick();