summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2019-11-02 10:32:17 +0100
committerUwe Klotz <uklotz@mixxx.org>2019-11-21 11:27:42 +0100
commitd643918e52b9ed5b36fd2f7917bc0e277786d568 (patch)
tree7bfcecea51d32b6e9a6ca89121b780d88ac40e90
parentb9b10382606837faf45e9933278a24fbc4e36428 (diff)
Get or add single tracks via TrackCollection
-rw-r--r--src/analyzer/trackanalysisscheduler.cpp2
-rw-r--r--src/library/autodj/autodjfeature.cpp2
-rw-r--r--src/library/banshee/bansheeplaylistmodel.cpp5
-rw-r--r--src/library/baseexternalplaylistmodel.cpp5
-rw-r--r--src/library/baseexternaltrackmodel.cpp5
-rw-r--r--src/library/baseplaylistfeature.cpp2
-rw-r--r--src/library/baseplaylistfeature.h4
-rw-r--r--src/library/basesqltablemodel.cpp4
-rw-r--r--src/library/basesqltablemodel.h2
-rw-r--r--src/library/basetrackcache.cpp1
-rw-r--r--src/library/basetrackcache.h1
-rw-r--r--src/library/browse/browsetablemodel.cpp10
-rw-r--r--src/library/dao/autodjcratesdao.cpp4
-rw-r--r--src/library/dao/trackdao.cpp56
-rw-r--r--src/library/dao/trackdao.h28
-rw-r--r--src/library/library.cpp4
-rw-r--r--src/library/mixxxlibraryfeature.cpp15
-rw-r--r--src/library/mixxxlibraryfeature.h1
-rw-r--r--src/library/trackcollection.cpp23
-rw-r--r--src/library/trackcollection.h6
-rw-r--r--src/test/autodjprocessor_test.cpp2
21 files changed, 102 insertions, 80 deletions
diff --git a/src/analyzer/trackanalysisscheduler.cpp b/src/analyzer/trackanalysisscheduler.cpp
index 8c91fdb8c9..45179a6105 100644
--- a/src/analyzer/trackanalysisscheduler.cpp
+++ b/src/analyzer/trackanalysisscheduler.cpp
@@ -275,7 +275,7 @@ bool TrackAnalysisScheduler::submitNextTrack(Worker* worker) {
DEBUG_ASSERT(nextTrackId.isValid());
if (nextTrackId.isValid()) {
TrackPointer nextTrack =
- m_library->trackCollection().getTrackDAO().getTrack(nextTrackId);
+ m_library->trackCollection().getTrackById(nextTrackId);
if (nextTrack) {
if (m_pendingTrackIds.insert(nextTrackId).second) {
if (worker->submitNextTrack(std::move(nextTrack))) {
diff --git a/src/library/autodj/autodjfeature.cpp b/src/library/autodj/autodjfeature.cpp
index bcf7b4d014..dd055d84a1 100644
--- a/src/library/autodj/autodjfeature.cpp
+++ b/src/library/autodj/autodjfeature.cpp
@@ -254,7 +254,7 @@ void AutoDJFeature::slotAddRandomTrack() {
}
if (randomTrackId.isValid()) {
- pRandomTrack = m_pTrackCollection->getTrackDAO().getTrack(randomTrackId);
+ pRandomTrack = m_pTrackCollection->getTrackById(randomTrackId);
VERIFY_OR_DEBUG_ASSERT(pRandomTrack) {
qWarning() << "Track does not exist:"
<< randomTrackId;
diff --git a/src/library/banshee/bansheeplaylistmodel.cpp b/src/library/banshee/bansheeplaylistmodel.cpp
index d2e2453cf1..7c6a1256a0 100644
--- a/src/library/banshee/bansheeplaylistmodel.cpp
+++ b/src/library/banshee/bansheeplaylistmodel.cpp
@@ -315,8 +315,9 @@ TrackPointer BansheePlaylistModel::getTrack(const QModelIndex& index) const {
}
bool track_already_in_library = false;
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO()
- .getOrAddTrack(location, true, &track_already_in_library);
+ TrackPointer pTrack = m_pTrackCollection->getOrAddTrack(
+ TrackRef::fromFileInfo(location),
+ &track_already_in_library);
// If this track was not in the Mixxx library it is now added and will be
// saved with the metadata from Banshee. If it was already in the library
diff --git a/src/library/baseexternalplaylistmodel.cpp b/src/library/baseexternalplaylistmodel.cpp
index 2ba94fe30b..8b557777af 100644
--- a/src/library/baseexternalplaylistmodel.cpp
+++ b/src/library/baseexternalplaylistmodel.cpp
@@ -31,8 +31,9 @@ TrackPointer BaseExternalPlaylistModel::getTrack(const QModelIndex& index) const
}
bool track_already_in_library = false;
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO()
- .getOrAddTrack(location, true, &track_already_in_library);
+ TrackPointer pTrack = m_pTrackCollection->getOrAddTrack(
+ TrackRef::fromFileInfo(location),
+ &track_already_in_library);
// If this track was not in the Mixxx library it is now added and will be
// saved with the metadata from iTunes. If it was already in the library
diff --git a/src/library/baseexternaltrackmodel.cpp b/src/library/baseexternaltrackmodel.cpp
index 3dfd3df083..00893fbb46 100644
--- a/src/library/baseexternaltrackmodel.cpp
+++ b/src/library/baseexternaltrackmodel.cpp
@@ -56,8 +56,9 @@ TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const {
}
bool track_already_in_library = false;
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO()
- .getOrAddTrack(location, true, &track_already_in_library);
+ TrackPointer pTrack = m_pTrackCollection->getOrAddTrack(
+ TrackRef::fromFileInfo(location),
+ &track_already_in_library);
if (pTrack) {
// If this track was not in the Mixxx library it is now added and will be
diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp
index c8cfd0e318..39c4bf9521 100644
--- a/src/library/baseplaylistfeature.cpp
+++ b/src/library/baseplaylistfeature.cpp
@@ -5,6 +5,7 @@
#include <QFileInfo>
#include <QStandardPaths>
+#include "library/dao/playlistdao.h"
#include "library/export/trackexportwizard.h"
#include "library/library.h"
#include "library/parser.h"
@@ -26,7 +27,6 @@ BasePlaylistFeature::BasePlaylistFeature(QObject* parent,
: LibraryFeature(pConfig, parent),
m_pTrackCollection(pTrackCollection),
m_playlistDao(pTrackCollection->getPlaylistDAO()),
- m_trackDao(pTrackCollection->getTrackDAO()),
m_pPlaylistTableModel(NULL),
m_rootViewName(rootViewName) {
m_pCreatePlaylistAction = new QAction(tr("Create New Playlist"),this);
diff --git a/src/library/baseplaylistfeature.h b/src/library/baseplaylistfeature.h
index 23bb45d334..0164fba853 100644
--- a/src/library/baseplaylistfeature.h
+++ b/src/library/baseplaylistfeature.h
@@ -12,12 +12,11 @@
#include <QString>
#include "library/libraryfeature.h"
-#include "library/dao/playlistdao.h"
-#include "library/dao/trackdao.h"
#include "track/track.h"
class WLibrary;
class KeyboardEventFilter;
+class PlaylistDAO;
class PlaylistTableModel;
class TrackCollection;
class TreeItem;
@@ -89,7 +88,6 @@ class BasePlaylistFeature : public LibraryFeature {
TrackCollection* m_pTrackCollection;
PlaylistDAO &m_playlistDao;
- TrackDAO &m_trackDao;
PlaylistTableModel* m_pPlaylistTableModel;
QAction *m_pCreatePlaylistAction;
QAction *m_pDeletePlaylistAction;
diff --git a/src/library/basesqltablemodel.cpp b/src/library/basesqltablemodel.cpp
index 6c107958f9..c712633608 100644
--- a/src/library/basesqltablemodel.cpp
+++ b/src/library/basesqltablemodel.cpp
@@ -844,7 +844,7 @@ bool BaseSqlTableModel::setData(
// TODO(rryan) ugly and only works because the mixxx library tables are the
// only ones that aren't read-only. This should be moved into BTC.
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO().getTrack(trackId);
+ TrackPointer pTrack = m_pTrackCollection->getTrackById(trackId);
if (!pTrack) {
return false;
}
@@ -920,7 +920,7 @@ TrackId BaseSqlTableModel::getTrackId(const QModelIndex& index) const {
}
TrackPointer BaseSqlTableModel::getTrack(const QModelIndex& index) const {
- return m_pTrackCollection->getTrackDAO().getTrack(getTrackId(index));
+ return m_pTrackCollection->getTrackById(getTrackId(index));
}
QString BaseSqlTableModel::getTrackLocation(const QModelIndex& index) const {
diff --git a/src/library/basesqltablemodel.h b/src/library/basesqltablemodel.h
index 8b54a5f36c..19a69f5e19 100644
--- a/src/library/basesqltablemodel.h
+++ b/src/library/basesqltablemodel.h
@@ -56,7 +56,7 @@ class BaseSqlTableModel : public QAbstractTableModel, public TrackModel {
// Functions that might be reimplemented/overridden in derived classes
///////////////////////////////////////////////////////////////////////////
// This class also has protected variables that should be used in children
- // m_database, m_pTrackCollection, m_trackDAO
+ // m_database, m_pTrackCollection
// calls readWriteFlags() by default, reimplement this if the child calls
// should be readOnly
diff --git a/src/library/basetrackcache.cpp b/src/library/basetrackcache.cpp
index 7aba40a0fa..61e9e09890 100644
--- a/src/library/basetrackcache.cpp
+++ b/src/library/basetrackcache.cpp
@@ -30,7 +30,6 @@ BaseTrackCache::BaseTrackCache(TrackCollection* pTrackCollection,
m_columnCache(columns),
m_bIndexBuilt(false),
m_bIsCaching(isCaching),
- m_trackDAO(pTrackCollection->getTrackDAO()),
m_database(pTrackCollection->database()),
m_pQueryParser(new SearchQueryParser(pTrackCollection)) {
m_searchColumns << "artist"
diff --git a/src/library/basetrackcache.h b/src/library/basetrackcache.h
index 1d77420d6b..ac7c7a4d4d 100644
--- a/src/library/basetrackcache.h
+++ b/src/library/basetrackcache.h
@@ -147,7 +147,6 @@ class BaseTrackCache : public QObject {
bool m_bIndexBuilt;
bool m_bIsCaching;
QHash<TrackId, QVector<QVariant> > m_trackInfo;
- TrackDAO& m_trackDAO;
QSqlDatabase m_database;
SearchQueryParser* m_pQueryParser;
ControlProxy* m_pKeyNotationCP;
diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp
index a7a7d52df2..49c3296714 100644
--- a/src/library/browse/browsetablemodel.cpp
+++ b/src/library/browse/browsetablemodel.cpp
@@ -153,13 +153,13 @@ void BrowseTableModel::setPath(const MDir& path) {
}
TrackPointer BrowseTableModel::getTrack(const QModelIndex& index) const {
- QString track_location = getTrackLocation(index);
- if (m_pRecordingManager->getRecordingLocation() == track_location) {
+ QString trackLocation = getTrackLocation(index);
+ if (m_pRecordingManager->getRecordingLocation() == trackLocation) {
QMessageBox::critical(
0, tr("Mixxx Library"),
tr("Could not load the following file because"
" it is in use by Mixxx or another application.")
- + "\n" +track_location);
+ + "\n" + trackLocation);
return TrackPointer();
}
// NOTE(uklotzde, 2015-12-08): Accessing tracks from the browse view
@@ -170,8 +170,8 @@ TrackPointer BrowseTableModel::getTrack(const QModelIndex& index) const {
// them edit the tracks in a way that persists across sessions
// and we didn't want to edit the files on disk by default
// unless the user opts in to that.
- return m_pTrackCollection->getTrackDAO()
- .getOrAddTrack(track_location, true, NULL);
+ return m_pTrackCollection->getOrAddTrack(
+ TrackRef::fromFileInfo(trackLocation));
}
QString BrowseTableModel::getTrackLocation(const QModelIndex& index) const {
diff --git a/src/library/dao/autodjcratesdao.cpp b/src/library/dao/autodjcratesdao.cpp
index 64e0949267..84c9b4d3d0 100644
--- a/src/library/dao/autodjcratesdao.cpp
+++ b/src/library/dao/autodjcratesdao.cpp
@@ -710,8 +710,8 @@ TrackId AutoDJCratesDAO::getRandomTrackIdFromAutoDj(int percentActive) {
// Signaled by the track DAO when a track's information is updated.
void AutoDJCratesDAO::slotTrackDirty(TrackId trackId) {
// Update our record of the number of times played, if that changed.
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO().getTrack(trackId);
- if (pTrack == NULL) {
+ TrackPointer pTrack = m_pTrackCollection->getTrackById(trackId);
+ if (!pTrack) {
return;
}
const PlayCounter playCounter(pTrack->getPlayCounter());
diff --git a/src/library/dao/trackdao.cpp b/src/library/dao/trackdao.cpp
index 55a2cc07b5..b804a477cd 100644
--- a/src/library/dao/trackdao.cpp
+++ b/src/library/dao/trackdao.cpp
@@ -1182,12 +1182,22 @@ struct ColumnPopulator {
#define ARRAYLENGTH(x) (sizeof(x) / sizeof(*x))
-TrackPointer TrackDAO::getTrackFromDB(TrackId trackId) const {
+TrackPointer TrackDAO::getTrackById(TrackId trackId) const {
if (!trackId.isValid()) {
return TrackPointer();
}
- ScopedTimer t("TrackDAO::getTrackFromDB");
+ // The GlobalTrackCache is only locked while executing the following line.
+ auto pTrack = GlobalTrackCacheLocker().lookupTrackById(trackId);
+ if (pTrack) {
+ return pTrack;
+ }
+
+ // Accessing the database is a time consuming operation that should not
+ // be executed with a lock on the GlobalTrackCache. The GlobalTrackCache
+ // will be locked again after the query has been executed (see below)
+ // and potential race conditions will be resolved.
+ ScopedTimer t("TrackDAO::getTrackById");
QSqlQuery query(m_database);
ColumnPopulator columns[] = {
@@ -1281,7 +1291,7 @@ TrackPointer TrackDAO::getTrackFromDB(TrackId trackId) const {
const QString trackLocation(queryRecord.value(0).toString());
GlobalTrackCacheResolver cacheResolver(TrackFile(trackLocation), trackId);
- TrackPointer pTrack = cacheResolver.getTrack();
+ pTrack = cacheResolver.getTrack();
VERIFY_OR_DEBUG_ASSERT(pTrack) {
// Just to be safe, but this should never happen!!
return pTrack;
@@ -1394,18 +1404,6 @@ TrackPointer TrackDAO::getTrackFromDB(TrackId trackId) const {
return pTrack;
}
-TrackPointer TrackDAO::getTrack(TrackId trackId) const {
- //qDebug() << "TrackDAO::getTrack" << QThread::currentThread() << m_database.connectionName();
-
- // The GlobalTrackCache is only locked while executing the following line.
- TrackPointer pTrack = GlobalTrackCacheLocker().lookupTrackById(trackId);
- // Accessing the database is a time consuming operation that should
- // not be executed with a lock on the GlobalTrackCache. The GlobalTrackCache will
- // be locked again after the query has been executed and potential
- // race conditions will be resolved in getTrackFromDB()
- return pTrack ? pTrack : getTrackFromDB(trackId);
-}
-
// Saves a track's info back to the database
bool TrackDAO::updateTrack(Track* pTrack) {
const TrackId trackId = pTrack->getId();
@@ -1971,18 +1969,17 @@ void TrackDAO::detectCoverArtForTracksWithoutCover(volatile const bool* pCancel,
}
}
-TrackPointer TrackDAO::getOrAddTrack(const QString& trackLocation,
- bool processCoverArt,
- bool* pAlreadyInLibrary) {
+TrackPointer TrackDAO::getOrAddTrackByLocation(
+ const QString& trackLocation,
+ bool* pAlreadyInLibrary) {
const TrackId trackId = getTrackId(trackLocation);
- const bool trackAlreadyInLibrary = trackId.isValid();
if (pAlreadyInLibrary) {
- *pAlreadyInLibrary = trackAlreadyInLibrary;
+ *pAlreadyInLibrary = trackId.isValid();
}
TrackPointer pTrack;
- if (trackAlreadyInLibrary) {
- pTrack = getTrack(trackId);
+ if (trackId.isValid()) {
+ pTrack = getTrackById(trackId);
if (!pTrack) {
qWarning() << "Failed to load track"
<< trackLocation;
@@ -1996,15 +1993,12 @@ TrackPointer TrackDAO::getOrAddTrack(const QString& trackLocation,
<< trackLocation;
return pTrack;
}
- DEBUG_ASSERT(pTrack);
- // If the track wasn't in the library already then it has not yet been
- // checked for cover art. If processCoverArt is true then we should request
- // cover processing via CoverArtCache asynchronously.
- if (processCoverArt) {
- CoverArtCache* pCache = CoverArtCache::instance();
- if (pCache != nullptr) {
- pCache->requestGuessCover(pTrack);
- }
+ // If the track wasn't in the library already then it has not yet
+ // been checked for cover art.
+ CoverArtCache* pCache = CoverArtCache::instance();
+ if (pCache) {
+ // Process cover art asynchronously
+ pCache->requestGuessCover(pTrack);
}
}
diff --git a/src/library/dao/trackdao.h b/src/library/dao/trackdao.h
index 0e7a2e9968..03814044da 100644
--- a/src/library/dao/trackdao.h
+++ b/src/library/dao/trackdao.h
@@ -52,9 +52,6 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
ResolveTrackIdFlags flags);
QList<TrackId> getAllTrackIds(const QDir& rootDir);
- // WARNING: Only call this from the main thread instance of TrackDAO.
- TrackPointer getTrack(TrackId trackId) const;
-
// Returns a set of all track locations in the library.
QSet<QString> getTrackLocations();
QString getTrackLocation(TrackId trackId);
@@ -82,16 +79,6 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
void afterPurgingTracks(
const QList<TrackId>& trackIds);
- // Fetches trackLocation from the database or adds it. If searchForCoverArt
- // is true, searches the track and its directory for cover art via
- // asynchronous request to CoverArtCache. If adding or fetching the track
- // fails, returns a transient TrackPointer for trackLocation. If
- // pAlreadyInLibrary is non-NULL, sets it to whether trackLocation was
- // already in the database.
- TrackPointer getOrAddTrack(const QString& trackLocation,
- bool processCoverArt,
- bool* pAlreadyInLibrary);
-
void markTracksAsMixxxDeleted(const QString& dir);
// Scanning related calls. Should be elsewhere or private somehow.
@@ -134,7 +121,20 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
void slotTrackClean(Track* pTrack);
private:
- TrackPointer getTrackFromDB(TrackId trackId) const;
+ friend class TrackCollection;
+
+ // WARNING: Only call this from the main thread instance of TrackDAO.
+ TrackPointer getTrackById(TrackId trackId) const;
+
+ // Fetches trackLocation from the database or adds it. If searchForCoverArt
+ // is true, searches the track and its directory for cover art via
+ // asynchronous request to CoverArtCache. If adding or fetching the track
+ // fails, returns a transient TrackPointer for trackLocation. If
+ // pAlreadyInLibrary is non-NULL, sets it to whether trackLocation was
+ // already in the database.
+ TrackPointer getOrAddTrackByLocation(
+ const QString& trackLocation,
+ bool* pAlreadyInLibrary = nullptr);
bool updateTrack(Track* pTrack);
diff --git a/src/library/library.cpp b/src/library/library.cpp
index d152c0f79b..041e797b76 100644
--- a/src/library/library.cpp
+++ b/src/library/library.cpp
@@ -452,8 +452,8 @@ void Library::slotLoadTrack(TrackPointer pTrack) {
}
void Library::slotLoadLocationToPlayer(QString location, QString group) {
- TrackPointer pTrack = m_pTrackCollection->getTrackDAO()
- .getOrAddTrack(location, true, NULL);
+ auto trackRef = TrackRef::fromFileInfo(location);
+ TrackPointer pTrack = m_pTrackCollection->getOrAddTrack(trackRef);
if (pTrack) {
emit(loadTrackToPlayer(pTrack, group));
}
diff --git a/src/library/mixxxlibraryfeature.cpp b/src/library/mixxxlibraryfeature.cpp
index 46a5ab9d7d..0d77aeb21a 100644
--- a/src/library/mixxxlibraryfeature.cpp
+++ b/src/library/mixxxlibraryfeature.cpp
@@ -30,7 +30,6 @@ MixxxLibraryFeature::MixxxLibraryFeature(Library* pLibrary,
m_pLibrary(pLibrary),
m_pMissingView(NULL),
m_pHiddenView(NULL),
- m_trackDao(pTrackCollection->getTrackDAO()),
m_pConfig(pConfig),
m_pTrackCollection(pTrackCollection),
m_icon(":/images/library/ic_library_tracks.svg") {
@@ -91,27 +90,29 @@ MixxxLibraryFeature::MixxxLibraryFeature(Library* pLibrary,
BaseTrackCache* pBaseTrackCache = new BaseTrackCache(
pTrackCollection, tableName, LIBRARYTABLE_ID, columns, true);
- connect(&m_trackDao,
+
+ auto pTrackDAO = &pTrackCollection.getTrackDAO();
+ connect(pTrackDAO,
&TrackDAO::trackDirty,
pBaseTrackCache,
&BaseTrackCache::slotTrackDirty);
- connect(&m_trackDao,
+ connect(pTrackDAO,
&TrackDAO::trackClean,
pBaseTrackCache,
&BaseTrackCache::slotTrackClean);
- connect(&m_trackDao,
+ connect(pTrackDAO,
&TrackDAO::trackChanged,
pBaseTrackCache,
&BaseTrackCache::slotTrackChanged);
- connect(&m_trackDao,
+ connect(pTrackDAO,
&TrackDAO::tracksAdded,
pBaseTrackCache,
&BaseTrackCache::slotTracksAdded);
- connect(&m_trackDao,
+ connect(pTrackDAO,
&TrackDAO::tracksRemoved,
pBaseTrackCache,
&BaseTrackCache::slotTracksRemoved);
- connect(&m_trackDao,
+ connect(pTrackDAO,
&TrackDAO::dbTrackAdded,
pBaseTrackCache,
&BaseTrackCache::slotDbTrackAdded);
diff --git a/src/library/mixxxlibraryfeature.h b/src/library/mixxxlibraryfeature.h
index 28ba9ee620..f449830002 100644
--- a/src/library/mixxxlibraryfeature.h
+++ b/src/library/mixxxlibraryfeature.h
@@ -60,7 +60,6 @@ class MixxxLibraryFeature : public LibraryFeature {
DlgMissing* m_pMissingView;
DlgHidden* m_pHiddenView;
TreeItemModel m_childModel;
- TrackDAO& m_trackDao;
UserSettingsPointer m_pConfig;
TrackCollection* m_pTrackCollection;
QIcon m_icon;
diff --git a/src/library/trackcollection.cpp b/src/library/trackcollection.cpp
index b2eb305647..fdd6bfcf66 100644
--- a/src/library/trackcollection.cpp
+++ b/src/library/trackcollection.cpp
@@ -443,3 +443,26 @@ void TrackCollection::saveTrack(Track* pTrack) {
m_trackDao.saveTrack(pTrack);
}
+
+TrackPointer TrackCollection::getTrackById(
+ const TrackId& trackId) const {
+ return m_trackDao.getTrackById(trackId);
+}
+
+TrackPointer TrackCollection::getOrAddTrack(
+ const TrackRef& trackRef,
+ bool* pAlreadyInLibrary) {
+ TrackPointer pTrack;
+ if (trackRef.hasId()) {
+ pTrack = getTrackById(trackRef.getId());
+ if (pAlreadyInLibrary) {
+ *pAlreadyInLibrary = pTrack != nullptr;
+ }
+ }
+ if (!pTrack && trackRef.hasLocation()) {
+ pTrack = m_trackDao.getOrAddTrackByLocation(
+ trackRef.getLocation(),
+ pAlreadyInLibrary);
+ }
+ return pTrack;
+}
diff --git a/src/library/trackcollection.h b/src/library/trackcollection.h
index 7e36f79bc0..b4b48c9317 100644
--- a/src/library/trackcollection.h
+++ b/src/library/trackcollection.h
@@ -84,6 +84,12 @@ class TrackCollection : public QObject,
bool updateAutoDjCrate(CrateId crateId, bool isAutoDjSource);
+ TrackPointer getTrackById(
+ const TrackId& trackId) const;
+ TrackPointer getOrAddTrack(
+ const TrackRef& trackRef,
+ bool* pAlreadyInLibrary = nullptr);
+
// Might be called from any thread
void exportTrackMetadata(Track* pTrack) const;
diff --git a/src/test/autodjprocessor_test.cpp b/src/test/autodjprocessor_test.cpp
index 60c25e2a9f..75b814ebfb 100644
--- a/src/test/autodjprocessor_test.cpp
+++ b/src/test/autodjprocessor_test.cpp
@@ -606,7 +606,7 @@ TEST_F(AutoDJProcessorTest, EnabledSuccess_DecksStopped) {
// Load the track and mark it playing (as the loadTrackToPlayer signal would
// have connected to this eventually).
- TrackPointer pTrack = collection()->getTrackDAO().getTrack(testId);
+ TrackPointer pTrack = collection()->getTrackById(testId);
deck1.slotLoadTrack(pTrack, true);
// Signal that the request to load pTrack succeeded.