// This is called from the AnalyserQueue thread bool AnalyserQueue::isLoadedTrackWaiting(TrackPointer analysingTrack) { const PlayerInfo& info = PlayerInfo::instance(); TrackPointer pTrack; bool trackWaiting = false; QList<TrackPointer> progress100List; QList<TrackPointer> progress0List; m_qm.lock(); QMutableListIterator<TrackPointer> it(m_tioq); while (it.hasNext()) { TrackPointer& pTrack = it.next(); if (!pTrack) { it.remove(); continue; } if (!trackWaiting) { trackWaiting = info.isTrackLoaded(pTrack); } // try to load waveforms for all new tracks first // and remove them from queue if already analysed // This avoids waiting for a running analysis for those tracks. int progress = pTrack->getAnalyserProgress(); if (progress < 0) { // Load stored analysis QListIterator<Analyser*> ita(m_aq); bool processTrack = false; while (ita.hasNext()) { if (!ita.next()->loadStored(pTrack)) { processTrack = true; } } if (!processTrack) { progress100List.append(pTrack); it.remove(); // since pTrack is a reference it is invalid now. } else { progress0List.append(pTrack); } } else if (progress == 1000) { it.remove(); } } m_qm.unlock(); // update progress after unlock to avoid a deadlock foreach (TrackPointer pTrack, progress100List) { emitUpdateProgress(pTrack, 1000); }
// This is called from the AnalyserQueue thread bool AnalyserQueue::isLoadedTrackWaiting(TrackPointer tio) { QMutexLocker queueLocker(&m_qm); const PlayerInfo& info = PlayerInfo::instance(); TrackPointer pTrack; bool trackWaiting = false; QMutableListIterator<TrackPointer> it(m_tioq); while (it.hasNext()) { TrackPointer& pTrack = it.next(); if (!pTrack) { it.remove(); continue; } if (!trackWaiting) { trackWaiting = info.isTrackLoaded(pTrack); } // try to load waveforms for all new tracks first // and remove them from queue if already analysed // This avoids waiting for a running analysis for those tracks. int progress = pTrack->getAnalyserProgress(); if (progress < 0) { // Load stored analysis QListIterator<Analyser*> ita(m_aq); bool processTrack = false; while (ita.hasNext()) { if (!ita.next()->loadStored(pTrack)) { processTrack = true; } } if (!processTrack) { emitUpdateProgress(pTrack, 1000); it.remove(); } else { emitUpdateProgress(pTrack, 0); } } else if (progress == 1000) { it.remove(); } } if (info.isTrackLoaded(tio)) { return false; } return trackWaiting; }