diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-02-09 21:50:02 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-02-09 21:50:02 +0000 |
| commit | 5a3ed59f24db8696bc9402aaff3792ccb71492ff (patch) | |
| tree | 937805f14f08750f974f000a66acac3555685af6 /src/plugins | |
| parent | ea4dd7e0d5b85a78af57af5484d3760c507898f0 (diff) | |
| download | qmmp-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.cpp | 32 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuiwaveformseekbar.h | 6 |
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; }; |
