summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2019-11-01 20:51:43 +0100
committerUwe Klotz <uklotz@mixxx.org>2019-11-21 11:27:43 +0100
commit8e04492dcb85205a3ec8d9a33e238eac8651391f (patch)
tree696c11ea9f059ea4ccbc86f0f3ce078fdb69cf89
parent0cdced650845d66c8fc5b71acb9ed7f9b1e914aa (diff)
Move export of track metadata from TrackCollection into Library
-rw-r--r--CMakeLists.txt1
-rw-r--r--build/depends.py1
-rw-r--r--src/library/analysisfeature.cpp159
-rw-r--r--src/library/analysisfeature.h29
-rw-r--r--src/library/analysislibrarytablemodel.cpp16
-rw-r--r--src/library/analysislibrarytablemodel.h13
-rw-r--r--src/library/autodj/autodjfeature.cpp39
-rw-r--r--src/library/autodj/autodjfeature.h10
-rw-r--r--src/library/autodj/autodjprocessor.cpp9
-rw-r--r--src/library/autodj/autodjprocessor.h6
-rw-r--r--src/library/autodj/dlgautodj.cpp16
-rw-r--r--src/library/autodj/dlgautodj.h11
-rw-r--r--src/library/banshee/bansheefeature.cpp13
-rw-r--r--src/library/banshee/bansheefeature.h5
-rw-r--r--src/library/banshee/bansheeplaylistmodel.cpp15
-rw-r--r--src/library/banshee/bansheeplaylistmodel.h2
-rw-r--r--src/library/baseexternallibraryfeature.cpp12
-rw-r--r--src/library/baseexternallibraryfeature.h11
-rw-r--r--src/library/baseexternalplaylistmodel.cpp10
-rw-r--r--src/library/baseexternalplaylistmodel.h2
-rw-r--r--src/library/baseexternaltrackmodel.cpp8
-rw-r--r--src/library/baseexternaltrackmodel.h2
-rw-r--r--src/library/baseplaylistfeature.cpp17
-rw-r--r--src/library/baseplaylistfeature.h8
-rw-r--r--src/library/basesqltablemodel.cpp37
-rw-r--r--src/library/basesqltablemodel.h15
-rw-r--r--src/library/basetrackcache.cpp96
-rw-r--r--src/library/basetrackcache.h25
-rw-r--r--src/library/browse/browsefeature.cpp16
-rw-r--r--src/library/browse/browsefeature.h7
-rw-r--r--src/library/browse/browsetablemodel.cpp11
-rw-r--r--src/library/browse/browsetablemodel.h7
-rw-r--r--src/library/crate/cratefeature.cpp15
-rw-r--r--src/library/crate/cratefeature.h7
-rw-r--r--src/library/crate/cratetablemodel.cpp40
-rw-r--r--src/library/crate/cratetablemodel.h2
-rw-r--r--src/library/dlganalysis.cpp7
-rw-r--r--src/library/dlganalysis.h2
-rw-r--r--src/library/dlghidden.cpp10
-rw-r--r--src/library/dlghidden.h10
-rw-r--r--src/library/dlgmissing.cpp7
-rw-r--r--src/library/dlgmissing.h10
-rw-r--r--src/library/externaltrackcollection.h9
-rw-r--r--src/library/hiddentablemodel.cpp14
-rw-r--r--src/library/hiddentablemodel.h7
-rw-r--r--src/library/itunes/itunesfeature.cpp17
-rw-r--r--src/library/itunes/itunesfeature.h3
-rw-r--r--src/library/library.cpp419
-rw-r--r--src/library/library.h93
-rw-r--r--src/library/libraryfeature.cpp18
-rw-r--r--src/library/libraryfeature.h20
-rw-r--r--src/library/librarytablemodel.cpp17
-rw-r--r--src/library/librarytablemodel.h2
-rw-r--r--src/library/missingtablemodel.cpp14
-rw-r--r--src/library/missingtablemodel.h7
-rw-r--r--src/library/mixxxlibraryfeature.cpp58
-rw-r--r--src/library/mixxxlibraryfeature.h19
-rw-r--r--src/library/playlistfeature.cpp28
-rw-r--r--src/library/playlistfeature.h5
-rw-r--r--src/library/playlisttablemodel.cpp48
-rw-r--r--src/library/playlisttablemodel.h5
-rw-r--r--src/library/recording/dlgrecording.cpp10
-rw-r--r--src/library/recording/dlgrecording.h3
-rw-r--r--src/library/recording/recordingfeature.cpp23
-rw-r--r--src/library/recording/recordingfeature.h22
-rw-r--r--src/library/rekordbox/rekordboxfeature.cpp16
-rw-r--r--src/library/rekordbox/rekordboxfeature.h7
-rw-r--r--src/library/rhythmbox/rhythmboxfeature.cpp16
-rw-r--r--src/library/rhythmbox/rhythmboxfeature.h3
-rw-r--r--src/library/setlogfeature.cpp16
-rw-r--r--src/library/setlogfeature.h8
-rw-r--r--src/library/trackcollection.cpp58
-rw-r--r--src/library/trackcollection.h32
-rw-r--r--src/library/trackcollectionmanager.cpp423
-rw-r--r--src/library/trackcollectionmanager.h101
-rw-r--r--src/library/traktor/traktorfeature.cpp25
-rw-r--r--src/library/traktor/traktorfeature.h14
-rw-r--r--src/mixer/playerinfo.cpp18
-rw-r--r--src/mixxx.cpp101
-rw-r--r--src/mixxx.h3
-rw-r--r--src/preferences/dialog/dlgprefwaveform.cpp1
-rw-r--r--src/sources/soundsourceproxy.h7
-rw-r--r--src/test/autodjprocessor_test.cpp20
-rw-r--r--src/test/directorydaotest.cpp10
-rw-r--r--src/test/libraryscannertest.cpp2
-rw-r--r--src/test/librarytest.cpp33
-rw-r--r--src/test/librarytest.h28
-rw-r--r--src/test/searchqueryparsertest.cpp28
-rw-r--r--src/test/trackdao_test.cpp2
-rw-r--r--src/track/globaltrackcache.cpp24
-rw-r--r--src/util/db/dbconnectionpooler.h4
-rw-r--r--src/widget/wanalysislibrarytableview.cpp4
-rw-r--r--src/widget/wanalysislibrarytableview.h4
-rw-r--r--src/widget/wtracktableview.cpp45
-rw-r--r--src/widget/wtracktableview.h21
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;
<