1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-02 21:27:48 -04:00

TVScreenAnalog: removed usage of std::shared_ptr

This commit is contained in:
f4exb 2020-12-10 07:28:55 +01:00
parent ae3ce79cf2
commit ba642e8fab
3 changed files with 55 additions and 32 deletions

View File

@ -113,7 +113,7 @@ private:
//*************** ATV PARAMETERS *************** //*************** ATV PARAMETERS ***************
TVScreenAnalog *m_registeredTVScreen; TVScreenAnalog *m_registeredTVScreen;
std::shared_ptr<TVScreenAnalogBuffer> m_tvScreenBuffer; TVScreenAnalogBuffer *m_tvScreenBuffer;
//int m_intNumberSamplePerLine; //int m_intNumberSamplePerLine;
int m_numberSamplesPerHTop; //!< number of samples per horizontal synchronization pulse (pulse in ultra-black) - integer value int m_numberSamplesPerHTop; //!< number of samples per horizontal synchronization pulse (pulse in ultra-black) - integer value

View File

@ -65,24 +65,47 @@ static const char* fragmentShaderSource =
"}\n"; "}\n";
TVScreenAnalog::TVScreenAnalog(QWidget *parent) TVScreenAnalog::TVScreenAnalog(QWidget *parent)
: QGLWidget(parent) : QGLWidget(parent),
m_shader(nullptr),
m_imageTexture(nullptr),
m_lineShiftsTexture(nullptr)
{ {
m_isDataChanged = false; m_isDataChanged = false;
m_frontBuffer = std::make_shared<TVScreenAnalogBuffer>(5, 1); m_frontBuffer = new TVScreenAnalogBuffer(5, 1);
m_backBuffer = std::make_shared<TVScreenAnalogBuffer>(5, 1); m_backBuffer = new TVScreenAnalogBuffer(5, 1);
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(tick())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(tick()));
m_updateTimer.start(40); // capped at 25 FPS m_updateTimer.start(40); // capped at 25 FPS
} }
void TVScreenAnalog::cleanup() TVScreenAnalog::~TVScreenAnalog()
{ {
m_shader = nullptr; delete m_backBuffer;
m_imageTexture = nullptr; delete m_frontBuffer;
m_lineShiftsTexture = nullptr;
} }
std::shared_ptr<TVScreenAnalogBuffer> TVScreenAnalog::getBackBuffer() void TVScreenAnalog::cleanup()
{
if (m_shader)
{
delete m_shader;
m_shader = nullptr;
}
if (m_imageTexture)
{
delete m_imageTexture;
m_imageTexture = nullptr;
}
if (m_lineShiftsTexture)
{
delete m_lineShiftsTexture;
m_lineShiftsTexture = nullptr;
}
}
TVScreenAnalogBuffer *TVScreenAnalog::getBackBuffer()
{ {
return m_backBuffer; return m_backBuffer;
} }
@ -95,8 +118,10 @@ void TVScreenAnalog::resizeTVScreen(int intCols, int intRows)
QMutexLocker lock(&m_buffersMutex); QMutexLocker lock(&m_buffersMutex);
if (m_frontBuffer->getWidth() != colsAdj || m_frontBuffer->getHeight() != intRows) if (m_frontBuffer->getWidth() != colsAdj || m_frontBuffer->getHeight() != intRows)
{ {
m_frontBuffer = std::make_shared<TVScreenAnalogBuffer>(colsAdj, intRows); delete m_backBuffer;
m_backBuffer = std::make_shared<TVScreenAnalogBuffer>(colsAdj, intRows); delete m_frontBuffer;
m_frontBuffer = new TVScreenAnalogBuffer(colsAdj, intRows);
m_backBuffer = new TVScreenAnalogBuffer(colsAdj, intRows);
} }
} }
@ -112,29 +137,29 @@ void TVScreenAnalog::initializeGL()
connect(QOpenGLContext::currentContext(), &QOpenGLContext::aboutToBeDestroyed, connect(QOpenGLContext::currentContext(), &QOpenGLContext::aboutToBeDestroyed,
this, &TVScreenAnalog::cleanup); // TODO: when migrating to QOpenGLWidget this, &TVScreenAnalog::cleanup); // TODO: when migrating to QOpenGLWidget
m_shader = std::make_shared<QOpenGLShaderProgram>(this); m_shader = new QOpenGLShaderProgram(this);
if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource)) if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource))
{ {
qWarning() qWarning()
<< "TVScreenAnalog::initializeGL: error in vertex shader:" << "TVScreenAnalog::initializeGL: error in vertex shader:"
<< m_shader->log(); << m_shader->log();
m_shader = nullptr;
return; return;
} }
if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource)) if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource))
{ {
qWarning() qWarning()
<< "TVScreenAnalog::initializeGL: error in fragment shader:" << "TVScreenAnalog::initializeGL: error in fragment shader:"
<< m_shader->log(); << m_shader->log();
m_shader = nullptr;
return; return;
} }
if (!m_shader->link()) if (!m_shader->link())
{ {
qWarning() qWarning()
<< "TVScreenAnalog::initializeGL: error linking shader:" << "TVScreenAnalog::initializeGL: error linking shader:"
<< m_shader->log(); << m_shader->log();
m_shader = nullptr;
return; return;
} }
@ -148,10 +173,10 @@ void TVScreenAnalog::initializeGL()
m_texelHeightLoc = m_shader->uniformLocation("tlh"); m_texelHeightLoc = m_shader->uniformLocation("tlh");
} }
void TVScreenAnalog::initializeTextures(std::shared_ptr<TVScreenAnalogBuffer> buffer) void TVScreenAnalog::initializeTextures(TVScreenAnalogBuffer *buffer)
{ {
m_imageTexture = std::make_shared<QOpenGLTexture>(QOpenGLTexture::Target2D); m_imageTexture = new QOpenGLTexture(QOpenGLTexture::Target2D);
m_lineShiftsTexture = std::make_shared<QOpenGLTexture>(QOpenGLTexture::Target2D); m_lineShiftsTexture = new QOpenGLTexture(QOpenGLTexture::Target2D);
m_imageTexture->setSize(buffer->getWidth(), buffer->getHeight()); m_imageTexture->setSize(buffer->getWidth(), buffer->getHeight());
m_lineShiftsTexture->setSize(1, buffer->getHeight()); m_lineShiftsTexture->setSize(1, buffer->getHeight());
m_imageTexture->setFormat(QOpenGLTexture::RGBA8_UNorm); m_imageTexture->setFormat(QOpenGLTexture::RGBA8_UNorm);
@ -171,7 +196,7 @@ void TVScreenAnalog::initializeTextures(std::shared_ptr<TVScreenAnalogBuffer> bu
m_lineShiftsTexture->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::ClampToEdge); m_lineShiftsTexture->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::ClampToEdge);
} }
std::shared_ptr<TVScreenAnalogBuffer> TVScreenAnalog::swapBuffers() TVScreenAnalogBuffer *TVScreenAnalog::swapBuffers()
{ {
QMutexLocker lock(&m_buffersMutex); QMutexLocker lock(&m_buffersMutex);
std::swap(m_frontBuffer, m_backBuffer); std::swap(m_frontBuffer, m_backBuffer);
@ -198,7 +223,7 @@ void TVScreenAnalog::paintGL()
return; return;
} }
std::shared_ptr<TVScreenAnalogBuffer> buffer = m_frontBuffer; TVScreenAnalogBuffer *buffer = m_frontBuffer;
if (!m_imageTexture || if (!m_imageTexture ||
m_imageTexture->width() != buffer->getWidth() || m_imageTexture->width() != buffer->getWidth() ||

View File

@ -25,9 +25,6 @@
#include "export.h" #include "export.h"
#include <memory>
#include <algorithm>
#include <QMutex> #include <QMutex>
#include <QTimer> #include <QTimer>
#include <QGLWidget> #include <QGLWidget>
@ -129,22 +126,23 @@ class SDRGUI_API TVScreenAnalog : public QGLWidget, protected QOpenGLFunctions
int m_texCoordAttribIndex; int m_texCoordAttribIndex;
QMutex m_buffersMutex; QMutex m_buffersMutex;
std::shared_ptr<TVScreenAnalogBuffer> m_frontBuffer; TVScreenAnalogBuffer *m_frontBuffer;
std::shared_ptr<TVScreenAnalogBuffer> m_backBuffer; TVScreenAnalogBuffer *m_backBuffer;
std::shared_ptr<QOpenGLShaderProgram> m_shader; QOpenGLShaderProgram *m_shader;
std::shared_ptr<QOpenGLTexture> m_imageTexture; QOpenGLTexture *m_imageTexture;
std::shared_ptr<QOpenGLTexture> m_lineShiftsTexture; QOpenGLTexture *m_lineShiftsTexture;
public: public:
TVScreenAnalog(QWidget *parent); TVScreenAnalog(QWidget *parent);
~TVScreenAnalog();
std::shared_ptr<TVScreenAnalogBuffer> getBackBuffer(); TVScreenAnalogBuffer *getBackBuffer();
std::shared_ptr<TVScreenAnalogBuffer> swapBuffers(); TVScreenAnalogBuffer *swapBuffers();
void resizeTVScreen(int intCols, int intRows); void resizeTVScreen(int intCols, int intRows);
private: private:
void initializeTextures(std::shared_ptr<TVScreenAnalogBuffer> buffer); void initializeTextures(TVScreenAnalogBuffer *buffer);
void initializeGL() override; void initializeGL() override;
void paintGL() override; void paintGL() override;
void resizeGL(int width, int height); void resizeGL(int width, int height);