diff options
author | Uwe Klotz <uklotz@mixxx.org> | 2019-11-01 20:51:43 +0100 |
---|---|---|
committer | Uwe Klotz <uklotz@mixxx.org> | 2019-11-21 11:27:43 +0100 |
commit | 8e04492dcb85205a3ec8d9a33e238eac8651391f (patch) | |
tree | 696c11ea9f059ea4ccbc86f0f3ce078fdb69cf89 | |
parent | 0cdced650845d66c8fc5b71acb9ed7f9b1e914aa (diff) |
Move export of track metadata from TrackCollection into Library
95 files changed, 1473 insertions, 1201 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 2873b5bcde..5cd5f7015b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -401,6 +401,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/starrating.cpp src/library/tableitemdelegate.cpp src/library/trackcollection.cpp + src/library/trackcollectionmanager.cpp src/library/traktor/traktorfeature.cpp src/library/treeitem.cpp src/library/treeitemmodel.cpp diff --git a/build/depends.py b/build/depends.py index 5298cf87b7..0af34673e4 100644 --- a/build/depends.py +++ b/build/depends.py @@ -1006,6 +1006,7 @@ class MixxxCore(Feature): "src/database/schemamanager.cpp", "src/library/trackcollection.cpp", + "src/library/trackcollectionmanager.cpp", "src/library/externaltrackcollection.cpp", "src/library/basesqltablemodel.cpp", "src/library/basetrackcache.cpp", diff --git a/src/library/analysisfeature.cpp b/src/library/analysisfeature.cpp index 9ff6e0fcaf..8d25c684d4 100644 --- a/src/library/analysisfeature.cpp +++ b/src/library/analysisfeature.cpp @@ -16,15 +16,23 @@ #include "sources/soundsourceproxy.h" #include "util/dnd.h" #include "util/debug.h" - -const QString AnalysisFeature::m_sAnalysisViewName = QString("Analysis"); +#include "util/logger.h" namespace { +const mixxx::Logger kLogger("AnalysisFeature"); + +const QString kViewName = QString("Analysis"); + // Utilize all available cores for batch analysis of tracks const int kNumberOfAnalyzerThreads = math_max(1, QThread::idealThreadCount()); inline +int numberOfAnalyzerThreads() { + return kNumberOfAnalyzerThreads; +} + +inline AnalyzerModeFlags getAnalyzerModeFlags( const UserSettingsPointer& pConfig) { // Always enable at least BPM detection for batch analysis, even if disabled @@ -42,50 +50,34 @@ AnalyzerModeFlags getAnalyzerModeFlags( } // anonymous namespace AnalysisFeature::AnalysisFeature( - Library* parent, + Library* pLibrary, UserSettingsPointer pConfig) - : LibraryFeature(parent), - m_library(parent), - m_pConfig(pConfig), + : LibraryFeature(pLibrary, std::move(pConfig)), + m_baseTitle(tr("Analyze")), + m_icon(":/images/library/ic_library_prepare.svg"), m_pTrackAnalysisScheduler(TrackAnalysisScheduler::NullPointer()), - m_analysisTitleName(tr("Analyze")), m_pAnalysisView(nullptr), - m_icon(":/images/library/ic_library_prepare.svg") { - setTitleDefault(); + m_title(m_baseTitle) { } -void AnalysisFeature::stop() { - if (m_pTrackAnalysisScheduler) { - m_pTrackAnalysisScheduler->stop(); - } -} - -void AnalysisFeature::setTitleDefault() { - m_Title = m_analysisTitleName; - emit(featureIsLoading(this, false)); +void AnalysisFeature::resetTitle() { + m_title = m_baseTitle; + emit featureIsLoading(this, false); } void AnalysisFeature::setTitleProgress(int currentTrackNumber, int totalTracksCount) { - m_Title = QString("%1 (%2 / %3)") - .arg(m_analysisTitleName) + m_title = QString("%1 (%2 / %3)") + .arg(m_baseTitle) .arg(QString::number(currentTrackNumber)) .arg(QString::number(totalTracksCount)); - emit(featureIsLoading(this, false)); -} - -QVariant AnalysisFeature::title() { - return m_Title; -} - -QIcon AnalysisFeature::getIcon() { - return m_icon; + emit featureIsLoading(this, false); } void AnalysisFeature::bindLibraryWidget(WLibrary* libraryWidget, KeyboardEventFilter* keyboard) { m_pAnalysisView = new DlgAnalysis(libraryWidget, m_pConfig, - m_library); + m_pLibrary); connect(m_pAnalysisView, &DlgAnalysis::loadTrack, this, @@ -120,7 +112,7 @@ void AnalysisFeature::bindLibraryWidget(WLibrary* libraryWidget, // Let the DlgAnalysis know whether or not analysis is active. emit(analysisActive(static_cast<bool>(m_pTrackAnalysisScheduler))); - libraryWidget->registerView(m_sAnalysisViewName, m_pAnalysisView); + libraryWidget->registerView(kViewName, m_pAnalysisView); } TreeItemModel* AnalysisFeature::getChildModel() { @@ -135,36 +127,73 @@ void AnalysisFeature::refreshLibraryModels() { void AnalysisFeature::activate() { //qDebug() << "AnalysisFeature::activate()"; - emit(switchToView(m_sAnalysisViewName)); + emit switchToView(kViewName); if (m_pAnalysisView) { - emit(restoreSearch(m_pAnalysisView->currentSearch())); + emit restoreSearch(m_pAnalysisView->currentSearch()); } - emit(enableCoverArtDisplay(true)); + emit enableCoverArtDisplay(true); } void AnalysisFeature::analyzeTracks(QList<TrackId> trackIds) { if (!m_pTrackAnalysisScheduler) { + const int numAnalyzerThreads = numberOfAnalyzerThreads(); + kLogger.info() + << "Starting analysis using" + << numAnalyzerThreads + << "analyzer threads"; m_pTrackAnalysisScheduler = TrackAnalysisScheduler::createInstance( - m_library, - kNumberOfAnalyzerThreads, + m_pLibrary, + numAnalyzerThreads, m_pConfig, getAnalyzerModeFlags(m_pConfig)); - connect(m_pTrackAnalysisScheduler.get(), &TrackAnalysisScheduler::progress, - m_pAnalysisView, &DlgAnalysis::onTrackAnalysisSchedulerProgress); - connect(m_pTrackAnalysisScheduler.get(), &TrackAnalysisScheduler::finished, - m_pAnalysisView, &DlgAnalysis::onTrackAnalysisSchedulerFinished); - connect(m_pTrackAnalysisScheduler.get(), &TrackAnalysisScheduler::progress, - this, &AnalysisFeature::onTrackAnalysisSchedulerProgress); - connect(m_pTrackAnalysisScheduler.get(), &TrackAnalysisScheduler::finished, - this, &AnalysisFeature::stopAnalysis); - - emit(analysisActive(true)); + connect(m_pTrackAnalysisScheduler.get(), + &TrackAnalysisScheduler::progress, + m_pAnalysisView, + &DlgAnalysis::onTrackAnalysisSchedulerProgress); + connect(m_pTrackAnalysisScheduler.get(), + &TrackAnalysisScheduler::finished, + m_pAnalysisView, + &DlgAnalysis::onTrackAnalysisSchedulerFinished); + connect(m_pTrackAnalysisScheduler.get(), + &TrackAnalysisScheduler::progress, + this, + &AnalysisFeature::onTrackAnalysisSchedulerProgress); + connect(m_pTrackAnalysisScheduler.get(), + &TrackAnalysisScheduler::finished, + this, + &AnalysisFeature::onTrackAnalysisSchedulerFinished); + + emit analysisActive(true); } if (m_pTrackAnalysisScheduler->scheduleTracksById(trackIds) > 0) { - m_pTrackAnalysisScheduler->resume(); + resumeAnalysis(); + } +} + +void AnalysisFeature::suspendAnalysis() { + if (!m_pTrackAnalysisScheduler) { + return; // inactive + } + kLogger.info() << "Suspending analysis"; + m_pTrackAnalysisScheduler->suspend(); +} + +void AnalysisFeature::resumeAnalysis() { + if (!m_pTrackAnalysisScheduler) { + return; // inactive } + kLogger.info() << "Resuming analysis"; + m_pTrackAnalysisScheduler->resume(); +} + +void AnalysisFeature::stopAnalysis() { + if (!m_pTrackAnalysisScheduler) { + return; // inactive + } + kLogger.info() << "Stopping analysis"; + m_pTrackAnalysisScheduler->stop(); } void AnalysisFeature::onTrackAnalysisSchedulerProgress( @@ -173,31 +202,21 @@ void AnalysisFeature::onTrackAnalysisSchedulerProgress( int totalTracksCount) { // Ignore any delayed progress updates after the analysis // has already been stopped. - if (m_pTrackAnalysisScheduler) { - if (totalTracksCount > 0) { - setTitleProgress(currentTrackNumber, totalTracksCount); - } else { - setTitleDefault(); - } + if (!m_pTrackAnalysisScheduler) { + return; // inactive } -} - -void AnalysisFeature::suspendAnalysis() { - //qDebug() << this << "suspendAnalysis"; - if (m_pTrackAnalysisScheduler) { - m_pTrackAnalysisScheduler->suspend(); + if (totalTracksCount > 0) { + setTitleProgress(currentTrackNumber, totalTracksCount); + } else { + resetTitle(); } } -void AnalysisFeature::resumeAnalysis() { - //qDebug() << this << "resumeAnalysis"; - if (m_pTrackAnalysisScheduler) { - m_pTrackAnalysisScheduler->resume(); +void AnalysisFeature::onTrackAnalysisSchedulerFinished() { + if (!m_pTrackAnalysisScheduler) { + return; // already inactive } -} - -void AnalysisFeature::stopAnalysis() { - //qDebug() << this << "stopAnalysis()"; + kLogger.info() << "Finishing analysis"; if (m_pTrackAnalysisScheduler) { // Free resources by abandoning the queue after the batch analysis // has completed. Batch analysis are not started very frequently @@ -206,12 +225,12 @@ void AnalysisFeature::stopAnalysis() { // for creating the queue with its worker threads are acceptable. m_pTrackAnalysisScheduler.reset(); } - setTitleDefault(); - emit(analysisActive(false)); + resetTitle(); + emit analysisActive(false); } bool AnalysisFeature::dropAccept(QList<QUrl> urls, QObject* pSource) { - QList<TrackId> trackIds = m_library->trackCollection().resolveTrackIdsFromUrls(urls, + QList<TrackId> trackIds = m_pLibrary->trackCollection().resolveTrackIdsFromUrls(urls, !pSource); analyzeTracks(trackIds); return trackIds.size() > 0; diff --git a/src/library/analysisfeature.h b/src/library/analysisfeature.h index f49459af3a..50587b046e 100644 --- a/src/library/analysisfeature.h +++ b/src/library/analysisfeature.h @@ -18,20 +18,22 @@ #include "analyzer/trackanalysisscheduler.h" #include "preferences/usersettings.h" -class Library; class TrackCollection; |