void ClipManager::stopThumbs(const QString &id)
{
- if (m_requestedThumbs.isEmpty() || m_closing) return;
+ if (m_closing || (m_requestedThumbs.isEmpty() && m_processingThumbId != id && m_audioThumbsQueue.isEmpty() && m_processingAudioThumbId != id)) return;
+ // Abort video thumbs for this clip
m_abortThumb = true;
m_thumbsThread.waitForFinished();
m_thumbsMutex.lock();
m_requestedThumbs.remove(id);
+ m_audioThumbsQueue.removeAll(id);
m_thumbsMutex.unlock();
m_abortThumb = false;
+
+ // Abort audio thumbs for this clip
+ if (m_processingAudioThumbId == id) {
+ m_abortAudioThumb = true;
+ m_audioThumbsThread.waitForFinished();
+ m_abortAudioThumb = false;
+ }
+
if (!m_thumbsThread.isRunning() && !m_requestedThumbs.isEmpty()) {
m_thumbsThread = QtConcurrent::run(this, &ClipManager::slotGetThumbs);
}
+
+ if (!m_audioThumbsThread.isRunning() && !m_audioThumbsQueue.isEmpty()) {
+ m_audioThumbsThread = QtConcurrent::run(this, &ClipManager::slotGetAudioThumbs);
+ }
}
void ClipManager::slotGetThumbs()
while (!m_requestedThumbs.isEmpty() && !m_abortThumb) {
m_thumbsMutex.lock();
i = m_requestedThumbs.constBegin();
- QString producerId = i.key();
- QList<int> values = m_requestedThumbs.values(producerId);
- m_requestedThumbs.remove(producerId);
+ m_processingThumbId = i.key();
+ QList<int> values = m_requestedThumbs.values(m_processingThumbId);
+ m_requestedThumbs.remove(m_processingThumbId);
m_thumbsMutex.unlock();
qSort(values);
- DocClipBase *clip = getClipById(producerId);
+ DocClipBase *clip = getClipById(m_processingThumbId);
if (!clip) continue;
max = m_requestedThumbs.size() + values.count();
while (!values.isEmpty() && clip->thumbProducer() && !m_abortThumb) {
if (max > 3) emit displayMessage(i18n("Loading thumbnails"), 100 * done / max);
}
}
+ m_processingThumbId.clear();
emit displayMessage(QString(), -1);
}
m_thumbsMutex.lock();
for (int i = 0; i < m_clipList.count(); i++) {
DocClipBase *clip = m_clipList.at(i);
- if (clip->clipType() & (AUDIO | AV | PLAYLIST) && !clip->audioThumbCreated())
+ if (clip->hasAudioThumb() && !clip->audioThumbCreated())
m_audioThumbsQueue.append(m_clipList.at(i)->getId());
}
m_thumbsMutex.unlock();
- if (!m_audioThumbsThread.isRunning()) m_audioThumbsThread = QtConcurrent::run(this, &ClipManager::slotGetAudioThumbs);
+ if (!m_audioThumbsThread.isRunning() && !m_audioThumbsQueue.isEmpty()) {
+ m_audioThumbsThread = QtConcurrent::run(this, &ClipManager::slotGetAudioThumbs);
+ }
}
void ClipManager::askForAudioThumb(const QString &id)
{
DocClipBase *clip = getClipById(id);
- if (clip && KdenliveSettings::audiothumbnails() && (clip->clipType() & (AUDIO | AV | PLAYLIST))) {
+ if (clip && KdenliveSettings::audiothumbnails() && (clip->hasAudioThumb())) {
m_thumbsMutex.lock();
if (!m_audioThumbsQueue.contains(id)) m_audioThumbsQueue.append(id);
m_thumbsMutex.unlock();
mlt_audio_format audioFormat = mlt_audio_pcm;
while (!m_abortAudioThumb && !m_audioThumbsQueue.isEmpty()) {
m_thumbsMutex.lock();
- QString clipId = m_audioThumbsQueue.takeFirst();
+ m_processingAudioThumbId = m_audioThumbsQueue.takeFirst();
m_thumbsMutex.unlock();
- DocClipBase *clip = getClipById(clipId);
+ DocClipBase *clip = getClipById(m_processingAudioThumbId);
if (!clip || clip->audioThumbCreated()) continue;
KUrl url = clip->fileURL();
QString hash = clip->getClipHash();
clip->updateAudioThumbnail(storeIn);
}
}
+ m_processingAudioThumbId.clear();
}
void ClipManager::setThumbsProgress(const QString &message, int progress)