aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-02-09 21:50:02 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-02-09 21:50:02 +0000
commit5a3ed59f24db8696bc9402aaff3792ccb71492ff (patch)
tree937805f14f08750f974f000a66acac3555685af6 /src/plugins
parentea4dd7e0d5b85a78af57af5484d3760c507898f0 (diff)
downloadqmmp-5a3ed59f24db8696bc9402aaff3792ccb71492ff.tar.gz
qmmp-5a3ed59f24db8696bc9402aaff3792ccb71492ff.tar.bz2
qmmp-5a3ed59f24db8696bc9402aaff3792ccb71492ff.zip
qsui: added waveform seekbar loading effect
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9222 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp32
-rw-r--r--src/plugins/Ui/qsui/qsuiwaveformseekbar.h6
2 files changed, 31 insertions, 7 deletions
diff --git a/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp b/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp
index 3f2f8c355..4a8c80211 100644
--- a/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp
+++ b/src/plugins/Ui/qsui/qsuiwaveformseekbar.cpp
@@ -24,6 +24,7 @@
#include <QToolTip>
#include <QMenu>
#include <QAction>
+#include <QMutexLocker>
#include <cmath>
#include <qmmp/soundcore.h>
#include <qmmp/inputsource.h>
@@ -34,6 +35,8 @@
#include <qmmpui/metadataformatter.h>
#include "qsuiwaveformseekbar.h"
+#define NUMBER_OF_VALUES (4096)
+
QSUIWaveformSeekBar::QSUIWaveformSeekBar(QWidget *parent) : QWidget(parent)
{
m_core = SoundCore::instance();
@@ -77,6 +80,7 @@ void QSUIWaveformSeekBar::onStateChanged(Qmmp::State state)
{
m_scanner = new QSUIWaveformScanner(this);
connect(m_scanner, SIGNAL(finished()), SLOT(onScanFinished()));
+ connect(m_scanner, SIGNAL(dataChanged()), SLOT(onDataChanged()));
}
if(m_scanner)
m_scanner->scan(m_core->path());
@@ -115,6 +119,16 @@ void QSUIWaveformSeekBar::onScanFinished()
drawWaveform();
}
+void QSUIWaveformSeekBar::onDataChanged()
+{
+ if(!m_scanner || !m_scanner->isRunning())
+ return;
+
+ m_data = m_scanner->data();
+ m_channels = m_scanner->audioParameters().channels();
+ drawWaveform();
+}
+
void QSUIWaveformSeekBar::onElapsedChanged(qint64 elapsed)
{
m_elapsed = elapsed;
@@ -212,7 +226,7 @@ void QSUIWaveformSeekBar::drawWaveform()
m_pixmap = QPixmap(width(), height());
m_pixmap.fill(m_bgColor);
- float step = float(width()) * 3 * m_channels / m_data.size();
+ float step = float(width()) / NUMBER_OF_VALUES;
QPainter painter(&m_pixmap);
painter.setPen(m_waveFormColor);
@@ -403,6 +417,7 @@ void QSUIWaveformScanner::stop()
const QList<int> &QSUIWaveformScanner::data() const
{
+ QMutexLocker locker(&m_mutex);
return m_data;
}
@@ -421,13 +436,14 @@ void QSUIWaveformScanner::run()
m_data.clear();
qint64 frames = m_decoder->totalTime() * m_ap.sampleRate() / 1000;
- int samplesPerCalc = frames / 4096 * m_ap.channels();
+ int samplesPerValue = frames / NUMBER_OF_VALUES * m_ap.channels();
m_mutex.lock();
float *max = new float[m_ap.channels()]{ -1.0 };
float *min = new float[m_ap.channels()]{ 1.0 };
float *rms = new float[m_ap.channels()]{ 0 };
int counter = 0;
+ int channels = m_ap.channels();
while (!m_user_stop)
{
m_mutex.unlock();
@@ -438,23 +454,27 @@ void QSUIWaveformScanner::run()
for(uint sample = 0; sample < len / sizeof(float); sample++)
{
- int ch = sample % m_ap.channels();
+ int ch = sample % channels;
min[ch] = qMin(min[ch], out[sample]);
max[ch] = qMax(max[ch], out[sample]);
rms[ch] += (out[sample] * out[sample]);
counter++;
- if(counter >= samplesPerCalc)
+ if(counter >= samplesPerValue)
{
- for(int ch = 0; ch < m_ap.channels(); ++ch)
+ m_mutex.lock();
+ for(int ch = 0; ch < channels; ++ch)
{
m_data << max[ch] * 1000;
m_data << min[ch] * 1000;
- m_data << std::sqrt(rms[ch] / (counter / m_ap.channels())) * 1000;
+ m_data << std::sqrt(rms[ch] / (counter / channels)) * 1000;
max[ch] = -1.0;
min[ch] = 1.0;
rms[ch] = 0;
}
+ if(m_data.size() / 3 / channels % (NUMBER_OF_VALUES / 64) == 0)
+ emit dataChanged();
+ m_mutex.unlock();
counter = 0;
}
}
diff --git a/src/plugins/Ui/qsui/qsuiwaveformseekbar.h b/src/plugins/Ui/qsui/qsuiwaveformseekbar.h
index 6766b2400..12e3a7a32 100644
--- a/src/plugins/Ui/qsui/qsuiwaveformseekbar.h
+++ b/src/plugins/Ui/qsui/qsuiwaveformseekbar.h
@@ -48,6 +48,7 @@ public:
private slots:
void onStateChanged(Qmmp::State state);
void onScanFinished();
+ void onDataChanged();
void onElapsedChanged(qint64 elapsed);
void writeSettings();
@@ -86,13 +87,16 @@ public:
const QList<int> &data() const;
const AudioParameters &audioParameters() const;
+signals:
+ void dataChanged();
+
private:
void run() override;
bool m_user_stop = false;
Decoder *m_decoder = nullptr;
InputSource *m_input = nullptr;
- QMutex m_mutex;
+ mutable QMutex m_mutex;
QList<int> m_data;
AudioParameters m_ap;
};