=== modified file 'mixxx/src/basetrackplayer.cpp' --- mixxx/src/basetrackplayer.cpp 2010-11-17 21:02:24 +0000 +++ mixxx/src/basetrackplayer.cpp 2011-03-03 03:27:59 +0000 @@ -88,6 +88,7 @@ BaseTrackPlayer::~BaseTrackPlayer() { if (m_pLoadedTrack) { + m_pLoadedTrack->setLoaded(false); emit(unloadingTrack(m_pLoadedTrack)); m_pLoadedTrack.clear(); } @@ -133,6 +134,7 @@ // thing. m_pLoadedTrack->disconnect(); // Causes the track's data to be saved back to the library database. + m_pLoadedTrack->setLoaded(false); emit(unloadingTrack(m_pLoadedTrack)); } @@ -151,6 +153,7 @@ } void BaseTrackPlayer::slotLoadFailed(TrackPointer track, QString reason) { + m_pLoadedTrack->setLoaded(false); qDebug() << "Failed to load track" << track->getLocation() << reason; // Alert user. QMessageBox::warning(NULL, tr("Couldn't load track."), reason); @@ -165,6 +168,7 @@ m_pLoadedTrack->disconnect(); // Causes the track's data to be saved back to the library database and // for all the widgets to unload the track and blank themselves. + m_pLoadedTrack->setLoaded(false); emit(unloadingTrack(m_pLoadedTrack)); } m_pDuration->set(0); === modified file 'mixxx/src/cachingreader.cpp' --- mixxx/src/cachingreader.cpp 2010-10-23 08:41:23 +0000 +++ mixxx/src/cachingreader.cpp 2011-03-03 03:27:59 +0000 @@ -543,6 +543,10 @@ pTrack, QString("The file '%1' could not be found.").arg(filename))); return; } + + //doing this the moment the track is mapped because we don't want any + //races + pTrack->setLoaded(true); m_pCurrentSoundSource = new SoundSourceProxy(pTrack); m_pCurrentSoundSource->open(); //Open the song for reading @@ -551,6 +555,7 @@ m_iTrackNumSamples = m_pCurrentSoundSource->length(); if (m_iTrackNumSamples == 0 || m_iTrackSampleRate == 0) { + pTrack->setLoaded(false); // Must unlock before emitting to avoid deadlock qDebug() << m_pGroup << "CachingReader::loadTrack() load failed for\"" << filename << "\", file invalid, unlocked reader lock"; === modified file 'mixxx/src/library/dao/trackdao.cpp' --- mixxx/src/library/dao/trackdao.cpp 2010-12-02 22:17:33 +0000 +++ mixxx/src/library/dao/trackdao.cpp 2011-03-03 03:27:59 +0000 @@ -896,16 +896,23 @@ void TrackDAO::writeAudioMetaData(TrackInfoObject* pTrack){ if (m_pConfig && m_pConfig->getValueString(ConfigKey("[Library]","WriteAudioTags")).toInt() == 1) { - AudioTagger tagger(pTrack->getLocation()); - - tagger.setArtist(pTrack->getArtist()); - tagger.setTitle(pTrack->getTitle()); - tagger.setGenre(pTrack->getGenre()); - tagger.setAlbum(pTrack->getAlbum()); - tagger.setComment(pTrack->getComment()); - tagger.setTracknumber(pTrack->getTrackNumber()); - tagger.setBpm(pTrack->getBpmStr()); - - tagger.save(); + if (pTrack->isLoaded()) + { + qDebug() << "Track reports it is currently loaded, not saving metadata:" << pTrack->getTitle(); + } + else + { + AudioTagger tagger(pTrack->getLocation()); + + tagger.setArtist(pTrack->getArtist()); + tagger.setTitle(pTrack->getTitle()); + tagger.setGenre(pTrack->getGenre()); + tagger.setAlbum(pTrack->getAlbum()); + tagger.setComment(pTrack->getComment()); + tagger.setTracknumber(pTrack->getTrackNumber()); + tagger.setBpm(pTrack->getBpmStr()); + + tagger.save(); + } } } === modified file 'mixxx/src/trackinfoobject.cpp' --- mixxx/src/trackinfoobject.cpp 2010-11-24 15:20:09 +0000 +++ mixxx/src/trackinfoobject.cpp 2011-03-03 03:27:59 +0000 @@ -109,6 +109,7 @@ void TrackInfoObject::initialize(bool parseHeader) { m_bDirty = false; + m_bIsLoaded = false; m_bLocationChanged = false; m_sArtist = ""; @@ -154,6 +155,18 @@ return m_bIsValid; } +bool TrackInfoObject::isLoaded() const +{ + QMutexLocker lock(&m_qMutex); + return m_bIsLoaded; +} + +void TrackInfoObject::setLoaded(bool val) +{ + QMutexLocker lock(&m_qMutex); + m_bIsLoaded = val; +} + /* Writes information about the track to the xml file: */ === modified file 'mixxx/src/trackinfoobject.h' --- mixxx/src/trackinfoobject.h 2010-11-17 21:02:24 +0000 +++ mixxx/src/trackinfoobject.h 2011-03-03 03:27:59 +0000 @@ -241,6 +241,9 @@ /** Set the track's full file path */ void setLocation(QString location); + + bool isLoaded() const; + void setLoaded(bool val); const Segmentation* getChordData(); void setChordData(Segmentation cd); @@ -366,6 +369,9 @@ /** True if object contains valid information */ bool m_bIsValid; + + /** True if the track is currently in a player */ + bool m_bIsLoaded; double m_dVisualResampleRate; Segmentation m_chordData;