diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp index fcab9d638..facc99aad 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp @@ -75,7 +75,7 @@ bool HackRFOutput::start(int device) // qCritical("HackRFInput::start: failed to initiate HackRF library %s", hackrf_error_name(rc)); // } - m_sampleSourceFifo.resize(m_settings.m_devSampleRate/2); // 500ms long + m_sampleSourceFifo.resize(m_settings.m_devSampleRate/(1<<(m_settings.m_log2Interp <= 4 ? m_settings.m_log2Interp : 4))); if (m_deviceAPI->getSourceBuddies().size() > 0) { @@ -148,7 +148,7 @@ void HackRFOutput::stop() m_hackRFThread = 0; } - if(m_dev != 0) + if (m_dev != 0) { hackrf_stop_tx(m_dev); } @@ -225,9 +225,9 @@ bool HackRFOutput::handleMessage(const Message& message) } } -void HackRFOutput::setCenterFrequency(quint64 freq_hz) +void HackRFOutput::setCenterFrequency(quint64 freq_hz, qint32 LOppmTenths) { - qint64 df = ((qint64)freq_hz * m_settings.m_LOppmTenths) / 10000000LL; + qint64 df = ((qint64)freq_hz * LOppmTenths) / 10000000LL; freq_hz += df; hackrf_error rc = (hackrf_error) hackrf_set_freq(m_dev, static_cast(freq_hz)); @@ -251,53 +251,53 @@ bool HackRFOutput::applySettings(const HackRFOutputSettings& settings, bool forc qDebug() << "HackRFOutput::applySettings"; - if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) - { - m_settings.m_devSampleRate = settings.m_devSampleRate; + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_log2Interp != settings.m_log2Interp) || force) + { forwardChange = true; + // FIFO size: + // 1 s length up to interpolation by 16 + // 2 s for interpolation by 32 + m_sampleSourceFifo.resize(settings.m_devSampleRate/(1<<(settings.m_log2Interp <= 4 ? settings.m_log2Interp : 4))); + } + + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) + { if (m_dev != 0) { - rc = (hackrf_error) hackrf_set_sample_rate_manual(m_dev, m_settings.m_devSampleRate, 1); + rc = (hackrf_error) hackrf_set_sample_rate_manual(m_dev, settings.m_devSampleRate, 1); if (rc != HACKRF_SUCCESS) { qCritical("HackRFOutput::applySettings: could not set sample rate to %d S/s: %s", - m_settings.m_devSampleRate, + settings.m_devSampleRate, hackrf_error_name(rc)); } else { qDebug("HackRFOutput::applySettings: sample rate set to %d S/s", - m_settings.m_devSampleRate); - m_hackRFThread->setSamplerate(m_settings.m_devSampleRate); + settings.m_devSampleRate); + m_hackRFThread->setSamplerate(settings.m_devSampleRate); } } } if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) { - m_settings.m_log2Interp = settings.m_log2Interp; - forwardChange = true; - - if(m_dev != 0) + if(m_hackRFThread != 0) { - m_hackRFThread->setLog2Interpolation(m_settings.m_log2Interp); - qDebug() << "HackRFOutput: set interpolation to " << (1<setLog2Interpolation(settings.m_log2Interp); + qDebug() << "HackRFOutput: set interpolation to " << (1< interp=16)