From c236956884e3c7b9a47536f98eb7eb5a126a26e4 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Wed, 18 Apr 2018 16:39:07 +0200 Subject: Fix and enable multi-threaded analysis --- src/widget/woverview.cpp | 61 ++++++++++++++++++++++++--------------------- src/widget/woverview.h | 18 +++++++------ src/widget/woverviewhsv.cpp | 9 ++++--- src/widget/woverviewhsv.h | 6 ++++- src/widget/woverviewlmh.cpp | 9 ++++--- src/widget/woverviewlmh.h | 6 ++++- src/widget/woverviewrgb.cpp | 9 ++++--- src/widget/woverviewrgb.h | 6 ++++- 8 files changed, 75 insertions(+), 49 deletions(-) (limited to 'src/widget') diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp index 4872d950f0..8f17c3f4a5 100644 --- a/src/widget/woverview.cpp +++ b/src/widget/woverview.cpp @@ -26,6 +26,7 @@ #include "wskincolor.h" #include "widget/controlwidgetconnection.h" #include "track/track.h" +#include "analyzer/analyzerprogress.h" #include "util/math.h" #include "util/timer.h" #include "util/dnd.h" @@ -33,13 +34,17 @@ #include "waveform/waveform.h" #include "waveform/waveformwidgetfactory.h" -WOverview::WOverview(const char *pGroup, UserSettingsPointer pConfig, QWidget* parent) : +WOverview::WOverview( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent) : WWidget(parent), m_actualCompletion(0), m_pixmapDone(false), m_waveformPeak(-1.0), m_diffGain(0), - m_group(pGroup), + m_group(group), m_pConfig(pConfig), m_endOfTrack(false), m_bDrag(false), @@ -47,8 +52,7 @@ WOverview::WOverview(const char *pGroup, UserSettingsPointer pConfig, QWidget* p m_orientation(Qt::Horizontal), m_a(1.0), m_b(0.0), - m_dAnalyzerProgress(1.0), - m_bAnalyzerFinalizing(false), + m_analyzerProgress(kAnalyzerProgressUnknown), m_trackLoaded(false), m_scaleFactor(1.0) { m_endOfTrackControl = new ControlProxy( @@ -59,6 +63,9 @@ WOverview::WOverview(const char *pGroup, UserSettingsPointer pConfig, QWidget* p new ControlProxy(m_group, "track_samples", this); m_playControl = new ControlProxy(m_group, "play", this); setAcceptDrops(true); + + connect(pPlayerManager, SIGNAL(trackAnalyzerProgress(TrackId, AnalyzerProgress)), + this, SLOT(onTrackAnalyzerProgress(TrackId, AnalyzerProgress))); } void WOverview::setup(const QDomNode& node, const SkinContext& context) { @@ -172,7 +179,7 @@ void WOverview::slotWaveformSummaryUpdated() { } else { // Null waveform pointer means waveform was cleared. m_waveformSourceImage = QImage(); - m_dAnalyzerProgress = 1.0; + m_analyzerProgress = kAnalyzerProgressUnknown; m_actualCompletion = 0; m_waveformPeak = -1.0; m_pixmapDone = false; @@ -181,19 +188,14 @@ void WOverview::slotWaveformSummaryUpdated() { } } -void WOverview::slotAnalyzerProgress(int progress) { - if (!m_pCurrentTrack) { +void WOverview::onTrackAnalyzerProgress(TrackId trackId, AnalyzerProgress analyzerProgress) { + if (!m_pCurrentTrack || (m_pCurrentTrack->getId() != trackId)) { return; } - double analyzerProgress = progress / 1000.0; - bool finalizing = progress == 999; - bool updateNeeded = drawNextPixmapPart(); - // progress 0 .. 1000 - if (updateNeeded || (m_dAnalyzerProgress != analyzerProgress)) { - m_dAnalyzerProgress = analyzerProgress; - m_bAnalyzerFinalizing = finalizing; + if (updateNeeded || (m_analyzerProgress != analyzerProgress)) { + m_analyzerProgress = analyzerProgress; update(); } } @@ -210,12 +212,10 @@ void WOverview::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) if (m_pCurrentTrack != nullptr) { disconnect(m_pCurrentTrack.get(), SIGNAL(waveformSummaryUpdated()), this, SLOT(slotWaveformSummaryUpdated())); - disconnect(m_pCurrentTrack.get(), SIGNAL(analyzerProgress(int)), - this, SLOT(slotAnalyzerProgress(int))); } m_waveformSourceImage = QImage(); - m_dAnalyzerProgress = 1.0; + m_analyzerProgress = kAnalyzerProgressUnknown; m_actualCompletion = 0; m_waveformPeak = -1.0; m_pixmapDone = false; @@ -228,10 +228,6 @@ void WOverview::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) connect(pNewTrack.get(), SIGNAL(waveformSummaryUpdated()), this, SLOT(slotWaveformSummaryUpdated())); - connect(pNewTrack.get(), SIGNAL(analyzerProgress(int)), - this, SLOT(slotAnalyzerProgress(int))); - - slotAnalyzerProgress(pNewTrack->getAnalyzerProgress()); } else { m_pCurrentTrack.reset(); m_pWaveform.clear(); @@ -350,21 +346,28 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { } } - if (m_dAnalyzerProgress < 1.0) { + if ((m_analyzerProgress >= kAnalyzerProgressNone) && + (m_analyzerProgress < kAnalyzerProgressDone)) { // Paint analyzer Progress painter.setPen(QPen(m_signalColors.getAxesColor(), 3 * m_scaleFactor)); - if (m_dAnalyzerProgress > 0.0) { + if (m_analyzerProgress > kAnalyzerProgressNone) { if (m_orientation == Qt::Horizontal) { - painter.drawLine(m_dAnalyzerProgress * width(), height() / 2, - width(), height() / 2); + painter.drawLine( + width() * m_analyzerProgress, + height() / 2, + width(), + height() / 2); } else { - painter.drawLine(width() / 2 , m_dAnalyzerProgress * height(), - width() / 2, height()); + painter.drawLine( + width() / 2 , + height() * m_analyzerProgress, + width() / 2, + height()); } } - if (m_dAnalyzerProgress <= 0.5) { // remove text after progress by wf is recognizable + if (m_analyzerProgress <= kAnalyzerProgressHalf) { // remove text after progress by wf is recognizable if (m_trackLoaded) { //: Text on waveform overview when file is playable but no waveform is visible paintText(tr("Ready to play, analyzing .."), &painter); @@ -372,7 +375,7 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { //: Text on waveform overview when file is cached from source paintText(tr("Loading track .."), &painter); } - } else if (m_bAnalyzerFinalizing) { + } else if (m_analyzerProgress >= kAnalyzerProgressFinalizing) { //: Text on waveform overview during finalizing of waveform analysis paintText(tr("Finalizing .."), &painter); } diff --git a/src/widget/woverview.h b/src/widget/woverview.h index 952caf7513..625a5bbf26 100644 --- a/src/widget/woverview.h +++ b/src/widget/woverview.h @@ -20,32 +20,36 @@ #include "track/track.h" #include "widget/wwidget.h" +#include "analyzer/analyzerprogress.h" #include "waveform/renderers/waveformsignalcolors.h" #include "waveform/renderers/waveformmarkset.h" #include "waveform/renderers/waveformmarkrange.h" #include "skin/skincontext.h" -// Waveform overview display -// @author Tue Haste Andersen -class Waveform; +class PlayerManager; class WOverview : public WWidget { Q_OBJECT public: - WOverview(const char* pGroup, UserSettingsPointer pConfig, QWidget* parent=nullptr); - void setup(const QDomNode& node, const SkinContext& context); public slots: void onConnectedControlChanged(double dParameter, double dValue) override; void slotTrackLoaded(TrackPointer pTrack); void slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack); + void onTrackAnalyzerProgress(TrackId trackId, AnalyzerProgress analyzerProgress); signals: void trackDropped(QString filename, QString group); protected: + WOverview( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent = nullptr); + void mouseMoveEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void mousePressEvent(QMouseEvent *e) override; @@ -86,7 +90,6 @@ class WOverview : public WWidget { void onMarkRangeChange(double v); void slotWaveformSummaryUpdated(); - void slotAnalyzerProgress(int progress); private: // Append the waveform overview pixmap according to available data in waveform @@ -129,8 +132,7 @@ class WOverview : public WWidget { double m_a; double m_b; - double m_dAnalyzerProgress; - bool m_bAnalyzerFinalizing; + AnalyzerProgress m_analyzerProgress; bool m_trackLoaded; double m_scaleFactor; }; diff --git a/src/widget/woverviewhsv.cpp b/src/widget/woverviewhsv.cpp index e125737f3c..00e830ceda 100644 --- a/src/widget/woverviewhsv.cpp +++ b/src/widget/woverviewhsv.cpp @@ -7,9 +7,12 @@ #include "util/math.h" #include "waveform/waveform.h" -WOverviewHSV::WOverviewHSV(const char* pGroup, - UserSettingsPointer pConfig, QWidget* parent) - : WOverview(pGroup, pConfig, parent) { +WOverviewHSV::WOverviewHSV( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent) + : WOverview(group, pPlayerManager, pConfig, parent) { } bool WOverviewHSV::drawNextPixmapPart() { diff --git a/src/widget/woverviewhsv.h b/src/widget/woverviewhsv.h index e6f85d5fd3..7b59639c65 100644 --- a/src/widget/woverviewhsv.h +++ b/src/widget/woverviewhsv.h @@ -5,7 +5,11 @@ class WOverviewHSV : public WOverview { public: - WOverviewHSV(const char *pGroup, UserSettingsPointer pConfig, QWidget* parent); + WOverviewHSV( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent = nullptr); private: bool drawNextPixmapPart() override; diff --git a/src/widget/woverviewlmh.cpp b/src/widget/woverviewlmh.cpp index bf838f2e33..833b86339c 100644 --- a/src/widget/woverviewlmh.cpp +++ b/src/widget/woverviewlmh.cpp @@ -8,9 +8,12 @@ #include "util/math.h" #include "waveform/waveform.h" -WOverviewLMH::WOverviewLMH(const char *pGroup, - UserSettingsPointer pConfig, QWidget * parent) - : WOverview(pGroup, pConfig, parent) { +WOverviewLMH::WOverviewLMH( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent) + : WOverview(group, pPlayerManager, pConfig, parent) { } diff --git a/src/widget/woverviewlmh.h b/src/widget/woverviewlmh.h index e144f76489..c6ed4cb16f 100644 --- a/src/widget/woverviewlmh.h +++ b/src/widget/woverviewlmh.h @@ -5,7 +5,11 @@ class WOverviewLMH : public WOverview { public: - WOverviewLMH(const char *pGroup, UserSettingsPointer pConfig, QWidget* parent); + WOverviewLMH( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent = nullptr); private: bool drawNextPixmapPart() override; diff --git a/src/widget/woverviewrgb.cpp b/src/widget/woverviewrgb.cpp index 6a4c348efc..e6519da967 100644 --- a/src/widget/woverviewrgb.cpp +++ b/src/widget/woverviewrgb.cpp @@ -6,9 +6,12 @@ #include "util/math.h" #include "waveform/waveform.h" -WOverviewRGB::WOverviewRGB(const char* pGroup, - UserSettingsPointer pConfig, QWidget* parent) - : WOverview(pGroup, pConfig, parent) { +WOverviewRGB::WOverviewRGB( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent) + : WOverview(group, pPlayerManager, pConfig, parent) { } bool WOverviewRGB::drawNextPixmapPart() { diff --git a/src/widget/woverviewrgb.h b/src/widget/woverviewrgb.h index 646886e442..3a9382efca 100644 --- a/src/widget/woverviewrgb.h +++ b/src/widget/woverviewrgb.h @@ -5,7 +5,11 @@ class WOverviewRGB : public WOverview { public: - WOverviewRGB(const char *pGroup, UserSettingsPointer pConfig, QWidget* parent); + WOverviewRGB( + const char* group, + PlayerManager* pPlayerManager, + UserSettingsPointer pConfig, + QWidget* parent = nullptr); private: bool drawNextPixmapPart() override; -- cgit v1.2.3