#include "conformmanager.h" #include #include "task/taskmanager.h" namespace olive { ConformManager *ConformManager::instance_ = nullptr; ConformManager::Conform ConformManager::GetConformState(const QString &decoder_id, const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms, bool wait) { // Mutex because we'll need to check the status of a conform task QMutexLocker locker(&mutex_); // Return existing conform if exists QVector filenames = GetConformedFilename(cache_path, stream, params); if (AllConformsExist(filenames)) { return {kConformExists, filenames, nullptr}; } ConformTask *conforming_task = nullptr; foreach (const ConformData &data, conforming_) { if (data.stream == stream && data.params == params) { // Already creating conform in a task conforming_task = data.task; break; } } if (!conforming_task) { // Not conforming yet, create a task to do so // We conform to a different filename until it's done to make it clear even across sessions // whether this conform is ready or not QVector working_filenames = filenames; for (int i=0; imoveToThread(TaskManager::instance()->thread()); QMetaObject::invokeMethod(TaskManager::instance(), "AddTask", Qt::QueuedConnection, Q_ARG(Task *, conforming_task)); conforming_.append({stream, params, conforming_task, working_filenames, filenames}); } if (wait) { do { conform_done_condition_.wait(&mutex_); } while (!AllConformsExist(filenames)); return {kConformExists, filenames, nullptr}; } return {kConformGenerating, QVector(), conforming_task}; } QVector ConformManager::GetConformedFilename(const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms) { QVector filenames(params.channel_count()); for (int i=0; i &filenames) { foreach (const QString &fn, filenames) { if (!QFileInfo::exists(fn)) { return false; } } return true; } void ConformManager::ConformTaskFinished(Task *task, bool succeeded) { QMutexLocker locker(&mutex_); ConformData data; // Remove conform data from list for (int i=0; i