diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-01-06 18:42:02 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-01-06 18:42:02 +0000 |
| commit | cfb167d3881891ebd91e89c7493f27a1354bce4b (patch) | |
| tree | f4611d2bc4b1394458109c354eb1b2f87dd54f23 /src/plugins/Ui/qsui | |
| parent | f5101e5553f40b9c526d7b498e39cd30c9a6b708 (diff) | |
| download | qmmp-cfb167d3881891ebd91e89c7493f27a1354bce4b.tar.gz qmmp-cfb167d3881891ebd91e89c7493f27a1354bce4b.tar.bz2 qmmp-cfb167d3881891ebd91e89c7493f27a1354bce4b.zip | |
qsui: waverform seekbar optimization
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9184 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/qsui')
| -rw-r--r-- | src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp | 137 |
1 files changed, 104 insertions, 33 deletions
diff --git a/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp b/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp index 5f9622d2a..af3c59f0c 100644 --- a/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp +++ b/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp @@ -111,75 +111,146 @@ void QSUIWaveformSeekBar::paintEvent(QPaintEvent *e) if(m_data.isEmpty()) return; - float step = (float)width() / (m_data.count() / 3 / m_channels); + float step = float(width()) * 3 * m_channels / m_data.size(); - painter.setPen("#BECBFF"); - for(int i = 0; i < m_data.count(); i+=3) + if(m_duration > 0) + { + QColor color(Qt::darkMagenta); + QBrush brush(color); + painter.fillRect(0, 0, width() * m_elapsed / m_duration, height(), brush); + } + + + painter.setPen(Qt::cyan); + painter.setBrush(Qt::cyan); + + for(int i = 0; i < m_data.size() - m_channels * 3; i+=3) { int ch = (i / 3) % m_channels; - float x = step * i / 3 / m_channels; + float x1 = step * (i / m_channels / 3); + float x2 = step * (i / m_channels / 3 + 1); + + if(x1 > (float) width() * m_elapsed / m_duration) + { + painter.setPen("#BECBFF"); + painter.setBrush(QColor("#BECBFF")); + } if(ch == 0 && m_channels == 1) { float y1 = height()/2 - m_data[i] * (height() / 4) / 1000; float y2 = height()/2 - m_data[i+1] * (height() / 4) / 1000; + float y3 = height()/2 - m_data[i+3] * (height() / 4) / 1000; + float y4 = height()/2 - m_data[i+4] * (height() / 4) / 1000; - painter.drawLine(x, y1, x, y2); + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + painter.drawPolygon(points, 4); } else if(ch == 0) { float y1 = height()/4 - m_data[i] * (height() / 8) / 1000; - float y2 = height()/4 - m_data[i+1] * (height() / 8) / 1000; - - painter.drawLine(x, y1, x, y2); - + float y2 = height()/4 - m_data[i + 1] * (height() / 8) / 1000; + float y3 = height()/4 - m_data[i + m_channels * 3] * (height() / 8) / 1000; + float y4 = height()/4 - m_data[i + m_channels * 3 + 1] * (height() / 8) / 1000; + + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + + painter.drawPolygon(points, 4); } else if(ch == 1) { float y1 = 3*height()/4 - m_data[i] * (height() / 8) / 1000; - float y2 = 3*height()/4 - m_data[i+1] * (height() / 8) / 1000; - - painter.drawLine(x, y1, x, y2); - + float y2 = 3*height()/4 - m_data[i + 1] * (height() / 8) / 1000; + float y3 = 3*height()/4 - m_data[i + m_channels * 3] * (height() / 8) / 1000; + float y4 = 3*height()/4 - m_data[i + m_channels * 3 + 1] * (height() / 8) / 1000; + + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + + painter.drawPolygon(points, 4); } } painter.setPen("#DDDDDD"); + painter.setBrush(QColor("#DDDDDD")); - for(int i = 0; i < m_data.count(); i+=3) + for(int i = 0; i < m_data.size() - m_channels * 3; i+=3) { int ch = (i / 3) % m_channels; - float x = step * i / 3 / m_channels; + float x1 = step * (i / m_channels / 3); + float x2 = step * (i / m_channels / 3 + 1); + + /*if(x1 > (float) width() * m_elapsed / m_duration) + { + painter.setPen("#BECBFF"); + painter.setBrush(QColor("#BECBFF")); + }*/ if(ch == 0 && m_channels == 1) { - float y3 = height()/2 - m_data[i+2] * (height() / 4) / 1000; - float y4 = height()/2 + m_data[i+2] * (height() / 4) / 1000; - painter.drawLine(x, y3, x, y4); + float y1 = height()/2 - m_data[i + 2] * (height() / 4) / 1000; + float y2 = height()/2 + m_data[i + 2] * (height() / 4) / 1000; + float y3 = height()/2 - m_data[i + 5] * (height() / 4) / 1000; + float y4 = height()/2 + m_data[i + 5] * (height() / 4) / 1000; + + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + + painter.drawPolygon(points, 4); } else if(ch == 0) { - float y3 = height()/4 - m_data[i+2] * (height() / 8) / 1000; - float y4 = height()/4 + m_data[i+2] * (height() / 8) / 1000; - painter.drawLine(x, y3, x, y4); + float y1 = height()/4 - m_data[i + 2] * (height() / 8) / 1000; + float y2 = height()/4 + m_data[i + 2] * (height() / 8) / 1000; + float y3 = height()/4 - m_data[i + m_channels * 3 + 2] * (height() / 8) / 1000; + float y4 = height()/4 + m_data[i + m_channels * 3 + 2] * (height() / 8) / 1000; + + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + + painter.drawPolygon(points, 4); } else if(ch == 1) { - float y3 = 3*height()/4 - m_data[i+2] * (height() / 8) / 1000; - float y4 = 3*height()/4 + m_data[i+2] * (height() / 8) / 1000; - painter.drawLine(x, y3, x, y4); + float y1 = 3*height()/4 - m_data[i + 2] * (height() / 8) / 1000; + float y2 = 3*height()/4 + m_data[i + 2] * (height() / 8) / 1000; + float y3 = 3*height()/4 - m_data[i + m_channels * 3 + 2] * (height() / 8) / 1000; + float y4 = 3*height()/4 + m_data[i + m_channels * 3 + 2] * (height() / 8) / 1000; + + QPointF points[4] = { + { x1, y1 }, + { x1, y2 }, + { x2, y4 }, + { x2, y3 } + }; + + painter.drawPolygon(points, 4); } } - - if(m_duration > 0) - { - QColor color(Qt::white); - color.setAlpha(120); - QBrush brush(color); - painter.fillRect(0, 0, width() * m_elapsed / m_duration, height(), brush); - } } QSUIWaveformScanner::QSUIWaveformScanner(QObject *parent) : QThread(parent) @@ -290,7 +361,7 @@ void QSUIWaveformScanner::run() m_data.clear(); qint64 frames = m_decoder->totalTime() * m_ap.sampleRate() / 1000; - int samplesForCalculation = frames / 4096 * m_ap.channels(); + int samplesForCalculation = frames / 512 * m_ap.channels(); m_mutex.lock(); float max[m_ap.channels()] = { -1.0 }, min[m_ap.channels()] = { 1.0 }, rms[m_ap.channels()] = { 0 }; |
