Factor out drawBuffer from updateDrawBuffer

This commit is contained in:
Gitea
2019-09-22 12:42:09 +02:00
parent 5df7b6fce5
commit 2b9b1cf9a4
2 changed files with 36 additions and 30 deletions

View File

@@ -113,19 +113,9 @@ void OsciWidget::darkenFrame()
//m_pixmap.fill(Qt::black);
}
void OsciWidget::updateDrawBuffer()
void OsciWidget::drawBuffer(SampleBuffer::iterator &bufferPos, const SampleBuffer::iterator &end)
{
// If there is no new data do not update
if(m_buffer.empty()) return;
if (m_pixmap.size() != size())
{
m_pixmap = QPixmap(size());
m_pixmap.fill(Qt::black);
}
darkenFrame();
QPainter painter(&m_pixmap);
painter.translate(m_pixmap.width()/2, m_pixmap.height()/2);
painter.scale(m_factor * m_pixmap.width() / 2.0, m_factor * m_pixmap.height() / 2.0);
@@ -136,18 +126,9 @@ void OsciWidget::updateDrawBuffer()
pen.setColor(QColor(0, 255, 0));
painter.setPen(pen);
// persistance time is the time it needs to decay to 1/e ~ 36,7%
auto duration = 1000*(m_bufferTimer.elapsed()-m_lastTime);
auto framesOffset = framesForDuration(duration);
//qDebug() << framesOffset << m_buffer.size()-framesOffset << m_bufferOffset - m_buffer.begin();
//m_bufferBegin = m_buffer.begin();
auto bufferEnd = m_buffer.begin() + framesOffset;
for (;m_bufferOffset < bufferEnd && m_bufferOffset != m_buffer.end(); ++m_bufferOffset)
for (;bufferPos < end; ++bufferPos)
{
const auto &frame = *m_bufferOffset;
const auto &frame = *bufferPos;
const QPointF p{
float(frame.first) / std::numeric_limits<qint16>::max(),
@@ -156,23 +137,45 @@ void OsciWidget::updateDrawBuffer()
const QLineF line(m_lastPoint, p);
// the time of one sample is 1/samplerate
// the brightness
auto beamOpacity = std::min(1.0, 1. / ((line.length() * m_lightspeed) + 1));
double time = 1000.0 * std::distance(m_bufferOffset, bufferEnd) / 44100.0;
double time = 1000.0 * std::distance(bufferPos, end) / 44100.0;
auto beamDecay = exp(-time/m_decayTime);
//qDebug() << time << beamDecay;
painter.setOpacity(beamDecay*beamOpacity);
painter.drawLine(m_lastPoint, p);
m_lastPoint = p;
}
}
void OsciWidget::resizeDrawBuffer()
{
if (m_pixmap.size() != size())
{
m_pixmap = QPixmap(size());
m_pixmap.fill(Qt::black);
}
}
void OsciWidget::updateDrawBuffer()
{
// If there is no new data do not update
if(m_buffer.empty()) return;
resizeDrawBuffer();
darkenFrame();
// persistance time is the time it needs to decay to 1/e ~ 36,7%
auto duration = 1000*(m_bufferTimer.elapsed()-m_lastTime);
size_t framesOffset = framesForDuration(duration);
//qDebug() << framesOffset << m_buffer.size()-framesOffset << m_bufferOffset - m_buffer.begin();
auto bufferEnd = m_buffer.begin() + std::min(framesOffset, m_buffer.size());
drawBuffer(m_bufferOffset, bufferEnd);
}
void OsciWidget::timerEvent(QTimerEvent *event)
{
QWidget::timerEvent(event);

View File

@@ -48,8 +48,9 @@ private:
float m_decayTime{25.0};
float m_lightspeed{35.f};
std::vector<SamplePair> m_buffer;
std::vector<SamplePair>::iterator m_bufferOffset;
typedef std::vector<SamplePair> SampleBuffer;
SampleBuffer m_buffer;
SampleBuffer::iterator m_bufferOffset;
int m_frameCounter{0}, m_callbacksCounter{0}, m_samplesCounter{0};
QElapsedTimer m_statsTimer;
@@ -60,4 +61,6 @@ private:
QPointF m_lastPoint;
QPixmap m_pixmap;
void darkenFrame();
void drawBuffer(SampleBuffer::iterator &bufferPos, const SampleBuffer::iterator &end);
void resizeDrawBuffer();
};