diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp index e850af437..8aca1add3 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp @@ -40,6 +40,7 @@ SDRdaemonBuffer::SDRdaemonBuffer(uint32_t blockSize) : m_readCount(0), m_rawSize(0), m_rawBuffer(0), + m_frameBuffer(0), m_bytesInBlock(0), m_nbBlocks(0) { @@ -59,6 +60,10 @@ SDRdaemonBuffer::~SDRdaemonBuffer() if (m_lz4OutBuffer) { delete[] m_lz4OutBuffer; } + + if (m_frameBuffer) { + delete[] m_frameBuffer; + } } bool SDRdaemonBuffer::readMeta(char *array, uint32_t length) @@ -227,6 +232,24 @@ void SDRdaemonBuffer::writeToRawBufferLZ4(const char *array, uint32_t length) writeToRawBufferUncompressed((const char *) m_lz4OutBuffer, m_frameSize); } +uint8_t *SDRdaemonBuffer::readData(uint32_t length) +{ + uint32_t readCount = m_readCount; + + if (m_readCount + length < m_rawSize) + { + m_readCount += length; + return &m_rawBuffer[readCount]; + } + 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); + return m_frameBuffer; + } +} + void SDRdaemonBuffer::updateLZ4Sizes(uint32_t frameSize) { uint32_t maxInputSize = LZ4_compressBound(frameSize); @@ -259,6 +282,12 @@ void SDRdaemonBuffer::updateBufferSize(uint32_t frameSize) m_rawSize = nbFrames * frameSize; m_rawBuffer = new uint8_t[m_rawSize]; + + if (m_frameBuffer) { + delete[] m_frameBuffer; + } + + m_frameBuffer = new uint8_t[frameSize]; } void SDRdaemonBuffer::updateBlockCounts(uint32_t nbBytesReceived) diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h index b1a613df7..37778fba8 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h @@ -65,6 +65,7 @@ public: ~SDRdaemonBuffer(); bool readMeta(char *array, uint32_t length); //!< Attempt to read meta. Returns true if meta block void writeData(char *array, uint32_t length); //!< Write data into buffer. + uint8_t *readData(uint32_t length); //!< Read data from buffer const MetaData& getCurrentMeta() const { return m_currentMeta; } void updateBlockCounts(uint32_t nbBytesReceived); bool isSync() const { return m_sync; } @@ -103,6 +104,7 @@ private: uint32_t m_readCount; //!< Current read position in the raw samples buffer uint32_t m_rawSize; //!< Size of the raw samples buffer in bytes uint8_t *m_rawBuffer; //!< Buffer for raw samples obtained from UDP (I/Q not in a formal I/Q structure) + uint8_t *m_frameBuffer; //!< Buffer to build a frame length of raw samples uint32_t m_bytesInBlock; //!< Number of bytes received in the current UDP block uint32_t m_nbBlocks; //!< Number of UDP blocks received in the current frame }; diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp index 896972e64..55e3b998d 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp @@ -88,28 +88,6 @@ SDRdaemonInput::~SDRdaemonInput() stop(); } -void SDRdaemonInput::openFileStream() -{ - qDebug() << "SDRdaemonInput::openFileStream: " << m_fileName.toStdString().c_str(); - - //stopInput(); - - if (m_ifstream.is_open()) { - m_ifstream.close(); - } - - m_ifstream.open(m_fileName.toStdString().c_str(), std::ios::binary); - FileSink::Header header; - FileSink::readHeader(m_ifstream, header); - - m_sampleRate = header.sampleRate; - m_centerFrequency = header.centerFrequency; - m_startingTimeStamp = header.startTimeStamp; - - MsgReportSDRdaemonStreamData *report = MsgReportSDRdaemonStreamData::create(m_sampleRate, m_centerFrequency, m_startingTimeStamp); // file stream data - getOutputMessageQueueToGUI()->push(report); -} - bool SDRdaemonInput::init(const Message& message) { return false; @@ -120,19 +98,12 @@ bool SDRdaemonInput::start(int device) QMutexLocker mutexLocker(&m_mutex); qDebug() << "SDRdaemonInput::startInput"; - if (m_ifstream.tellg() != 0) { - m_ifstream.clear(); - m_ifstream.seekg(0, std::ios::beg); - } - if(!m_sampleFifo.setSize(96000 * 4)) { qCritical("Could not allocate SampleFifo"); return false; } - //openFileStream(); - - if((m_SDRdaemonThread = new SDRdaemonThread(&m_ifstream, &m_sampleFifo)) == NULL) { + if((m_SDRdaemonThread = new SDRdaemonThread(&m_sampleFifo)) == NULL) { qFatal("out of memory"); stop(); return false; @@ -197,7 +168,6 @@ bool SDRdaemonInput::handleMessage(const Message& message) { MsgConfigureSDRdaemonName& conf = (MsgConfigureSDRdaemonName&) message; m_fileName = conf.getFileName(); - openFileStream(); return true; } else if (MsgConfigureSDRdaemonWork::match(message)) @@ -259,13 +229,6 @@ bool SDRdaemonInput::applySettings(const Settings& settings, bool force) } } - if (m_ifstream.is_open()) - { - m_ifstream.close(); - } - - openFileStream(); - if (m_SDRdaemonThread != 0) { m_SDRdaemonThread->setSamplerate(m_sampleRate); @@ -280,7 +243,6 @@ bool SDRdaemonInput::applySettings(const Settings& settings, bool force) DSPEngine::instance()->getInputMessageQueue()->push(notif); qDebug() << "SDRdaemonInput::applySettings:" - << " file name: " << settings.m_fileName.toStdString().c_str() << " center freq: " << m_centerFrequency << " Hz" << " sample rate: " << m_sampleRate << " Unix timestamp: " << m_startingTimeStamp; diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h index e0c180b20..01e004b6c 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h @@ -22,7 +22,6 @@ #include #include #include -#include class SDRdaemonThread; @@ -197,7 +196,6 @@ public: private: QMutex m_mutex; Settings m_settings; - std::ifstream m_ifstream; SDRdaemonThread* m_SDRdaemonThread; QString m_deviceDescription; QString m_fileName; @@ -207,7 +205,6 @@ private: const QTimer& m_masterTimer; bool applySettings(const Settings& settings, bool force); - void openFileStream(); }; #endif // INCLUDE_SDRDAEMONINPUT_H diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp index 934b1c17b..222e5ea5d 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonthread.cpp @@ -26,14 +26,13 @@ const int SDRdaemonThread::m_rateDivider = 1000/SDRDAEMON_THROTTLE_MS; const int SDRdaemonThread::m_udpPayloadSize = 512; -SDRdaemonThread::SDRdaemonThread(std::ifstream *samplesStream, SampleFifo* sampleFifo, QObject* parent) : +SDRdaemonThread::SDRdaemonThread(SampleFifo* sampleFifo, QObject* parent) : QThread(parent), m_running(false), m_dataSocket(0), m_dataAddress(QHostAddress::LocalHost), m_dataPort(9090), m_dataConnected(false), - m_ifstream(samplesStream), m_buf(0), m_udpBuf(0), m_bufsize(0), @@ -43,7 +42,6 @@ SDRdaemonThread::SDRdaemonThread(std::ifstream *samplesStream, SampleFifo* sampl m_sdrDaemonBuffer(m_udpPayloadSize), m_samplerate(0) { - assert(m_ifstream != 0); m_udpBuf = new char[m_udpPayloadSize]; } @@ -163,23 +161,8 @@ void SDRdaemonThread::tick() if (m_running) { // read samples directly feeding the SampleFifo (no callback) - m_ifstream->read(reinterpret_cast(m_buf), m_chunksize); - - if (m_ifstream->eof()) - { - m_sampleFifo->write(m_buf, m_ifstream->gcount()); - // TODO: handle loop playback situation - m_ifstream->clear(); - m_ifstream->seekg(0, std::ios::beg); - m_samplesCount = 0; - //stopWork(); - //m_ifstream->close(); - } - else - { - m_sampleFifo->write(m_buf, m_chunksize); - m_samplesCount += m_chunksize / 4; - } + m_sampleFifo->write(reinterpret_cast(m_sdrDaemonBuffer.readData(m_chunksize)), m_chunksize); + m_samplesCount += m_chunksize / 4; } } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonthread.h b/plugins/samplesource/sdrdaemon/sdrdaemonthread.h index c1b1d1b30..373348598 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonthread.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonthread.h @@ -24,7 +24,6 @@ #include #include -#include #include #include "dsp/samplefifo.h" #include "dsp/inthalfbandfilter.h" @@ -38,7 +37,7 @@ class SDRdaemonThread : public QThread { Q_OBJECT public: - SDRdaemonThread(std::ifstream *samplesStream, SampleFifo* sampleFifo, QObject* parent = NULL); + SDRdaemonThread(SampleFifo* sampleFifo, QObject* parent = NULL); ~SDRdaemonThread(); void startWork(); @@ -57,7 +56,6 @@ private: QWaitCondition m_startWaiter; bool m_running; - std::ifstream* m_ifstream; QUdpSocket *m_dataSocket; QHostAddress m_dataAddress; int m_dataPort;