diff --git a/plugins/channelrx/demoddatv/datvdemod.cpp b/plugins/channelrx/demoddatv/datvdemod.cpp
index da1598110..350c8922a 100644
--- a/plugins/channelrx/demoddatv/datvdemod.cpp
+++ b/plugins/channelrx/demoddatv/datvdemod.cpp
@@ -17,1321 +17,72 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
-#include "datvdemod.h"
-
-#include "leansdr/dvbs2.h"
-
-#include
#include
-#include
-#include
-#include "audio/audiooutput.h"
-#include "dsp/dspengine.h"
-#include "dsp/downchannelizer.h"
-#include "dsp/threadedbasebandsamplesink.h"
#include "device/deviceapi.h"
+#include "datvdemod.h"
+
const QString DATVDemod::m_channelIdURI = "sdrangel.channel.demoddatv";
const QString DATVDemod::m_channelId = "DATVDemod";
MESSAGE_CLASS_DEFINITION(DATVDemod::MsgConfigureDATVDemod, Message)
-MESSAGE_CLASS_DEFINITION(DATVDemod::MsgConfigureChannelizer, Message)
-MESSAGE_CLASS_DEFINITION(DATVDemod::MsgReportModcodCstlnChange, Message)
DATVDemod::DATVDemod(DeviceAPI *deviceAPI) :
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
- m_blnNeedConfigUpdate(false),
m_deviceAPI(deviceAPI),
- m_objRegisteredTVScreen(0),
- m_objRegisteredVideoRender(0),
- m_objVideoStream(nullptr),
- m_udpStream(leansdr::tspacket::SIZE),
- m_objRenderThread(nullptr),
- m_audioFifo(48000),
- m_blnRenderingVideo(false),
- m_blnStartStopVideo(false),
- m_cstlnSetByModcod(false),
- m_modcodModulation(-1),
- m_modcodCodeRate(-1),
- m_enmModulation(DATVDemodSettings::BPSK /*DATV_FM1*/),
- m_channelSampleRate(1024000),
- m_objSettingsMutex(QMutex::NonRecursive)
+ m_basebandSampleRate(0)
{
+ qDebug("DATVDemod::DATVDemod");
setObjectName("DATVDemod");
+ m_thread = new QThread(this);
+ m_basebandSink = new DATVDemodBaseband();
+ m_basebandSink->moveToThread(m_thread);
- DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
- //m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate();
+ applySettings(m_settings, true);
- //*************** DATV PARAMETERS ***************
- m_blnInitialized=false;
- CleanUpDATVFramework(false);
-
- m_objVideoStream = new DATVideostream();
-
- m_objRFFilter = new fftfilt(-256000.0 / 1024000.0, 256000.0 / 1024000.0, rfFilterFftLength);
-
- m_channelizer = new DownChannelizer(this);
- m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
- m_deviceAPI->addChannelSink(m_threadedChannelizer);
+ m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
+
}
DATVDemod::~DATVDemod()
{
- m_blnInitialized=false;
-
- if(m_objVideoStream!=nullptr)
- {
- //Immediately exit from DATVideoStream if waiting for data before killing thread
- m_objVideoStream->ThreadTimeOut=0;
- }
-
- DSPEngine::instance()->getAudioDeviceManager()->removeAudioSink(&m_audioFifo);
-
- if(m_objRenderThread!=nullptr)
- {
- if(m_objRenderThread->isRunning())
- {
- m_objRenderThread->stopRendering();
- m_objRenderThread->quit();
- }
-
- m_objRenderThread->wait(2000);
- }
-
- CleanUpDATVFramework(true);
-
+ qDebug("DATVDemod::~DATVDemod");
m_deviceAPI->removeChannelSinkAPI(this);
- m_deviceAPI->removeChannelSink(m_threadedChannelizer);
- delete m_threadedChannelizer;
- delete m_channelizer;
- delete m_objRFFilter;
+ m_deviceAPI->removeChannelSink(this);
+ delete m_basebandSink;
+ delete m_thread;
}
-bool DATVDemod::SetTVScreen(TVScreen *objScreen)
-{
- m_objRegisteredTVScreen = objScreen;
- return true;
-}
-
-DATVideostream *DATVDemod::SetVideoRender(DATVideoRender *objScreen)
-{
- m_objRegisteredVideoRender = objScreen;
- m_objRegisteredVideoRender->setAudioFIFO(&m_audioFifo);
- m_objRenderThread = new DATVideoRenderThread(m_objRegisteredVideoRender, m_objVideoStream);
- return m_objVideoStream;
-}
-
-bool DATVDemod::audioActive()
-{
- if (m_objRegisteredVideoRender) {
- return m_objRegisteredVideoRender->getAudioStreamIndex() >= 0;
- } else {
- return false;
- }
-}
-
-bool DATVDemod::videoActive()
-{
- if (m_objRegisteredVideoRender) {
- return m_objRegisteredVideoRender->getVideoStreamIndex() >= 0;
- } else {
- return false;
- }
-}
-
-bool DATVDemod::audioDecodeOK()
-{
- if (m_objRegisteredVideoRender) {
- return m_objRegisteredVideoRender->getAudioDecodeOK();
- } else {
- return false;
- }
-}
-
-bool DATVDemod::videoDecodeOK()
-{
- if (m_objRegisteredVideoRender) {
- return m_objRegisteredVideoRender->getVideoDecodeOK();
- } else {
- return false;
- }
-}
-
-bool DATVDemod::PlayVideo(bool blnStartStop)
-{
-
- if (m_objVideoStream == nullptr) {
- return false;
- }
-
- if (m_objRegisteredVideoRender == nullptr) {
- return false;
- }
-
- if (m_objRenderThread == nullptr) {
- return false;
- }
-
- if (m_blnStartStopVideo && !blnStartStop) {
- return true;
- }
-
- if (blnStartStop == true) {
- m_blnStartStopVideo = true;
- }
-
- if (m_objRenderThread->isRunning())
- {
- if (blnStartStop == true) {
- m_objRenderThread->stopRendering();
- }
-
- return true;
- }
-
- if (m_objVideoStream->bytesAvailable() > 0)
- {
- m_objRenderThread->setStreamAndRenderer(m_objRegisteredVideoRender, m_objVideoStream);
- m_objVideoStream->MultiThreaded = true;
- m_objVideoStream->ThreadTimeOut = 5000; //5000 ms
- m_objRenderThread->start();
- }
-
- return true;
-}
-
-void DATVDemod::CleanUpDATVFramework(bool blnRelease)
-{
- if (blnRelease == true)
- {
- if (m_objScheduler != nullptr)
- {
- m_objScheduler->shutdown();
- delete m_objScheduler;
- }
-
- // NOTCH FILTER
-
- if (r_auto_notch != nullptr) {
- delete r_auto_notch;
- }
- if (p_autonotched != nullptr) {
- delete p_autonotched;
- }
-
- // FREQUENCY CORRECTION : DEROTATOR
- if (p_derot != nullptr) {
- delete p_derot;
- }
- if (r_derot != nullptr) {
- delete r_derot;
- }
-
- // CNR ESTIMATION
- if (p_cnr != nullptr) {
- delete p_cnr;
- }
- if (r_cnr != nullptr) {
- delete r_cnr;
- }
-
- //FILTERING
- if (r_resample != nullptr) {
- delete r_resample;
- }
- if (p_resampled != nullptr) {
- delete p_resampled;
- }
- if (coeffs != nullptr) {
- delete coeffs;
- }
-
- // OUTPUT PREPROCESSED DATA
- if (sampler != nullptr) {
- delete sampler;
- }
- if (coeffs_sampler != nullptr) {
- delete coeffs_sampler;
- }
- if (p_symbols != nullptr) {
- delete p_symbols;
- }
- if (p_freq != nullptr) {
- delete p_freq;
- }
- if (p_ss != nullptr) {
- delete p_ss;
- }
- if (p_mer != nullptr) {
- delete p_mer;
- }
- if (p_sampled != nullptr) {
- delete p_sampled;
- }
-
- //DECIMATION
- if (p_decimated != nullptr) {
- delete p_decimated;
- }
- if (p_decim != nullptr) {
- delete p_decim;
- }
- if (r_ppout != nullptr) {
- delete r_ppout;
- }
-
- //GENERIC CONSTELLATION RECEIVER
- if (m_objDemodulator != nullptr) {
- delete m_objDemodulator;
- }
-
- //DECONVOLUTION AND SYNCHRONIZATION
- if (p_bytes != nullptr) {
- delete p_bytes;
- }
- if (r_deconv != nullptr) {
- delete r_deconv;
- }
- if (r != nullptr) {
- delete r;
- }
- if (p_descrambled != nullptr) {
- delete p_descrambled;
- }
- if (p_frames != nullptr) {
- delete p_frames;
- }
- if (r_etr192_descrambler != nullptr) {
- delete r_etr192_descrambler;
- }
- if (r_sync != nullptr) {
- delete r_sync;
- }
- if (p_mpegbytes != nullptr) {
- delete p_mpegbytes;
- }
- if (p_lock != nullptr) {
- delete p_lock;
- }
- if (p_locktime != nullptr) {
- delete p_locktime;
- }
- if (r_sync_mpeg != nullptr) {
- delete r_sync_mpeg;
- }
-
- // DEINTERLEAVING
- if (p_rspackets != nullptr) {
- delete p_rspackets;
- }
- if (r_deinter != nullptr) {
- delete r_deinter;
- }
- if (p_vbitcount != nullptr) {
- delete p_vbitcount;
- }
- if (p_verrcount != nullptr) {
- delete p_verrcount;
- }
- if (p_rtspackets != nullptr) {
- delete p_rtspackets;
- }
- if (r_rsdec != nullptr) {
- delete r_rsdec;
- }
-
- //BER ESTIMATION
- if (p_vber != nullptr) {
- delete p_vber;
- }
- if (r_vber != nullptr) {
- delete r_vber;
- }
-
- // DERANDOMIZATION
- if (p_tspackets != nullptr) {
- delete p_tspackets;
- }
- if (r_derand != nullptr) {
- delete r_derand;
- }
-
- //OUTPUT : To remove
- if (r_stdout != nullptr) {
- delete r_stdout;
- }
- if (r_videoplayer != nullptr) {
- delete r_videoplayer;
- }
-
- //CONSTELLATION
- if (r_scope_symbols != nullptr) {
- delete r_scope_symbols;
- }
-
- // INPUT
- //if(p_rawiq!=nullptr) delete p_rawiq;
- //if(p_rawiq_writer!=nullptr) delete p_rawiq_writer;
- //if(p_preprocessed!=nullptr) delete p_preprocessed;
-
- //DVB-S2
-
- if(p_slots_dvbs2 != nullptr)
- {
- delete (leansdr::pipebuf< leansdr::plslot >*) p_slots_dvbs2;
- }
-
- if(p_cstln != nullptr)
- {
- delete p_cstln;
- }
-
- if(p_cstln_pls != nullptr)
- {
- delete p_cstln_pls;
- }
-
- if(p_framelock != nullptr)
- {
- delete p_framelock;
- }
-
- if(m_objDemodulatorDVBS2 != nullptr)
- {
- delete (leansdr::s2_frame_receiver*) m_objDemodulatorDVBS2;
- }
-
- if(p_fecframes != nullptr)
- {
- delete (leansdr::pipebuf< leansdr::fecframe >*) p_fecframes;
- }
-
- if(p_bbframes != nullptr)
- {
- delete (leansdr::pipebuf*) p_bbframes;
- }
-
- if(p_s2_deinterleaver != nullptr)
- {
- delete (leansdr::s2_deinterleaver*) p_s2_deinterleaver;
- }
-
- if(r_fecdec != nullptr)
- {
- delete (leansdr::s2_fecdec*) r_fecdec;
- }
-
- if(p_deframer != nullptr)
- {
- delete (leansdr::s2_deframer*) p_deframer;
- }
-
- if(r_scope_symbols_dvbs2 != nullptr)
- {
- delete r_scope_symbols_dvbs2;
- }
- }
-
- m_objScheduler=nullptr;
-
- // INPUT
-
- p_rawiq = nullptr;
- p_rawiq_writer = nullptr;
-
- p_preprocessed = nullptr;
-
- // NOTCH FILTER
- r_auto_notch = nullptr;
- p_autonotched = nullptr;
-
- // FREQUENCY CORRECTION : DEROTATOR
- p_derot = nullptr;
- r_derot=nullptr;
-
- // CNR ESTIMATION
- p_cnr = nullptr;
- r_cnr = nullptr;
-
- //FILTERING
- r_resample = nullptr;
- p_resampled = nullptr;
- coeffs = nullptr;
- ncoeffs=0;
-
- // OUTPUT PREPROCESSED DATA
- sampler = nullptr;
- coeffs_sampler=nullptr;
- ncoeffs_sampler=0;
-
- p_symbols = nullptr;
- p_freq = nullptr;
- p_ss = nullptr;
- p_mer = nullptr;
- p_sampled = nullptr;
-
- //DECIMATION
- p_decimated = nullptr;
- p_decim = nullptr;
- r_ppout = nullptr;
-
- //GENERIC CONSTELLATION RECEIVER
- m_objDemodulator = nullptr;
-
- //DECONVOLUTION AND SYNCHRONIZATION
- p_bytes=nullptr;
- r_deconv=nullptr;
- r = nullptr;
-
- p_descrambled = nullptr;
- p_frames = nullptr;
- r_etr192_descrambler = nullptr;
- r_sync = nullptr;
-
- p_mpegbytes = nullptr;
- p_lock = nullptr;
- p_locktime = nullptr;
- r_sync_mpeg = nullptr;
-
-
- // DEINTERLEAVING
- p_rspackets = nullptr;
- r_deinter = nullptr;
-
- p_vbitcount = nullptr;
- p_verrcount = nullptr;
- p_rtspackets = nullptr;
- r_rsdec = nullptr;
-
-
- //BER ESTIMATION
- p_vber = nullptr;
- r_vber = nullptr;
-
-
- // DERANDOMIZATION
- p_tspackets = nullptr;
- r_derand = nullptr;
-
-
- //OUTPUT : To remove void *
- r_stdout = nullptr;
- r_videoplayer = nullptr;
-
-
- //CONSTELLATION
- r_scope_symbols = nullptr;
-
- //DVB-S2
- p_slots_dvbs2 = nullptr;
- p_cstln = nullptr;
- p_cstln_pls = nullptr;
- p_framelock = nullptr;
- m_objDemodulatorDVBS2 = nullptr;
- p_fecframes = nullptr;
- p_bbframes = nullptr;
- p_s2_deinterleaver = nullptr;
- r_fecdec = nullptr;
- p_deframer = nullptr;
- r_scope_symbols_dvbs2 = nullptr;
-}
-
-void DATVDemod::InitDATVFramework()
-{
- m_blnDVBInitialized = false;
- m_lngReadIQ = 0;
- CleanUpDATVFramework(false);
-
- qDebug() << "DATVDemod::InitDATVFramework:"
- << " Standard: " << m_settings.m_standard
- << " Symbol Rate: " << m_settings.m_symbolRate
- << " Modulation: " << m_settings.m_modulation
- << " Notch Filters: " << m_settings.m_notchFilters
- << " Allow Drift: " << m_settings.m_allowDrift
- << " Fast Lock: " << m_settings.m_fastLock
- << " Filter: " << m_settings.m_filter
- << " HARD METRIC: " << m_settings.m_hardMetric
- << " RollOff: " << m_settings.m_rollOff
- << " Viterbi: " << m_settings.m_viterbi
- << " Excursion: " << m_settings.m_excursion
- << " Sample rate: " << m_channelSampleRate;
-
- m_objCfg.standard = m_settings.m_standard;
-
- m_objCfg.fec = (leansdr::code_rate) getLeanDVBCodeRateFromDATV(m_settings.m_fec);
- m_objCfg.Fs = (float) m_channelSampleRate;
- m_objCfg.Fm = (float) m_settings.m_symbolRate;
- m_objCfg.fastlock = m_settings.m_fastLock;
-
- m_objCfg.sampler = m_settings.m_filter;
- m_objCfg.rolloff = m_settings.m_rollOff; //0...1
- m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB
- m_objCfg.rrc_steps = 0; //auto
-
- switch(m_settings.m_modulation)
- {
- case DATVDemodSettings::BPSK:
- m_objCfg.constellation = leansdr::cstln_lut::BPSK;
- break;
- case DATVDemodSettings::QPSK:
- m_objCfg.constellation = leansdr::cstln_lut::QPSK;
- break;
- case DATVDemodSettings::PSK8:
- m_objCfg.constellation = leansdr::cstln_lut::PSK8;
- break;
- case DATVDemodSettings::APSK16:
- m_objCfg.constellation = leansdr::cstln_lut::APSK16;
- break;
- case DATVDemodSettings::APSK32:
- m_objCfg.constellation = leansdr::cstln_lut::APSK32;
- break;
- case DATVDemodSettings::APSK64E:
- m_objCfg.constellation = leansdr::cstln_lut::APSK64E;
- break;
- case DATVDemodSettings::QAM16:
- m_objCfg.constellation = leansdr::cstln_lut::QAM16;
- break;
- case DATVDemodSettings::QAM64:
- m_objCfg.constellation = leansdr::cstln_lut::QAM64;
- break;
- case DATVDemodSettings::QAM256:
- m_objCfg.constellation = leansdr::cstln_lut::QAM256;
- break;
- default:
- m_objCfg.constellation = leansdr::cstln_lut::BPSK;
- break;
- }
-
- m_objCfg.allow_drift = m_settings.m_allowDrift;
- m_objCfg.anf = m_settings.m_notchFilters;
- m_objCfg.hard_metric = m_settings.m_hardMetric;
- m_objCfg.sampler = m_settings.m_filter;
- m_objCfg.viterbi = m_settings.m_viterbi;
-
- // Min buffer size for baseband data
- // scopes: 1024
- // ss_estimator: 1024
- // anf: 4096
- // cstln_receiver: reads in chunks of 128+1
- BUF_BASEBAND = 4096 * m_objCfg.buf_factor;
-
- // Min buffer size for IQ symbols
- // cstln_receiver: writes in chunks of 128/omega symbols (margin 128)
- // deconv_sync: reads at least 64+32
- // A larger buffer improves performance significantly.
- BUF_SYMBOLS = 1024 * m_objCfg.buf_factor;
-
- // Min buffer size for unsynchronized bytes
- // deconv_sync: writes 32 bytes
- // mpeg_sync: reads up to 204*scan_syncs = 1632 bytes
- BUF_BYTES = 2048 * m_objCfg.buf_factor;
-
- // Min buffer size for synchronized (but interleaved) bytes
- // mpeg_sync: writes 1 rspacket
- // deinterleaver: reads 17*11*12+204 = 2448 bytes
- BUF_MPEGBYTES = 2448 * m_objCfg.buf_factor;
-
- // Min buffer size for packets: 1
- BUF_PACKETS = m_objCfg.buf_factor;
-
- // Min buffer size for misc measurements: 1
- BUF_SLOW = m_objCfg.buf_factor;
-
- m_lngExpectedReadIQ = BUF_BASEBAND;
-
- m_objScheduler = new leansdr::scheduler();
-
- //***************
- p_rawiq = new leansdr::pipebuf(m_objScheduler, "rawiq", BUF_BASEBAND);
- p_rawiq_writer = new leansdr::pipewriter(*p_rawiq);
- p_preprocessed = p_rawiq;
-
- // NOTCH FILTER
-
- if (m_objCfg.anf>0)
- {
- p_autonotched = new leansdr::pipebuf(m_objScheduler, "autonotched", BUF_BASEBAND);
- r_auto_notch = new leansdr::auto_notch(m_objScheduler, *p_preprocessed, *p_autonotched, m_objCfg.anf, 0);
- p_preprocessed = p_autonotched;
- }
-
-
- // FREQUENCY CORRECTION
-
- //******** -> if ( m_objCfg.Fderot>0 )
-
- // CNR ESTIMATION
-
- p_cnr = new leansdr::pipebuf(m_objScheduler, "cnr", BUF_SLOW);
-
- if (m_objCfg.cnr == true)
- {
- r_cnr = new leansdr::cnr_fft(m_objScheduler, *p_preprocessed, *p_cnr, m_objCfg.Fm/m_objCfg.Fs);
- r_cnr->decimation = decimation(m_objCfg.Fs, 1); // 1 Hz
- }
-
- // FILTERING
-
- int decim = 1;
-
- //******** -> if ( m_objCfg.resample )
-
-
- // DECIMATION
- // (Unless already done in resampler)
-
- //******** -> if ( !m_objCfg.resample && m_objCfg.decim>1 )
-
- //Resampling FS
-
-
- // Generic constellation receiver
-
- p_symbols = new leansdr::pipebuf(m_objScheduler, "PSK soft-symbols", BUF_SYMBOLS);
- p_freq = new leansdr::pipebuf (m_objScheduler, "freq", BUF_SLOW);
- p_ss = new leansdr::pipebuf (m_objScheduler, "SS", BUF_SLOW);
- p_mer = new leansdr::pipebuf (m_objScheduler, "MER", BUF_SLOW);
- p_sampled = new leansdr::pipebuf (m_objScheduler, "PSK symbols", BUF_BASEBAND);
-
- switch (m_objCfg.sampler)
- {
- case DATVDemodSettings::SAMP_NEAREST:
- sampler = new leansdr::nearest_sampler();
- break;
- case DATVDemodSettings::SAMP_LINEAR:
- sampler = new leansdr::linear_sampler();
- break;
- case DATVDemodSettings::SAMP_RRC:
- {
- if (m_objCfg.rrc_steps == 0)
- {
- // At least 64 discrete sampling points between symbols
- m_objCfg.rrc_steps = std::max(1, (int)(64*m_objCfg.Fm / m_objCfg.Fs));
- }
-
- float Frrc = m_objCfg.Fs * m_objCfg.rrc_steps; // Sample freq of the RRC filter
- float transition = (m_objCfg.Fm/2) * m_objCfg.rolloff;
- int order = m_objCfg.rrc_rej * Frrc / (22*transition);
- ncoeffs_sampler = leansdr::filtergen::root_raised_cosine(order, m_objCfg.Fm/Frrc, m_objCfg.rolloff, &coeffs_sampler);
- sampler = new leansdr::fir_sampler(ncoeffs_sampler, coeffs_sampler, m_objCfg.rrc_steps);
- break;
- }
- default:
- qCritical("DATVDemod::InitDATVFramework: Interpolator not implemented");
- return;
- }
-
- m_objDemodulator = new leansdr::cstln_receiver(
- m_objScheduler,
- sampler,
- *p_preprocessed,
- *p_symbols,
- p_freq,
- p_ss,
- p_mer,
- p_sampled);
-
- if (m_objCfg.standard == DATVDemodSettings::DVB_S)
- {
- if ( m_objCfg.constellation != leansdr::cstln_lut::QPSK
- && m_objCfg.constellation != leansdr::cstln_lut::BPSK )
- {
- qWarning("DATVDemod::InitDATVFramework: non-standard constellation for DVB-S");
- }
- }
-
- if (m_objCfg.standard == DATVDemodSettings::DVB_S2)
- {
- // For DVB-S2 testing only.
- // Constellation should be determined from PL signalling.
- qDebug("DATVDemod::InitDATVFramework: DVB-S2: Testing symbol sampler only.");
- }
-
- m_objDemodulator->cstln = make_dvbs_constellation(m_objCfg.constellation, m_objCfg.fec);
-
- if (m_objCfg.hard_metric) {
- m_objDemodulator->cstln->harden();
- }
-
- m_objDemodulator->set_omega(m_objCfg.Fs/m_objCfg.Fm);
-
- //******** if ( m_objCfg.Ftune )
- //{
- // m_objDemodulator->set_freq(m_objCfg.Ftune/m_objCfg.Fs);
- //}
-
- if (m_objCfg.allow_drift) {
- m_objDemodulator->set_allow_drift(true);
- }
-
- //******** -> if ( m_objCfg.viterbi )
- if (m_objCfg.viterbi) {
- m_objDemodulator->pll_adjustment /= 6;
- }
-
- m_objDemodulator->meas_decimation = decimation(m_objCfg.Fs, m_objCfg.Finfo);
-
- // TRACKING FILTERS
-
- if (r_cnr)
- {
- r_cnr->freq_tap = &m_objDemodulator->freq_tap;
- r_cnr->tap_multiplier = 1.0 / decim;
- }
-
- //constellation
-
- if (m_objRegisteredTVScreen)
- {
- qDebug("DATVDemod::InitDATVFramework: Register DVBSTVSCREEN");
-
- m_objRegisteredTVScreen->resizeTVScreen(256,256);
- r_scope_symbols = new leansdr::datvconstellation(m_objScheduler, *p_sampled, -128,128, nullptr, m_objRegisteredTVScreen);
- r_scope_symbols->decimation = 1;
- r_scope_symbols->cstln = &m_objDemodulator->cstln;
- r_scope_symbols->calculate_cstln_points();
- }
-
- // DECONVOLUTION AND SYNCHRONIZATION
-
- p_bytes = new leansdr::pipebuf(m_objScheduler, "bytes", BUF_BYTES);
-
- r_deconv = nullptr;
-
- //******** -> if ( m_objCfg.viterbi )
-
- if (m_objCfg.viterbi)
- {
- if (m_objCfg.fec == leansdr::FEC23 && (m_objDemodulator->cstln->nsymbols == 4 || m_objDemodulator->cstln->nsymbols == 64)) {
- m_objCfg.fec = leansdr::FEC46;
- }
-
- //To uncomment -> Linking Problem : undefined symbol: _ZN7leansdr21viterbi_dec_interfaceIhhiiE6updateEPiS2_
- r = new leansdr::viterbi_sync(m_objScheduler, (*p_symbols), (*p_bytes), m_objDemodulator->cstln, m_objCfg.fec);
-
- if (m_objCfg.fastlock) {
- r->resync_period = 1;
- }
- }
- else
- {
- r_deconv = make_deconvol_sync_simple(m_objScheduler, (*p_symbols), (*p_bytes), m_objCfg.fec);
- r_deconv->fastlock = m_objCfg.fastlock;
- }
-
- //******* -> if ( m_objCfg.hdlc )
-
- p_mpegbytes = new leansdr::pipebuf (m_objScheduler, "mpegbytes", BUF_MPEGBYTES);
- p_lock = new leansdr::pipebuf (m_objScheduler, "lock", BUF_SLOW);
- p_locktime = new leansdr::pipebuf (m_objScheduler, "locktime", BUF_PACKETS);
-
- r_sync_mpeg = new leansdr::mpeg_sync(m_objScheduler, *p_bytes, *p_mpegbytes, r_deconv, p_lock, p_locktime);
- r_sync_mpeg->fastlock = m_objCfg.fastlock;
-
- // DEINTERLEAVING
-
- p_rspackets = new leansdr::pipebuf >(m_objScheduler, "RS-enc packets", BUF_PACKETS);
- r_deinter = new leansdr::deinterleaver(m_objScheduler, *p_mpegbytes, *p_rspackets);
-
- // REED-SOLOMON
-
- p_vbitcount = new leansdr::pipebuf(m_objScheduler, "Bits processed", BUF_PACKETS);
- p_verrcount = new leansdr::pipebuf(m_objScheduler, "Bits corrected", BUF_PACKETS);
- p_rtspackets = new leansdr::pipebuf(m_objScheduler, "rand TS packets", BUF_PACKETS);
- r_rsdec = new leansdr::rs_decoder(m_objScheduler, *p_rspackets, *p_rtspackets, p_vbitcount, p_verrcount);
-
- // BER ESTIMATION
-
- /*
- p_vber = new pipebuf (m_objScheduler, "VBER", BUF_SLOW);
- r_vber = new rate_estimator (m_objScheduler, *p_verrcount, *p_vbitcount, *p_vber);
- r_vber->sample_size = m_objCfg.Fm/2; // About twice per second, depending on CR
- // Require resolution better than 2E-5
- if ( r_vber->sample_size < 50000 )
- {
- r_vber->sample_size = 50000;
- }
- */
-
- // DERANDOMIZATION
- p_tspackets = new leansdr::pipebuf(m_objScheduler, "TS packets", BUF_PACKETS);
- r_derand = new leansdr::derandomizer(m_objScheduler, *p_rtspackets, *p_tspackets);
-
- // OUTPUT
- r_videoplayer = new leansdr::datvvideoplayer(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
-
- m_blnDVBInitialized = true;
-}
-
-//************ DVB-S2 Decoder ************
-void DATVDemod::InitDATVS2Framework()
-{
- leansdr::s2_frame_receiver * objDemodulatorDVBS2;
-
- m_blnDVBInitialized = false;
- m_lngReadIQ = 0;
- CleanUpDATVFramework(false);
-
- qDebug() << "DATVDemod::InitDATVS2Framework:"
- << " Standard: " << m_settings.m_standard
- << " Symbol Rate: " << m_settings.m_symbolRate
- << " Modulation: " << m_settings.m_modulation
- << " Notch Filters: " << m_settings.m_notchFilters
- << " Allow Drift: " << m_settings.m_allowDrift
- << " Fast Lock: " << m_settings.m_fastLock
- << " Filter: " << m_settings.m_filter
- << " HARD METRIC: " << m_settings.m_hardMetric
- << " RollOff: " << m_settings.m_rollOff
- << " Viterbi: " << m_settings.m_viterbi
- << " Excursion: " << m_settings.m_excursion
- << " Sample rate: " << m_channelSampleRate ;
-
-
-
- m_objCfg.standard = m_settings.m_standard;
-
- m_objCfg.fec = (leansdr::code_rate) getLeanDVBCodeRateFromDATV(m_settings.m_fec);
- m_objCfg.Fs = (float) m_channelSampleRate;
- m_objCfg.Fm = (float) m_settings.m_symbolRate;
- m_objCfg.fastlock = m_settings.m_fastLock;
-
- m_objCfg.sampler = m_settings.m_filter;
- m_objCfg.rolloff = m_settings.m_rollOff; //0...1
- m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB
- m_objCfg.rrc_steps = 0; //auto
-
- switch(m_settings.m_modulation)
- {
- case DATVDemodSettings::BPSK:
- m_objCfg.constellation = leansdr::cstln_lut::BPSK;
- break;
- case DATVDemodSettings::QPSK:
- m_objCfg.constellation = leansdr::cstln_lut::QPSK;
- break;
- case DATVDemodSettings::PSK8:
- m_objCfg.constellation = leansdr::cstln_lut::PSK8;
- break;
- case DATVDemodSettings::APSK16:
- m_objCfg.constellation = leansdr::cstln_lut::APSK16;
- break;
- case DATVDemodSettings::APSK32:
- m_objCfg.constellation = leansdr::cstln_lut::APSK32;
- break;
- case DATVDemodSettings::APSK64E:
- m_objCfg.constellation = leansdr::cstln_lut::APSK64E;
- break;
- case DATVDemodSettings::QAM16:
- m_objCfg.constellation = leansdr::cstln_lut::QAM16;
- break;
- case DATVDemodSettings::QAM64:
- m_objCfg.constellation = leansdr::cstln_lut::QAM64;
- break;
- case DATVDemodSettings::QAM256:
- m_objCfg.constellation = leansdr::cstln_lut::QAM256;
- break;
- default:
- m_objCfg.constellation = leansdr::cstln_lut::BPSK;
- break;
- }
-
- m_objCfg.allow_drift = m_settings.m_allowDrift;
- m_objCfg.anf = m_settings.m_notchFilters;
- m_objCfg.hard_metric = m_settings.m_hardMetric;
- m_objCfg.sampler = m_settings.m_filter;
- m_objCfg.viterbi = m_settings.m_viterbi;
-
- // Min buffer size for baseband data
- S2_MAX_SYMBOLS = (90*(1+360)+36*((360-1)/16));
-
- BUF_BASEBAND = S2_MAX_SYMBOLS * 2 * (m_objCfg.Fs/m_objCfg.Fm) * m_objCfg.buf_factor;
- // Min buffer size for IQ symbols
- // cstln_receiver: writes in chunks of 128/omega symbols (margin 128)
- // deconv_sync: reads at least 64+32
- // A larger buffer improves performance significantly.
- BUF_SYMBOLS = 1024 * m_objCfg.buf_factor;
-
-
- // Min buffer size for misc measurements: 1
- BUF_SLOW = m_objCfg.buf_factor;
-
- // dvbs2 : Min buffer size for slots: 4 for deinterleaver
- BUF_SLOTS = leansdr::modcod_info::MAX_SLOTS_PER_FRAME * m_objCfg.buf_factor;
-
- BUF_FRAMES = m_objCfg.buf_factor;
-
- // Min buffer size for TS packets: Up to 39 per BBFRAME
- BUF_S2PACKETS = (leansdr::fec_info::KBCH_MAX/188/8+1) * m_objCfg.buf_factor;
-
- m_lngExpectedReadIQ = BUF_BASEBAND;
-
- m_objScheduler = new leansdr::scheduler();
-
- //***************
- p_rawiq = new leansdr::pipebuf(m_objScheduler, "rawiq", BUF_BASEBAND);
- p_rawiq_writer = new leansdr::pipewriter(*p_rawiq);
- p_preprocessed = p_rawiq;
-
- // NOTCH FILTER
-
- if (m_objCfg.anf>0)
- {
- p_autonotched = new leansdr::pipebuf(m_objScheduler, "autonotched", BUF_BASEBAND);
- r_auto_notch = new leansdr::auto_notch(m_objScheduler, *p_preprocessed, *p_autonotched, m_objCfg.anf, 0);
- p_preprocessed = p_autonotched;
- }
-
- // FREQUENCY CORRECTION
-
- //******** -> if ( m_objCfg.Fderot>0 )
-
- // CNR ESTIMATION
- /**
- p_cnr = new leansdr::pipebuf(m_objScheduler, "cnr", BUF_SLOW);
-
- if (m_objCfg.cnr == true)
- {
- r_cnr = new leansdr::cnr_fft(m_objScheduler, *p_preprocessed, *p_cnr, m_objCfg.Fm/m_objCfg.Fs);
- r_cnr->decimation = decimation(m_objCfg.Fs, 1); // 1 Hz
- }
- **/
- // FILTERING
-
- int decim = 1;
-
- //******** -> if ( m_objCfg.resample )
-
-
- // DECIMATION
- // (Unless already done in resampler)
-
- //******** -> if ( !m_objCfg.resample && m_objCfg.decim>1 )
-
- //Resampling FS
-
-
- // Generic constellation receiver
-
- p_freq = new leansdr::pipebuf (m_objScheduler, "freq", BUF_SLOW);
- p_ss = new leansdr::pipebuf (m_objScheduler, "SS", BUF_SLOW);
- p_mer = new leansdr::pipebuf (m_objScheduler, "MER", BUF_SLOW);
-
- switch (m_objCfg.sampler)
- {
- case DATVDemodSettings::SAMP_NEAREST:
- sampler = new leansdr::nearest_sampler();
- break;
- case DATVDemodSettings::SAMP_LINEAR:
- sampler = new leansdr::linear_sampler();
- break;
- case DATVDemodSettings::SAMP_RRC:
- {
- if (m_objCfg.rrc_steps == 0)
- {
- // At least 64 discrete sampling points between symbols
- m_objCfg.rrc_steps = std::max(1, (int)(64*m_objCfg.Fm / m_objCfg.Fs));
- }
-
- float Frrc = m_objCfg.Fs * m_objCfg.rrc_steps; // Sample freq of the RRC filter
- float transition = (m_objCfg.Fm/2) * m_objCfg.rolloff;
- int order = m_objCfg.rrc_rej * Frrc / (22*transition);
- ncoeffs_sampler = leansdr::filtergen::root_raised_cosine(order, m_objCfg.Fm/Frrc, m_objCfg.rolloff, &coeffs_sampler);
- sampler = new leansdr::fir_sampler(ncoeffs_sampler, coeffs_sampler, m_objCfg.rrc_steps);
- break;
- }
- default:
- qCritical("DATVDemod::InitDATVS2Framework: Interpolator not implemented");
- return;
- }
-
- p_slots_dvbs2 = new leansdr::pipebuf< leansdr::plslot > (m_objScheduler, "PL slots", BUF_SLOTS);
-
- p_cstln = new leansdr::pipebuf(m_objScheduler, "cstln", BUF_BASEBAND);
- p_cstln_pls = new leansdr::pipebuf(m_objScheduler, "PLS cstln", BUF_BASEBAND);
- p_framelock = new leansdr::pipebuf(m_objScheduler, "frame lock", BUF_SLOW);
-
- m_objDemodulatorDVBS2 = new leansdr::s2_frame_receiver(
- m_objScheduler,
- sampler,
- *p_preprocessed,
- *(leansdr::pipebuf< leansdr::plslot > *) p_slots_dvbs2,
- /* p_freq */ nullptr,
- /* p_ss */ nullptr,
- /* p_mer */ nullptr,
- p_cstln,
- /* p_cstln_pls */ nullptr,
- /*p_iqsymbols*/ nullptr,
- /* p_framelock */nullptr);
-
- objDemodulatorDVBS2 = (leansdr::s2_frame_receiver *) m_objDemodulatorDVBS2;
-
-
- objDemodulatorDVBS2->omega = m_objCfg.Fs/m_objCfg.Fm;
-//objDemodulatorDVBS2->mu=1;
-
-
- m_objCfg.Ftune=0.0f;
- objDemodulatorDVBS2->Ftune = m_objCfg.Ftune / m_objCfg.Fm;
-
-/*
- demod.strongpls = cfg.strongpls;
-*/
-
- objDemodulatorDVBS2->Fm = m_objCfg.Fm;
- objDemodulatorDVBS2->meas_decimation = decimation(m_objCfg.Fs, m_objCfg.Finfo);
-
- objDemodulatorDVBS2->strongpls = false;
-
-
- objDemodulatorDVBS2->cstln = make_dvbs2_constellation(m_objCfg.constellation, m_objCfg.fec);
- m_cstlnSetByModcod = false;
-
- //constellation
-
- if (m_objRegisteredTVScreen)
- {
- qDebug("DATVDemod::InitDATVS2Framework: Register DVBS 2 TVSCREEN");
-
- m_objRegisteredTVScreen->resizeTVScreen(256,256);
- r_scope_symbols_dvbs2 = new leansdr::datvdvbs2constellation(m_objScheduler, *p_cstln /* *p_sampled */ /* *p_cstln */, -128,128, nullptr, m_objRegisteredTVScreen);
- r_scope_symbols_dvbs2->decimation = 1;
- r_scope_symbols_dvbs2->cstln = (leansdr::cstln_base**) &objDemodulatorDVBS2->cstln;
- r_scope_symbols_dvbs2->calculate_cstln_points();
- }
-
- // Bit-flipping mode.
- // Deinterleave into hard bits.
-
- p_bbframes = new leansdr::pipebuf(m_objScheduler, "BB frames", BUF_FRAMES);
-
- p_fecframes = new leansdr::pipebuf< leansdr::fecframe >(m_objScheduler, "FEC frames", BUF_FRAMES);
-
- p_s2_deinterleaver = new leansdr::s2_deinterleaver(
- m_objScheduler,
- *(leansdr::pipebuf< leansdr::plslot > *) p_slots_dvbs2,
- *(leansdr::pipebuf< leansdr::fecframe > * ) p_fecframes
- );
-
- p_vbitcount= new leansdr::pipebuf(m_objScheduler, "Bits processed", BUF_S2PACKETS);
- p_verrcount = new leansdr::pipebuf(m_objScheduler, "Bits corrected", BUF_S2PACKETS);
-
- r_fecdec = new leansdr::s2_fecdec(
- m_objScheduler, *(leansdr::pipebuf< leansdr::fecframe > * ) p_fecframes,
- *(leansdr::pipebuf *) p_bbframes,
- p_vbitcount,
- p_verrcount
- );
- leansdr::s2_fecdec *fecdec = (leansdr::s2_fecdec * ) r_fecdec;
-
- fecdec->bitflips=0;
-
- /*
- fecdec->bitflips = cfg.ldpc_bf; //int TODO
- if ( ! cfg.ldpc_bf )
- fprintf(stderr, "Warning: No LDPC error correction selected.\n")
- */
-
- // Deframe BB frames to TS packets
- p_lock = new leansdr::pipebuf (m_objScheduler, "lock", BUF_SLOW);
- p_locktime = new leansdr::pipebuf (m_objScheduler, "locktime", BUF_S2PACKETS);
- p_tspackets = new leansdr::pipebuf(m_objScheduler, "TS packets", BUF_S2PACKETS);
-
- p_deframer = new leansdr::s2_deframer(m_objScheduler,*(leansdr::pipebuf *) p_bbframes, *p_tspackets, p_lock, p_locktime);
-
-/*
- if ( cfg.fd_gse >= 0 ) deframer.fd_gse = cfg.fd_gse;
-*/
- //**********************************************
-
- // OUTPUT
- r_videoplayer = new leansdr::datvvideoplayer(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
-
- m_blnDVBInitialized = true;
-}
-
-
void DATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
{
(void) firstOfBurst;
- float fltI;
- float fltQ;
- leansdr::cf32 objIQ;
- //Complex objC;
- fftfilt::cmplx *objRF;
- int intRFOut;
- double magSq;
-
- int lngWritable=0;
-
- //********** Bis repetita : Let's rock and roll buddy ! **********
-
-#ifdef EXTENDED_DIRECT_SAMPLE
-
- qint16 * ptrBuffer;
- qint32 intLen;
-
- //********** Reading direct samples **********
-
- SampleVector::const_iterator it = begin;
- intLen = it->intLen;
- ptrBuffer = it->ptrBuffer;
- ptrBufferToRelease = ptrBuffer;
- ++it;
-
- for(qint32 intInd=0; intIndreal();
- fltQ = it->imag();
-#endif
-
-
- //********** demodulation **********
-
-
- if (m_blnNeedConfigUpdate)
- {
- qDebug("DATVDemod::feed: Settings applied. Standard : %d...", m_settings.m_standard);
- m_objSettingsMutex.lock();
- m_blnNeedConfigUpdate=false;
-
- if(m_settings.m_standard==DATVDemodSettings::DVB_S2)
- {
- printf("SWITCHING TO DVBS-2\r\n");
- InitDATVS2Framework();
- }
- else
- {
- printf("SWITCHING TO DVBS\r\n");
- InitDATVFramework();
- }
-
- m_objSettingsMutex.unlock();
- }
-
-
- //********** iq stream ****************
-
- Complex objC(fltI,fltQ);
-
- objC *= m_objNCO.nextIQ();
-
- intRFOut = m_objRFFilter->runFilt(objC, &objRF); // filter RF before demod
-
- for (int intI = 0 ; intI < intRFOut; intI++)
- {
- objIQ.re = objRF->real();
- objIQ.im = objRF->imag();
- magSq = objIQ.re*objIQ.re + objIQ.im*objIQ.im;
- m_objMagSqAverage(magSq);
-
- objRF ++;
-
- if (m_blnDVBInitialized
- && (p_rawiq_writer!=nullptr)
- && (m_objScheduler!=nullptr))
- {
- p_rawiq_writer->write(objIQ);
- m_lngReadIQ++;
-
- lngWritable = p_rawiq_writer->writable();
-
- //Leave +1 by safety
- //if(((m_lngReadIQ+1)>=lngWritable) || (m_lngReadIQ>=768))
- if((m_lngReadIQ+1)>=lngWritable)
- {
- m_objScheduler->step();
-
- m_lngReadIQ=0;
- //delete p_rawiq_writer;
- //p_rawiq_writer = new leansdr::pipewriter(*p_rawiq);
- }
- }
-
- }
- } // Samples for loop
-
- // DVBS2: Track change of constellation via MODCOD
- if (m_settings.m_standard==DATVDemodSettings::DVB_S2)
- {
- leansdr::s2_frame_receiver * objDemodulatorDVBS2 = (leansdr::s2_frame_receiver *) m_objDemodulatorDVBS2;
-
- if (objDemodulatorDVBS2->cstln->m_setByModcod && !m_cstlnSetByModcod)
- {
- qDebug("DATVDemod::feed: change by MODCOD detected");
-
- if (r_scope_symbols_dvbs2) {
- r_scope_symbols_dvbs2->calculate_cstln_points();
- }
-
- if (getMessageQueueToGUI())
- {
- MsgReportModcodCstlnChange *msg = MsgReportModcodCstlnChange::create(
- getModulationFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_typeCode),
- getCodeRateFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_rateCode)
- );
-
- getMessageQueueToGUI()->push(msg);
- }
- }
-
- m_cstlnSetByModcod = objDemodulatorDVBS2->cstln->m_setByModcod;
- m_modcodModulation = objDemodulatorDVBS2->m_modcodType;
- m_modcodCodeRate = objDemodulatorDVBS2->m_modcodRate;
- }
+ m_basebandSink->feed(begin, end);
}
void DATVDemod::start()
{
- m_audioFifo.clear();
+ qDebug("DATVDemod::start");
+
+ if (m_basebandSampleRate != 0) {
+ m_basebandSink->setBasebandSampleRate(m_basebandSampleRate);
+ }
+
+ m_basebandSink->reset();
+ m_thread->start();
}
void DATVDemod::stop()
{
+ qDebug("DATVDemod::stop");
+ m_thread->exit();
+ m_thread->wait();
}
bool DATVDemod::handleMessage(const Message& cmd)
{
- if (DownChannelizer::MsgChannelizerNotification::match(cmd))
- {
- DownChannelizer::MsgChannelizerNotification& objNotif = (DownChannelizer::MsgChannelizerNotification&) cmd;
-
- qDebug() << "DATVDemod::handleMessage: MsgChannelizerNotification:"
- << " m_intSampleRate: " << objNotif.getSampleRate()
- << " m_intFrequencyOffset: " << objNotif.getFrequencyOffset();
-
- m_channelFrequencyOffset = objNotif.getFrequencyOffset();
- applyChannelSettings(m_channelSampleRate /*objNotif.getSampleRate()*/, m_channelFrequencyOffset);
-
- return true;
- }
- else if (MsgConfigureChannelizer::match(cmd))
- {
- MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
-
- m_channelizer->configure(m_channelizer->getInputMessageQueue(),
- m_channelizer->getInputSampleRate(), // do not change sample rate
- cfg.getCenterFrequency());
-
- qDebug() << "DATVDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << m_channelizer->getInputSampleRate()
- << " centerFrequency: " << cfg.getCenterFrequency();
-
- m_channelSampleRate = m_channelizer->getInputSampleRate();
- applyChannelSettings(m_channelSampleRate /*objNotif.getSampleRate()*/, m_channelFrequencyOffset);
-
- return true;
- }
- else if (MsgConfigureDATVDemod::match(cmd))
+ if (MsgConfigureDATVDemod::match(cmd))
{
MsgConfigureDATVDemod& objCfg = (MsgConfigureDATVDemod&) cmd;
qDebug() << "DATVDemod::handleMessage: MsgConfigureDATVDemod";
@@ -1341,9 +92,13 @@ bool DATVDemod::handleMessage(const Message& cmd)
}
else if(DSPSignalNotification::match(cmd))
{
- m_channelSampleRate = m_channelizer->getInputSampleRate();
- qDebug("DATVDemod::handleMessage: DSPSignalNotification: sent sample rate: %d", m_channelSampleRate);
- applyChannelSettings(m_channelSampleRate /*objNotif.getSampleRate()*/, m_channelFrequencyOffset);
+ DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
+ m_basebandSampleRate = notif.getSampleRate(); // store for init at start
+ qDebug() << "DATVDemod::handleMessage: DSPSignalNotification" << m_basebandSampleRate;
+
+ // Forward to the sink
+ DSPSignalNotification* notifToSink = new DSPSignalNotification(notif); // make a copy
+ m_basebandSink->getInputMessageQueue()->push(notifToSink);
return true;
}
@@ -1353,236 +108,13 @@ bool DATVDemod::handleMessage(const Message& cmd)
}
}
-void DATVDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force)
-{
- qDebug() << "DATVDemod::applyChannelSettings:"
- << " inputSampleRate: " << inputSampleRate
- << " inputFrequencyOffset: " << inputFrequencyOffset;
-
- bool callApplySettings = false;
-
- if ((m_settings.m_centerFrequency != inputFrequencyOffset) ||
- (m_channelSampleRate != inputSampleRate) || force)
- {
- m_objNCO.setFreq(-(float) inputFrequencyOffset, (float) inputSampleRate);
- qDebug("DATVDemod::applyChannelSettings: NCO: IF: %d <> TF: %d ISR: %d",
- inputFrequencyOffset, m_settings.m_centerFrequency, inputSampleRate);
- callApplySettings = true;
- }
-
- if ((m_channelSampleRate != inputSampleRate) || force)
- {
- //Bandpass filter shaping
- Real fltLowCut = -((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
- Real fltHiCut = ((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
- m_objRFFilter->create_filter(fltLowCut, fltHiCut);
- }
-
- m_channelSampleRate = inputSampleRate;
- m_settings.m_centerFrequency = inputFrequencyOffset;
-
- if (callApplySettings) {
- applySettings(m_settings, true);
- }
-}
-
void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
{
- QString msg = tr("DATVDemod::applySettings: force: %1").arg(force);
- settings.debug(msg);
+ QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force);
+ settings.debug(debugMsg);
- qDebug("DATVDemod::applySettings: m_channelSampleRate: %d", m_channelSampleRate);
-
- if (m_channelSampleRate == 0) {
- return;
- }
-
- if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
- {
- AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
- int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
- audioDeviceManager->addAudioSink(&m_audioFifo, getInputMessageQueue(), audioDeviceIndex); // removes from current if necessary
- // uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex);
-
- // if (m_audioSampleRate != audioSampleRate) {
- // applyAudioSampleRate(audioSampleRate);
- // }
- }
-
- if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force)
- {
- if (m_objRegisteredVideoRender) {
- m_objRegisteredVideoRender->setAudioVolume(settings.m_audioVolume);
- }
- }
-
- if ((settings.m_audioMute) != (m_settings.m_audioMute) || force)
- {
- if (m_objRegisteredVideoRender) {
- m_objRegisteredVideoRender->setAudioMute(settings.m_audioMute);
- }
- }
-
- if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
- {
- if (m_objRegisteredVideoRender) {
- m_objRegisteredVideoRender->setVideoMute(settings.m_videoMute);
- }
- }
-
- if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth)
- || force)
- {
-
- //Bandpass filter shaping
- Real fltLowCut = -((float) settings.m_rfBandwidth / 2.0) / (float) m_channelSampleRate;
- Real fltHiCut = ((float) settings.m_rfBandwidth / 2.0) / (float) m_channelSampleRate;
- m_objRFFilter->create_filter(fltLowCut, fltHiCut);
- }
-
- if ((m_settings.m_centerFrequency != settings.m_centerFrequency)
- || force)
- {
- m_objNCO.setFreq(-(float) settings.m_centerFrequency, (float) m_channelSampleRate);
- }
-
- if ((m_settings.m_udpTS != settings.m_udpTS) || force) {
- m_udpStream.setActive(settings.m_udpTS);
- }
-
- if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) {
- m_udpStream.setAddress(settings.m_udpTSAddress);
- }
-
- if ((m_settings.m_udpTSPort != settings.m_udpTSPort) || force) {
- m_udpStream.setPort(settings.m_udpTSPort);
- }
-
- if (m_settings.isDifferent(settings) || force)
- {
- m_blnNeedConfigUpdate = true;
- }
+ DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force);
+ m_basebandSink->getInputMessageQueue()->push(msg);
m_settings = settings;
}
-
-int DATVDemod::GetSampleRate()
-{
- return m_channelSampleRate;
-}
-
-DATVDemodSettings::DATVCodeRate DATVDemod::getCodeRateFromLeanDVBCode(int leanDVBCodeRate)
-{
- if (leanDVBCodeRate == leansdr::code_rate::FEC12) {
- return DATVDemodSettings::DATVCodeRate::FEC12;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC13) {
- return DATVDemodSettings::DATVCodeRate::FEC13;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC14) {
- return DATVDemodSettings::DATVCodeRate::FEC14;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC23) {
- return DATVDemodSettings::DATVCodeRate::FEC23;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC25) {
- return DATVDemodSettings::DATVCodeRate::FEC25;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC34) {
- return DATVDemodSettings::DATVCodeRate::FEC34;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC35) {
- return DATVDemodSettings::DATVCodeRate::FEC35;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC45) {
- return DATVDemodSettings::DATVCodeRate::FEC45;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC46) {
- return DATVDemodSettings::DATVCodeRate::FEC46;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC56) {
- return DATVDemodSettings::DATVCodeRate::FEC56;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC78) {
- return DATVDemodSettings::DATVCodeRate::FEC78;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC89) {
- return DATVDemodSettings::DATVCodeRate::FEC89;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC910) {
- return DATVDemodSettings::DATVCodeRate::FEC910;
- } else {
- return DATVDemodSettings::DATVCodeRate::RATE_UNSET;
- }
-}
-
-DATVDemodSettings::DATVModulation DATVDemod::getModulationFromLeanDVBCode(int leanDVBModulation)
-{
- if (leanDVBModulation == leansdr::cstln_base::predef::APSK16) {
- return DATVDemodSettings::DATVModulation::APSK16;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK32) {
- return DATVDemodSettings::DATVModulation::APSK32;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK64E) {
- return DATVDemodSettings::DATVModulation::APSK64E;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::BPSK) {
- return DATVDemodSettings::DATVModulation::BPSK;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::PSK8) {
- return DATVDemodSettings::DATVModulation::PSK8;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM16) {
- return DATVDemodSettings::DATVModulation::QAM16;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM64) {
- return DATVDemodSettings::DATVModulation::QAM64;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM256) {
- return DATVDemodSettings::DATVModulation::QAM256;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QPSK) {
- return DATVDemodSettings::DATVModulation::QPSK;
- } else {
- return DATVDemodSettings::DATVModulation::MOD_UNSET;
- }
-}
-
-int DATVDemod::getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate)
-{
- if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC12) {
- return (int) leansdr::code_rate::FEC12;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC13) {
- return (int) leansdr::code_rate::FEC13;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC14) {
- return (int) leansdr::code_rate::FEC14;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC23) {
- return (int) leansdr::code_rate::FEC23;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC25) {
- return (int) leansdr::code_rate::FEC25;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC34) {
- return (int) leansdr::code_rate::FEC34;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC35) {
- return (int) leansdr::code_rate::FEC35;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC45) {
- return (int) leansdr::code_rate::FEC45;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC46) {
- return (int) leansdr::code_rate::FEC46;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC56) {
- return (int) leansdr::code_rate::FEC56;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC78) {
- return (int) leansdr::code_rate::FEC78;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC89) {
- return (int) leansdr::code_rate::FEC89;
- } else if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC910) {
- return (int) leansdr::code_rate::FEC910;
- } else {
- return -1;
- }
-}
-
-int DATVDemod::getLeanDVBModulationFromDATV(DATVDemodSettings::DATVModulation datvModulation)
-{
- if (datvModulation == DATVDemodSettings::DATVModulation::APSK16) {
- return (int) leansdr::cstln_base::predef::APSK16;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::APSK32) {
- return (int) leansdr::cstln_base::predef::APSK32;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::APSK64E) {
- return (int) leansdr::cstln_base::predef::APSK64E;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::BPSK) {
- return (int) leansdr::cstln_base::predef::BPSK;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::PSK8) {
- return (int) leansdr::cstln_base::predef::PSK8;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::QAM16) {
- return (int) leansdr::cstln_base::predef::QAM16;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::QAM64) {
- return (int) leansdr::cstln_base::predef::QAM64;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::QAM256) {
- return (int) leansdr::cstln_base::predef::QAM256;
- } else if (datvModulation == DATVDemodSettings::DATVModulation::QPSK) {
- return (int) leansdr::cstln_base::predef::QPSK;
- } else {
- return -1;
- }
-}
diff --git a/plugins/channelrx/demoddatv/datvdemod.h b/plugins/channelrx/demoddatv/datvdemod.h
index 4d2d586a3..6d519c866 100644
--- a/plugins/channelrx/demoddatv/datvdemod.h
+++ b/plugins/channelrx/demoddatv/datvdemod.h
@@ -24,36 +24,14 @@ class DeviceAPI;
class ThreadedBasebandSampleSink;
class DownChannelizer;
-#include "datvconstellation.h"
-#include "datvdvbs2constellation.h"
-#include "datvvideoplayer.h"
-#include "datvideostream.h"
-#include "datvudpstream.h"
-#include "datvideorender.h"
-#include "datvdemodsettings.h"
-
#include "channel/channelapi.h"
#include "dsp/basebandsamplesink.h"
#include "dsp/devicesamplesource.h"
#include "dsp/dspcommands.h"
-#include "dsp/downchannelizer.h"
-#include "dsp/fftfilt.h"
-#include "dsp/nco.h"
-#include "dsp/interpolator.h"
-#include "dsp/movingaverage.h"
-#include "dsp/agc.h"
-#include "audio/audiofifo.h"
#include "util/message.h"
-#include "util/movingaverage.h"
-
-#include
#include "datvdemodbaseband.h"
-// enum DATVModulation { BPSK, QPSK, PSK8, APSK16, APSK32, APSK64E, QAM16, QAM64, QAM256 };
-// enum dvb_version { DVB_S, DVB_S2 };
-// enum dvb_sampler { SAMP_NEAREST, SAMP_LINEAR, SAMP_RRC };
-
class DATVDemod : public BasebandSampleSink, public ChannelAPI
{
@@ -135,7 +113,6 @@ private:
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink
void applySettings(const DATVDemodSettings& settings, bool force = false);
- void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false);
};
#endif // INCLUDE_DATVDEMOD_H
diff --git a/plugins/channelrx/demoddatv/datvdemodbaseband.cpp b/plugins/channelrx/demoddatv/datvdemodbaseband.cpp
index 2d2b8f205..cd5011adc 100644
--- a/plugins/channelrx/demoddatv/datvdemodbaseband.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodbaseband.cpp
@@ -151,6 +151,13 @@ void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool fo
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
+ if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
+ {
+ AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
+ int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
+ audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex);
+ }
+
m_sink.applySettings(settings, force);
m_settings = settings;
}
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.cpp b/plugins/channelrx/demoddatv/datvdemodgui.cpp
index c3a6f083b..cfd67354c 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodgui.cpp
@@ -21,21 +21,21 @@
#include
#include
-#include "datvdemodgui.h"
-
#include "device/deviceuiset.h"
#include "dsp/downchannelizer.h"
-
#include "dsp/threadedbasebandsamplesink.h"
-#include "ui_datvdemodgui.h"
+#include "dsp/dspengine.h"
#include "plugin/pluginapi.h"
#include "util/simpleserializer.h"
#include "util/db.h"
-#include "dsp/dspengine.h"
+#include "ui_datvdemodgui.h"
#include "gui/crightclickenabler.h"
#include "gui/audioselectdialog.h"
#include "mainwindow.h"
+#include "datvdemodreport.h"
+#include "datvdemodgui.h"
+
const QString DATVDemodGUI::m_strChannelID = "sdrangel.channel.demoddatv";
DATVDemodGUI* DATVDemodGUI::create(PluginAPI* objPluginAPI,
@@ -101,9 +101,9 @@ bool DATVDemodGUI::deserialize(const QByteArray& arrData)
bool DATVDemodGUI::handleMessage(const Message& message)
{
- if (DATVDemod::MsgReportModcodCstlnChange::match(message))
+ if (DATVDemodReport::MsgReportModcodCstlnChange::match(message))
{
- DATVDemod::MsgReportModcodCstlnChange& notif = (DATVDemod::MsgReportModcodCstlnChange&) message;
+ DATVDemodReport::MsgReportModcodCstlnChange& notif = (DATVDemodReport::MsgReportModcodCstlnChange&) message;
m_settings.m_fec = notif.getCodeRate();
m_settings.m_modulation = notif.getModulation();
m_settings.validateSystemConfiguration();
@@ -351,9 +351,6 @@ void DATVDemodGUI::applySettings(bool force)
{
qDebug("DATVDemodGUI::applySettings");
- DATVDemod::MsgConfigureChannelizer *msgChan = DATVDemod::MsgConfigureChannelizer::create(m_objChannelMarker.getCenterFrequency());
- m_objDATVDemod->getInputMessageQueue()->push(msgChan);
-
setTitleColor(m_objChannelMarker.getColor());
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force ? "true" : "false");
@@ -403,8 +400,8 @@ void DATVDemodGUI::tick()
{
m_modcodModulationIndex = m_objDATVDemod->getModcodModulation();
m_modcodCodeRateIndex = m_objDATVDemod->getModcodCodeRate();
- DATVDemodSettings::DATVModulation modulation = DATVDemod::getModulationFromLeanDVBCode(m_modcodModulationIndex);
- DATVDemodSettings::DATVCodeRate rate = DATVDemod::getCodeRateFromLeanDVBCode(m_modcodCodeRateIndex);
+ DATVDemodSettings::DATVModulation modulation = DATVDemodSettings::getModulationFromLeanDVBCode(m_modcodModulationIndex);
+ DATVDemodSettings::DATVCodeRate rate = DATVDemodSettings::getCodeRateFromLeanDVBCode(m_modcodCodeRateIndex);
QString modcodModulationStr = DATVDemodSettings::getStrFromModulation(modulation);
QString modcodCodeRateStr = DATVDemodSettings::getStrFromCodeRate(rate);
ui->statusText->setText(tr("MCOD %1 %2").arg(modcodModulationStr).arg(modcodCodeRateStr));
diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.cpp b/plugins/channelrx/demoddatv/datvdemodsettings.cpp
index 592fc4f42..8d1c32512 100644
--- a/plugins/channelrx/demoddatv/datvdemodsettings.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodsettings.cpp
@@ -18,6 +18,9 @@
#include
#include
+#include "leansdr/dvb.h"
+#include "leansdr/sdr.h"
+
#include "dsp/dspengine.h"
#include "util/simpleserializer.h"
#include "settings/serializable.h"
@@ -457,3 +460,62 @@ void DATVDemodSettings::getAvailableCodeRates(dvb_version dvbStandard, DATVModul
}
}
}
+
+DATVDemodSettings::DATVCodeRate DATVDemodSettings::getCodeRateFromLeanDVBCode(int leanDVBCodeRate)
+{
+ if (leanDVBCodeRate == leansdr::code_rate::FEC12) {
+ return DATVDemodSettings::DATVCodeRate::FEC12;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC13) {
+ return DATVDemodSettings::DATVCodeRate::FEC13;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC14) {
+ return DATVDemodSettings::DATVCodeRate::FEC14;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC23) {
+ return DATVDemodSettings::DATVCodeRate::FEC23;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC25) {
+ return DATVDemodSettings::DATVCodeRate::FEC25;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC34) {
+ return DATVDemodSettings::DATVCodeRate::FEC34;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC35) {
+ return DATVDemodSettings::DATVCodeRate::FEC35;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC45) {
+ return DATVDemodSettings::DATVCodeRate::FEC45;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC46) {
+ return DATVDemodSettings::DATVCodeRate::FEC46;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC56) {
+ return DATVDemodSettings::DATVCodeRate::FEC56;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC78) {
+ return DATVDemodSettings::DATVCodeRate::FEC78;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC89) {
+ return DATVDemodSettings::DATVCodeRate::FEC89;
+ } else if (leanDVBCodeRate == leansdr::code_rate::FEC910) {
+ return DATVDemodSettings::DATVCodeRate::FEC910;
+ } else {
+ return DATVDemodSettings::DATVCodeRate::RATE_UNSET;
+ }
+}
+
+DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromLeanDVBCode(int leanDVBModulation)
+{
+ if (leanDVBModulation == leansdr::cstln_base::predef::APSK16) {
+ return DATVDemodSettings::DATVModulation::APSK16;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK32) {
+ return DATVDemodSettings::DATVModulation::APSK32;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK64E) {
+ return DATVDemodSettings::DATVModulation::APSK64E;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::BPSK) {
+ return DATVDemodSettings::DATVModulation::BPSK;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::PSK8) {
+ return DATVDemodSettings::DATVModulation::PSK8;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM16) {
+ return DATVDemodSettings::DATVModulation::QAM16;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM64) {
+ return DATVDemodSettings::DATVModulation::QAM64;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM256) {
+ return DATVDemodSettings::DATVModulation::QAM256;
+ } else if (leanDVBModulation == leansdr::cstln_base::predef::QPSK) {
+ return DATVDemodSettings::DATVModulation::QPSK;
+ } else {
+ return DATVDemodSettings::DATVModulation::MOD_UNSET;
+ }
+}
+
diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.h b/plugins/channelrx/demoddatv/datvdemodsettings.h
index 111376634..51ca59b50 100644
--- a/plugins/channelrx/demoddatv/datvdemodsettings.h
+++ b/plugins/channelrx/demoddatv/datvdemodsettings.h
@@ -112,6 +112,8 @@ struct DATVDemodSettings
static QString getStrFromCodeRate(const DATVCodeRate codeRate);
static void getAvailableModulations(dvb_version dvbStandard, std::vector& modulations);
static void getAvailableCodeRates(dvb_version dvbStandard, DATVModulation modulation, std::vector& codeRates);
+ static DATVDemodSettings::DATVCodeRate getCodeRateFromLeanDVBCode(int leanDVBCodeRate);
+ static DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation);
};
#endif // PLUGINS_CHANNELRX_DEMODATV_DATVDEMODSETTINGS_H_
\ No newline at end of file
diff --git a/plugins/channelrx/demoddatv/datvdemodsink.cpp b/plugins/channelrx/demoddatv/datvdemodsink.cpp
index d7cd6b902..a7f5b8e1c 100644
--- a/plugins/channelrx/demoddatv/datvdemodsink.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodsink.cpp
@@ -15,23 +15,21 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
-#include "datvdemodreport.h"
#include "datvdemodsink.h"
#include "leansdr/dvbs2.h"
-#include
#include
#include
-#include
-#include
+
#include "audio/audiooutput.h"
#include "dsp/dspengine.h"
-
#include "dsp/downchannelizer.h"
#include "dsp/threadedbasebandsamplesink.h"
#include "device/deviceapi.h"
+#include "datvdemodreport.h"
+
const unsigned int DATVDemodSink::m_rfFilterFftLength = 1024;
DATVDemodSink::DATVDemodSink() :
@@ -1174,7 +1172,7 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
if (m_blnNeedConfigUpdate)
{
- qDebug("DATVDemod::feed: Settings applied. Standard : %d...", m_settings.m_standard);
+ qDebug("DATVDemodSink::feed: Settings applied. Standard : %d...", m_settings.m_standard);
m_blnNeedConfigUpdate=false;
if(m_settings.m_standard==DATVDemodSettings::DVB_S2)
@@ -1238,7 +1236,7 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
if (objDemodulatorDVBS2->cstln->m_setByModcod && !m_cstlnSetByModcod)
{
- qDebug("DATVDemod::feed: change by MODCOD detected");
+ qDebug("DATVDemodSink::feed: change by MODCOD detected");
if (r_scope_symbols_dvbs2) {
r_scope_symbols_dvbs2->calculate_cstln_points();
@@ -1247,8 +1245,8 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
if (getMessageQueueToGUI())
{
DATVDemodReport::MsgReportModcodCstlnChange *msg = DATVDemodReport::MsgReportModcodCstlnChange::create(
- getModulationFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_typeCode),
- getCodeRateFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_rateCode)
+ DATVDemodSettings::getModulationFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_typeCode),
+ DATVDemodSettings::getCodeRateFromLeanDVBCode(objDemodulatorDVBS2->cstln->m_rateCode)
);
getMessageQueueToGUI()->push(msg);
@@ -1273,7 +1271,7 @@ void DATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequ
(m_channelSampleRate != channelSampleRate) || force)
{
m_objNCO.setFreq(-(float) channelFrequencyOffset, (float) channelSampleRate);
- qDebug("DATVDemod::applyChannelSettings: NCO: IF: %d <> TF: %d ISR: %d",
+ qDebug("DATVDemodSink::applyChannelSettings: NCO: IF: %d <> TF: %d ISR: %d",
channelFrequencyOffset, m_settings.m_centerFrequency, channelSampleRate);
callApplySettings = true;
}
@@ -1362,64 +1360,6 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
m_settings = settings;
}
-DATVDemodSettings::DATVCodeRate DATVDemodSink::getCodeRateFromLeanDVBCode(int leanDVBCodeRate)
-{
- if (leanDVBCodeRate == leansdr::code_rate::FEC12) {
- return DATVDemodSettings::DATVCodeRate::FEC12;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC13) {
- return DATVDemodSettings::DATVCodeRate::FEC13;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC14) {
- return DATVDemodSettings::DATVCodeRate::FEC14;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC23) {
- return DATVDemodSettings::DATVCodeRate::FEC23;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC25) {
- return DATVDemodSettings::DATVCodeRate::FEC25;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC34) {
- return DATVDemodSettings::DATVCodeRate::FEC34;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC35) {
- return DATVDemodSettings::DATVCodeRate::FEC35;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC45) {
- return DATVDemodSettings::DATVCodeRate::FEC45;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC46) {
- return DATVDemodSettings::DATVCodeRate::FEC46;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC56) {
- return DATVDemodSettings::DATVCodeRate::FEC56;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC78) {
- return DATVDemodSettings::DATVCodeRate::FEC78;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC89) {
- return DATVDemodSettings::DATVCodeRate::FEC89;
- } else if (leanDVBCodeRate == leansdr::code_rate::FEC910) {
- return DATVDemodSettings::DATVCodeRate::FEC910;
- } else {
- return DATVDemodSettings::DATVCodeRate::RATE_UNSET;
- }
-}
-
-DATVDemodSettings::DATVModulation DATVDemodSink::getModulationFromLeanDVBCode(int leanDVBModulation)
-{
- if (leanDVBModulation == leansdr::cstln_base::predef::APSK16) {
- return DATVDemodSettings::DATVModulation::APSK16;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK32) {
- return DATVDemodSettings::DATVModulation::APSK32;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::APSK64E) {
- return DATVDemodSettings::DATVModulation::APSK64E;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::BPSK) {
- return DATVDemodSettings::DATVModulation::BPSK;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::PSK8) {
- return DATVDemodSettings::DATVModulation::PSK8;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM16) {
- return DATVDemodSettings::DATVModulation::QAM16;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM64) {
- return DATVDemodSettings::DATVModulation::QAM64;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QAM256) {
- return DATVDemodSettings::DATVModulation::QAM256;
- } else if (leanDVBModulation == leansdr::cstln_base::predef::QPSK) {
- return DATVDemodSettings::DATVModulation::QPSK;
- } else {
- return DATVDemodSettings::DATVModulation::MOD_UNSET;
- }
-}
-
int DATVDemodSink::getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate)
{
if (datvCodeRate == DATVDemodSettings::DATVCodeRate::FEC12) {
diff --git a/plugins/channelrx/demoddatv/datvdemodsink.h b/plugins/channelrx/demoddatv/datvdemodsink.h
index 19fbd1b68..091d86a04 100644
--- a/plugins/channelrx/demoddatv/datvdemodsink.h
+++ b/plugins/channelrx/demoddatv/datvdemodsink.h
@@ -35,28 +35,47 @@
#include "datvideorender.h"
#include "datvdemodsettings.h"
-#include "channel/channelapi.h"
#include "dsp/channelsamplesink.h"
-#include "dsp/basebandsamplesink.h"
-#include "dsp/devicesamplesource.h"
-#include "dsp/dspcommands.h"
-#include "dsp/downchannelizer.h"
#include "dsp/fftfilt.h"
#include "dsp/nco.h"
#include "dsp/interpolator.h"
#include "dsp/movingaverage.h"
#include "dsp/agc.h"
#include "audio/audiofifo.h"
-#include "util/message.h"
+#include "util/messagequeue.h"
#include "util/movingaverage.h"
-#include
-
class TVScreen;
class DATVideoRender;
class DATVDemodSink : public ChannelSampleSink {
public:
+ DATVDemodSink();
+ ~DATVDemodSink();
+
+ virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
+
+ bool setTVScreen(TVScreen *objScreen);
+ DATVideostream * SetVideoRender(DATVideoRender *objScreen);
+ bool audioActive();
+ bool audioDecodeOK();
+ bool videoActive();
+ bool videoDecodeOK();
+
+ bool PlayVideo(bool blnStartStop);
+
+ int GetSampleRate();
+ double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30
+ int getModcodModulation() const { return m_modcodModulation; }
+ int getModcodCodeRate() const { return m_modcodCodeRate; }
+ bool isCstlnSetByModcod() const { return m_cstlnSetByModcod; }
+ void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; }
+ AudioFifo *getAudioFifo() { return &m_audioFifo; }
+
+ void applySettings(const DATVDemodSettings& settings, bool force = false);
+ void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
+
+private:
struct config
{
DATVDemodSettings::dvb_version standard;
@@ -114,41 +133,17 @@ public:
}
};
- DATVDemodSink();
- ~DATVDemodSink();
-
- virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
-
- bool setTVScreen(TVScreen *objScreen);
- DATVideostream * SetVideoRender(DATVideoRender *objScreen);
- bool audioActive();
- bool audioDecodeOK();
- bool videoActive();
- bool videoDecodeOK();
-
- bool PlayVideo(bool blnStartStop);
-
- int GetSampleRate();
- double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30
- int getModcodModulation() const { return m_modcodModulation; }
- int getModcodCodeRate() const { return m_modcodCodeRate; }
- bool isCstlnSetByModcod() const { return m_cstlnSetByModcod; }
- static DATVDemodSettings::DATVCodeRate getCodeRateFromLeanDVBCode(int leanDVBCodeRate);
- static DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation);
- static int getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate);
- static int getLeanDVBModulationFromDATV(DATVDemodSettings::DATVModulation datvModulation);
- void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; }
-
- void applySettings(const DATVDemodSettings& settings, bool force = false);
- void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
-
-private:
inline int decimation(float Fin, float Fout) { int d = Fin / Fout; return std::max(d, 1); }
void CleanUpDATVFramework(bool blnRelease);
void InitDATVFramework();
void InitDATVS2Framework();
+ static int getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate);
+ static int getLeanDVBModulationFromDATV(DATVDemodSettings::DATVModulation datvModulation);
+
+ MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; }
+
unsigned long m_lngExpectedReadIQ;
long m_lngReadIQ;
@@ -308,9 +303,6 @@ private:
MessageQueue *m_messageQueueToGUI;
static const unsigned int m_rfFilterFftLength;
-
- MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; }
-
};
#endif // INCLUDE_DATVDEMODSINK_H
\ No newline at end of file