Skip to content

Commit f1a90a0

Browse files
authored
Merge pull request mixxxdj#13719 from daschuer/gh11128_2
Fix scrolling issue with coverart columns visible
2 parents f66f706 + adde64c commit f1a90a0

File tree

11 files changed

+390
-290
lines changed

11 files changed

+390
-290
lines changed

src/library/dao/trackdao.cpp

Lines changed: 163 additions & 138 deletions
Large diffs are not rendered by default.

src/library/dao/trackdao.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
5454
const QList<mixxx::FileInfo>& fileInfos,
5555
ResolveTrackIdFlags flags = ResolveTrackIdFlag::ResolveOnly);
5656

57-
TrackId getTrackIdByRef(
58-
const TrackRef& trackRef) const;
5957
QList<TrackRef> getAllTrackRefs(
6058
const QDir& rootDir) const;
6159

@@ -154,16 +152,9 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
154152
TrackId addTracksAddTrack(
155153
const TrackPointer& pTrack,
156154
bool unremove);
157-
TrackPointer addTracksAddFile(
158-
const mixxx::FileAccess& fileAccess,
159-
bool unremove);
160155
TrackPointer addTracksAddFile(
161156
const QString& filePath,
162-
bool unremove) {
163-
return addTracksAddFile(
164-
mixxx::FileAccess(mixxx::FileInfo(filePath)),
165-
unremove);
166-
}
157+
bool unremove);
167158
void addTracksFinish(bool rollback = false);
168159

169160
bool updateTrack(const Track& track) const;

src/library/scanner/libraryscanner.cpp

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -567,36 +567,30 @@ void LibraryScanner::slotTrackExists(const QString& trackPath) {
567567
}
568568

