diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index 9379f1853..93e8192cb 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -31,9 +31,9 @@ MESSAGE_CLASS_DEFINITION(ATVDemod::MsgReportEffectiveSampleRate, Message) const int ATVDemod::m_ssbFftLen = 1024; -ATVDemod::ATVDemod(BasebandSampleSink* objScopeSink) : - m_objScopeSink(objScopeSink), - m_objRegisteredATVScreen(NULL), +ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) : + m_deviceAPI(deviceAPI), + m_registeredATVScreen(NULL), m_intNumberSamplePerTop(0), m_intImageIndex(0), m_intSynchroPoints(0), @@ -88,7 +88,7 @@ ATVDemod::~ATVDemod() void ATVDemod::setATVScreen(ATVScreen *objScreen) { - m_objRegisteredATVScreen = objScreen; + m_registeredATVScreen = objScreen; } void ATVDemod::configure( @@ -207,10 +207,10 @@ void ATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto } } - if ((m_running.m_intVideoTabIndex == 1) && (m_objScopeSink != 0)) // do only if scope tab is selected and scope is available + if ((m_running.m_intVideoTabIndex == 1) && (m_scopeSink != 0)) // do only if scope tab is selected and scope is available { - m_objScopeSink->feed(m_objScopeSampleBuffer.begin(), m_objScopeSampleBuffer.end(), false); // m_ssb = positive only - m_objScopeSampleBuffer.clear(); + m_scopeSink->feed(m_scopeSampleBuffer.begin(), m_scopeSampleBuffer.end(), false); // m_ssb = positive only + m_scopeSampleBuffer.clear(); } if (ptrBufferToRelease != 0) @@ -390,8 +390,8 @@ void ATVDemod::demod(Complex& c) fltVal = m_running.m_blnInvertVideo ? 1.0f - fltVal : fltVal; fltVal = (fltVal < -1.0f) ? -1.0f : (fltVal > 1.0f) ? 1.0f : fltVal; - if ((m_running.m_intVideoTabIndex == 1) && (m_objScopeSink != 0)) { // feed scope buffer only if scope is present and visible - m_objScopeSampleBuffer.push_back(Sample(fltVal*32767.0f, 0.0f)); + if ((m_running.m_intVideoTabIndex == 1) && (m_scopeSink != 0)) { // feed scope buffer only if scope is present and visible + m_scopeSampleBuffer.push_back(Sample(fltVal*32767.0f, 0.0f)); } m_fltAmpLineAverage += fltVal; @@ -490,9 +490,9 @@ bool ATVDemod::handleMessage(const Message& cmd) } else { - if (m_objScopeSink != 0) + if (m_scopeSink != 0) { - return m_objScopeSink->handleMessage(cmd); + return m_scopeSink->handleMessage(cmd); } else { @@ -574,8 +574,8 @@ void ATVDemod::applySettings() m_configPrivate.m_intNumberSamplePerLine = (int) (m_config.m_fltLineDuration * m_config.m_intSampleRate); m_intNumberSamplePerTop = (int) (m_config.m_fltTopDuration * m_config.m_intSampleRate); - m_objRegisteredATVScreen->setRenderImmediate(!(m_config.m_fltFramePerS > 25.0f)); - m_objRegisteredATVScreen->resizeATVScreen( + m_registeredATVScreen->setRenderImmediate(!(m_config.m_fltFramePerS > 25.0f)); + m_registeredATVScreen->resizeATVScreen( m_configPrivate.m_intNumberSamplePerLine - m_intNumberSamplePerLineSignals, m_intNumberOfLines - m_intNumberOfBlackLines); diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 414bb7156..a561d834e 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -38,6 +38,7 @@ #include "util/message.h" #include "atvscreen.h" +class DeviceSourceAPI; class ATVDemod : public BasebandSampleSink { @@ -146,8 +147,9 @@ public: { } }; - ATVDemod(BasebandSampleSink* objScopeSink); + ATVDemod(DeviceSourceAPI *deviceAPI); ~ATVDemod(); + void setScopeSink(BasebandSampleSink* scopeSink) { m_scopeSink = scopeSink; } void configure(MessageQueue* objMessageQueue, float fltLineDurationUs, @@ -339,13 +341,15 @@ private: bool m_start; }; + DeviceSourceAPI* m_deviceAPI; + //*************** SCOPE *************** - BasebandSampleSink* m_objScopeSink; - SampleVector m_objScopeSampleBuffer; + BasebandSampleSink* m_scopeSink; + SampleVector m_scopeSampleBuffer; //*************** ATV PARAMETERS *************** - ATVScreen * m_objRegisteredATVScreen; + ATVScreen * m_registeredATVScreen; //int m_intNumberSamplePerLine; int m_intNumberSamplePerTop; @@ -429,7 +433,7 @@ private: inline void processHSkip(float& fltVal, int& intVal) { - m_objRegisteredATVScreen->setDataColor(m_intColIndex - m_intNumberSaplesPerHSync + m_intNumberSamplePerTop, intVal, intVal, intVal); + m_registeredATVScreen->setDataColor(m_intColIndex - m_intNumberSaplesPerHSync + m_intNumberSamplePerTop, intVal, intVal, intVal); // Horizontal Synchro detection @@ -454,7 +458,7 @@ private: { //qDebug("VSync: %d %d %d", m_intColIndex, m_intSampleIndex, m_intLineIndex); m_intAvgColIndex = m_intColIndex; - m_objRegisteredATVScreen->renderImage(0); + m_registeredATVScreen->renderImage(0); m_intImageIndex++; m_intLineIndex = 0; @@ -502,7 +506,7 @@ private: m_fltEffMax = -2000000.0f; } - m_objRegisteredATVScreen->selectRow(m_intRowIndex); + m_registeredATVScreen->selectRow(m_intRowIndex); m_intLineIndex++; m_intRowIndex++; } @@ -590,7 +594,7 @@ private: if (m_intRowIndex < m_intNumberOfLines) { - m_objRegisteredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); + m_registeredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); } m_intLineIndex++; @@ -599,7 +603,7 @@ private: // Filling pixels // +4 is to compensate shift due to hsync amortizing factor of 1/4 - m_objRegisteredATVScreen->setDataColor(m_intColIndex - m_intNumberSaplesPerHSync + m_intNumberSamplePerTop + 4, intVal, intVal, intVal); + m_registeredATVScreen->setDataColor(m_intColIndex - m_intNumberSaplesPerHSync + m_intNumberSamplePerTop + 4, intVal, intVal, intVal); m_intColIndex++; // Vertical sync and image rendering @@ -618,7 +622,7 @@ private: if ((m_intLineIndex % 2 == 0) || !m_interleaved) // even => odd image { - m_objRegisteredATVScreen->renderImage(0); + m_registeredATVScreen->renderImage(0); m_intRowIndex = 1; } else @@ -626,7 +630,7 @@ private: m_intRowIndex = 0; } - m_objRegisteredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); + m_registeredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); m_intLineIndex = 0; m_intImageIndex++; } @@ -643,7 +647,7 @@ private: { if (m_intImageIndex % 2 == 1) // odd image { - m_objRegisteredATVScreen->renderImage(0); + m_registeredATVScreen->renderImage(0); if (m_rfRunning.m_enmModulation == ATV_AM) { @@ -668,7 +672,7 @@ private: m_intRowIndex = 0; } - m_objRegisteredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); + m_registeredATVScreen->selectRow(m_intRowIndex - m_intNumberOfSyncLines); m_intLineIndex = 0; m_intImageIndex++; } diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 7ad3ee474..7683dbc22 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -284,7 +284,8 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); m_scopeVis = new ScopeVisNG(ui->glScope); - m_atvDemod = new ATVDemod(m_scopeVis); + m_atvDemod = new ATVDemod(m_deviceAPI); + m_atvDemod->setScopeSink(m_scopeVis); m_atvDemod->setMessageQueueToGUI(getInputMessageQueue()); m_atvDemod->setATVScreen(ui->screenTV); diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index dec3d9194..643857d92 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -385,16 +385,20 @@ void ATVMod::pullVideo(Real& sample) time_t start, end; cv::Mat frame; - MsgReportCameraData *report; - report = MsgReportCameraData::create( - camera.m_cameraNumber, - 0.0f, - camera.m_videoFPSManual, - camera.m_videoFPSManualEnable, - camera.m_videoWidth, - camera.m_videoHeight, - 1); // open splash screen on GUI side - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportCameraData *report; + report = MsgReportCameraData::create( + camera.m_cameraNumber, + 0.0f, + camera.m_videoFPSManual, + camera.m_videoFPSManualEnable, + camera.m_videoWidth, + camera.m_videoHeight, + 1); // open splash screen on GUI side + getMessageQueueToGUI()->push(report); + } + int nbFrames = 0; time(&start); @@ -414,15 +418,19 @@ void ATVMod::pullVideo(Real& sample) camera.m_videoFPSCount = camera.m_videoFPSq; camera.m_videoPrevFPSCount = 0; - report = MsgReportCameraData::create( - camera.m_cameraNumber, - camera.m_videoFPS, - camera.m_videoFPSManual, - camera.m_videoFPSManualEnable, - camera.m_videoWidth, - camera.m_videoHeight, - 2); // close splash screen on GUI side - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportCameraData *report; + report = MsgReportCameraData::create( + camera.m_cameraNumber, + camera.m_videoFPS, + camera.m_videoFPSManual, + camera.m_videoFPSManualEnable, + camera.m_videoWidth, + camera.m_videoHeight, + 2); // close splash screen on GUI side + getMessageQueueToGUI()->push(report); + } } else if (camera.m_videoFPS == 0.0f) // Hideous hack for windows { @@ -431,16 +439,19 @@ void ATVMod::pullVideo(Real& sample) camera.m_videoFPSCount = camera.m_videoFPSq; camera.m_videoPrevFPSCount = 0; - MsgReportCameraData *report; - report = MsgReportCameraData::create( - camera.m_cameraNumber, - camera.m_videoFPS, - camera.m_videoFPSManual, - camera.m_videoFPSManualEnable, - camera.m_videoWidth, - camera.m_videoHeight, - 0); - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportCameraData *report; + report = MsgReportCameraData::create( + camera.m_cameraNumber, + camera.m_videoFPS, + camera.m_videoFPSManual, + camera.m_videoFPSManualEnable, + camera.m_videoWidth, + camera.m_videoHeight, + 0); + getMessageQueueToGUI()->push(report); + } } int fpsIncrement = (int) camera.m_videoFPSCount - camera.m_videoPrevFPSCount; @@ -601,9 +612,12 @@ bool ATVMod::handleMessage(const Message& cmd) framesCount = 0; } - MsgReportVideoFileSourceStreamTiming *report; - report = MsgReportVideoFileSourceStreamTiming::create(framesCount); - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportVideoFileSourceStreamTiming *report; + report = MsgReportVideoFileSourceStreamTiming::create(framesCount); + getMessageQueueToGUI()->push(report); + } return true; } @@ -615,16 +629,20 @@ bool ATVMod::handleMessage(const Message& cmd) if (index < m_cameras.size()) { m_cameraIndex = index; - MsgReportCameraData *report; - report = MsgReportCameraData::create( - m_cameras[m_cameraIndex].m_cameraNumber, - m_cameras[m_cameraIndex].m_videoFPS, - m_cameras[m_cameraIndex].m_videoFPSManual, - m_cameras[m_cameraIndex].m_videoFPSManualEnable, - m_cameras[m_cameraIndex].m_videoWidth, - m_cameras[m_cameraIndex].m_videoHeight, - 0); - getMessageQueueToGUI()->push(report); + + if (getMessageQueueToGUI()) + { + MsgReportCameraData *report; + report = MsgReportCameraData::create( + m_cameras[m_cameraIndex].m_cameraNumber, + m_cameras[m_cameraIndex].m_videoFPS, + m_cameras[m_cameraIndex].m_videoFPSManual, + m_cameras[m_cameraIndex].m_videoFPSManualEnable, + m_cameras[m_cameraIndex].m_videoWidth, + m_cameras[m_cameraIndex].m_videoHeight, + 0); + getMessageQueueToGUI()->push(report); + } } return true; @@ -721,9 +739,12 @@ void ATVMod::apply(bool force) applyStandard(); // set all timings m_settingsMutex.unlock(); - MsgReportEffectiveSampleRate *report; - report = MsgReportEffectiveSampleRate::create(m_tvSampleRate, m_pointsPerLine); - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportEffectiveSampleRate *report; + report = MsgReportEffectiveSampleRate::create(m_tvSampleRate, m_pointsPerLine); + getMessageQueueToGUI()->push(report); + } } if ((m_config.m_outputSampleRate != m_running.m_outputSampleRate) @@ -977,9 +998,12 @@ void ATVMod::openVideo(const QString& fileName) calculateVideoSizes(); m_videoEOF = false; - MsgReportVideoFileSourceStreamData *report; - report = MsgReportVideoFileSourceStreamData::create(m_videoFPS, m_videoLength); - getMessageQueueToGUI()->push(report); + if (getMessageQueueToGUI()) + { + MsgReportVideoFileSourceStreamData *report; + report = MsgReportVideoFileSourceStreamData::create(m_videoFPS, m_videoLength); + getMessageQueueToGUI()->push(report); + } } else { @@ -1114,16 +1138,20 @@ void ATVMod::getCameraNumbers(std::vector& numbers) if (m_cameras.size() > 0) { m_cameraIndex = 0; - MsgReportCameraData *report; - report = MsgReportCameraData::create( - m_cameras[0].m_cameraNumber, - m_cameras[0].m_videoFPS, - m_cameras[0].m_videoFPSManual, - m_cameras[0].m_videoFPSManualEnable, - m_cameras[0].m_videoWidth, - m_cameras[0].m_videoHeight, - 0); - getMessageQueueToGUI()->push(report); + + if (getMessageQueueToGUI()) + { + MsgReportCameraData *report; + report = MsgReportCameraData::create( + m_cameras[0].m_cameraNumber, + m_cameras[0].m_videoFPS, + m_cameras[0].m_videoFPSManual, + m_cameras[0].m_videoFPSManualEnable, + m_cameras[0].m_videoWidth, + m_cameras[0].m_videoHeight, + 0); + getMessageQueueToGUI()->push(report); + } } } diff --git a/sdrbase/dsp/basebandsamplesource.cpp b/sdrbase/dsp/basebandsamplesource.cpp index 76ea093a3..edbf2d2f4 100644 --- a/sdrbase/dsp/basebandsamplesource.cpp +++ b/sdrbase/dsp/basebandsamplesource.cpp @@ -19,6 +19,7 @@ #include "util/message.h" BasebandSampleSource::BasebandSampleSource() : + m_guiMessageQueue(0), m_sampleFifo(48000) // arbitrary, will be adjusted to match device sink FIFO size { connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));