569569
void LibraryScanner::slotAddNewTrack(const QString& trackPath) {
570-
//kLogger.debug() << "slotAddNewTrack" << trackPath;
570+
// kLogger.debug() << "slotAddNewTrack" << trackPath;
571571
ScopedTimer timer(u"LibraryScanner::addNewTrack");
572572
// For statistics tracking and to detect moved tracks
573573
TrackPointer pTrack = m_trackDao.addTracksAddFile(
574574
trackPath,
575575
false);
576-
if (pTrack) {
577-
DEBUG_ASSERT(!pTrack->isDirty());
578-
// The track's actual location might differ from the
579-
// given trackPath
580-
const QString trackLocation(pTrack->getLocation());
581-
// Acknowledge successful track addition
582-
if (m_scannerGlobal) {
583-
m_scannerGlobal->trackAdded(trackLocation);
584-
}
585-
// Signal the main instance of TrackDAO, that there is
586-
// a new track in the database.
587-
emit trackAdded(pTrack);
588-
emit progressLoading(trackLocation);
589-
} else {
590-
// Acknowledge failed track addition
591-
// TODO(XXX): Is it really intended to acknowledge a failed
592-
// track addition with a trackAdded() signal??
593-
if (m_scannerGlobal) {
594-
m_scannerGlobal->trackAdded(trackPath);
595-
}
596-
kLogger.warning()
597-
<< "Failed to add track to library:"
598-
<< trackPath;
576+
if (!pTrack) {
577+
// This happens only when there is an issue with the database which
578+
// has been logged already. No need for yet another warning here.
579+
return;
580+
}
581+
582+
DEBUG_ASSERT(!pTrack->isDirty());
583+
// The track's actual location might differ from the
584+
// given trackPath
585+
const QString trackLocation = pTrack->getLocation();
586+
// Acknowledge successful track addition
587+
if (m_scannerGlobal) {
588+
m_scannerGlobal->trackAdded(trackLocation);
599589
}
590+
// Signal the main instance of TrackDAO, that there is
591+
// a new track in the database.
592+
emit trackAdded(pTrack);
593+
emit progressLoading(trackLocation);
600594
}
601595

602596
bool LibraryScanner::changeScannerState(ScannerState newState) {

src/library/trackcollection.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -573,11 +573,6 @@ TrackPointer TrackCollection::getTrackByRef(
573573
return m_trackDao.getTrackByRef(trackRef);
574574
}
575575

576-
TrackId TrackCollection::getTrackIdByRef(
577-
const TrackRef& trackRef) const {
578-
return m_trackDao.getTrackIdByRef(trackRef);
579-
}
580-
581576
TrackPointer TrackCollection::getOrAddTrack(
582577
const TrackRef& trackRef,
583578
bool* pAlreadyInLibrary) {

src/library/trackcollection.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,6 @@ class TrackCollection : public QObject,
8585

8686
bool updateAutoDjCrate(CrateId crateId, bool isAutoDjSource);
8787

88-
TrackId getTrackIdByRef(
89-
const TrackRef& trackRef) const;
90-
9188
signals:
9289
// Forwarded signals from LibraryScanner
9390
void scanTrackAdded(TrackPointer pTrack);

src/mixer/basetrackplayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ BaseTrackPlayerImpl::~BaseTrackPlayerImpl() {
285285
}
286286

287287
TrackPointer BaseTrackPlayerImpl::loadFakeTrack(bool bPlay, double filebpm) {
288-
TrackPointer pTrack(Track::newTemporary());
288+
TrackPointer pTrack = Track::newTemporary();
289289
pTrack->setAudioProperties(
290290
mixxx::kEngineChannelCount,
291291
mixxx::audio::SampleRate(44100),

src/sources/soundsourceproxy.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ importTrackMetadataAndCoverImageUnavailable() {
544544
//static
545545
std::pair<mixxx::MetadataSource::ImportResult, QDateTime>
546546
SoundSourceProxy::importTrackMetadataAndCoverImageFromFile(
547-
mixxx::FileAccess trackFileAccess,
547+
const mixxx::FileAccess& trackFileAccess,
548548
mixxx::TrackMetadata* pTrackMetadata,
549549
QImage* pCoverImage,
550550
bool resetMissingTagMetadata) {
@@ -553,24 +553,25 @@ SoundSourceProxy::importTrackMetadataAndCoverImageFromFile(
553553
// https://github.com/mixxxdj/mixxx/issues/9944
554554
return importTrackMetadataAndCoverImageUnavailable();
555555
}
556-
TrackPointer pTrack;
557-
// Lock the global track cache while accessing the file to ensure
558-
// that no metadata is written. Since locking individual files
559-
// is not possible the whole cache has to be locked.
560-
GlobalTrackCacheLocker locker;
561-
pTrack = locker.lookupTrackByRef(TrackRef::fromFileInfo(trackFileAccess.info()));
562-
if (pTrack) {
563-
// We can safely unlock the cache if the track object is already cached.
564-
locker.unlockCache();
565-
} else {
566-
// If the track object is not cached we need to keep the cache
567-
// locked and create a temporary track object instead.
568-
pTrack = Track::newTemporary(std::move(trackFileAccess));
556+
557+
// Since the Track object below is only used to read the meta data from
558+
// the file, we use a temporary track that is discarded in an incomplete
559+
// state without being saved to the database or the track file's meta data
560+
// after the meta data import has been completed.
561+
// Lock the track via the global track cache while accessing the file to
562+
// ensure that no metadata is written by another thread.
563+
{ // cacheResolver scope
564+
const bool temporary = true;
565+
auto cacheResolver = GlobalTrackCacheResolver(trackFileAccess, temporary);
566+
TrackPointer pTrack = cacheResolver.getTrack();
567+
// In the unlikely case that the file has disappeart since the check above
568+
// pTrack is null and the next call will log appropriate warnings and
569+
// returns importTrackMetadataAndCoverImageUnavailable();
570+
return SoundSourceProxy(pTrack).importTrackMetadataAndCoverImage(
571+
pTrackMetadata,
572+
pCoverImage,
573+
resetMissingTagMetadata);
569574
}
570-
return SoundSourceProxy(pTrack).importTrackMetadataAndCoverImage(
571-
pTrackMetadata,
572-
pCoverImage,
573-
resetMissingTagMetadata);
574575
}
575576

576577
std::pair<mixxx::MetadataSource::ImportResult, QDateTime>

src/sources/soundsourceproxy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class SoundSourceProxy {
102102
/// while reading.
103103
static std::pair<mixxx::MetadataSource::ImportResult, QDateTime>
104104
importTrackMetadataAndCoverImageFromFile(
105-
mixxx::FileAccess trackFileAccess,
105+
const mixxx::FileAccess& trackFileAccess,
106106
mixxx::TrackMetadata* pTrackMetadata,
107107
QImage* pCoverImage,
108108
bool resetMissingTagMetadata);

src/test/globaltrackcache_test.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,41 +93,43 @@ TEST_F(GlobalTrackCacheTest, resolveByFileInfo) {
9393

9494
const TrackId trackId(QVariant(1));
9595

96-
TrackPointer track;
97-
{
96+
TrackPointer pTrack;
97+
{ // resolver scope
9898
auto testFileAccess = mixxx::FileAccess(mixxx::FileInfo(getTestDir().filePath(kTestFile)));
99-
GlobalTrackCacheResolver resolver(testFileAccess);
100-
track = resolver.getTrack();
101-
EXPECT_TRUE(static_cast<bool>(track));
102-
EXPECT_EQ(2, track.use_count());
99+
auto resolver = GlobalTrackCacheResolver(testFileAccess);
100+
pTrack = resolver.getTrack();
101+
EXPECT_TRUE(static_cast<bool>(pTrack));
102+
// track, GlobalTrackCacheResolver::m_strongPtr and GlobalTrackCache::m_incompleteTrack
103+
EXPECT_EQ(3, pTrack.use_count());
103104

104105
resolver.initTrackIdAndUnlockCache(trackId);
106+
EXPECT_EQ(2, pTrack.use_count());
105107
}
106-
EXPECT_EQ(1, track.use_count());
108+
EXPECT_EQ(1, pTrack.use_count());
107109

108-
TrackWeakPointer trackWeak(track);
110+
TrackWeakPointer trackWeak(pTrack);
109111
EXPECT_EQ(1, trackWeak.use_count());
110112

111-
TrackPointer trackCopy = track;
113+
TrackPointer trackCopy = pTrack;
112114
EXPECT_EQ(2, trackCopy.use_count());
113-
EXPECT_EQ(2, track.use_count());
115+
EXPECT_EQ(2, pTrack.use_count());
114116
EXPECT_EQ(2, trackWeak.use_count());
115117

116118
trackCopy.reset();
117-
EXPECT_EQ(1, track.use_count());
119+
EXPECT_EQ(1, pTrack.use_count());
118120
EXPECT_EQ(1, trackWeak.use_count());
119121

120122
auto trackById = GlobalTrackCacheLocker().lookupTrackById(trackId);
121-
EXPECT_EQ(track, trackById);
123+
EXPECT_EQ(pTrack, trackById);
122124
EXPECT_EQ(2, trackById.use_count());
123-
EXPECT_EQ(2, track.use_count());
125+
EXPECT_EQ(2, pTrack.use_count());
124126
EXPECT_EQ(2, trackWeak.use_count());
125127

126128
trackById.reset();
127129
EXPECT_EQ(1, trackWeak.use_count());
128-
EXPECT_EQ(track, TrackPointer(trackWeak.lock()));
130+
EXPECT_EQ(pTrack, TrackPointer(trackWeak.lock()));
129131

130-
track.reset();
132+
pTrack.reset();
131133
EXPECT_EQ(0, trackWeak.use_count());
132134
EXPECT_EQ(TrackPointer(), TrackPointer(trackWeak.lock()));
133135

@@ -169,7 +171,7 @@ TEST_F(GlobalTrackCacheTest, concurrentDelete) {
169171
TrackPointer track;
170172
{
171173
auto testFileAccess = mixxx::FileAccess(testFile);
172-
GlobalTrackCacheResolver resolver(testFileAccess);
174+
auto resolver = GlobalTrackCacheResolver(testFileAccess);
173175
track = resolver.getTrack();
174176
EXPECT_TRUE(static_cast<bool>(track));
175177
trackId = track->getId();

0 commit comments

Comments
 (0)