11namespace tracktion {
inline namespace engine
14RenderManager::Job::Job (
Engine& e,
const AudioFile& proxyToUse)
15 : ThreadPoolJobWithProgress (
"Render Job"),
16 engine (e), proxy (proxyToUse)
22 engine.getRenderManager().addJobInternal (
this);
26 postMessage (
new UpdateMessage (UpdateMessage::started));
29RenderManager::Job::~Job()
31 prepareForJobDeletion();
35 jassert (getReferenceCount() == 0);
44 if (! (isInitialised || shouldExit()))
50 return jobNeedsRunningAgain;
54 if (! (shouldExit() || renderNextBlock()))
55 return jobNeedsRunningAgain;
58 const bool completedOk = completeRender();
60 if (! proxy.isNull() && completedOk)
63 engine.getAudioFileManager().validateFile (proxy,
true);
64 jassert (isMidiFile (proxy.getFile()) || proxy.isValid());
71 sendCompletionMessages (completedOk && (! shouldExit()));
73 return jobHasFinished;
76void RenderManager::Job::cancelJob()
81 signalJobShouldExit();
84 sendCompletionMessages (
false);
87bool RenderManager::Job::decReferenceCountWithoutDeleting() noexcept
89 if (--refCount == 1 && selfReference !=
nullptr)
93 if (refCount.get() == 0)
94 engine.getRenderManager().deleteJob (
this);
100void RenderManager::Job::sendCompletionMessages (
bool success)
105 engine.getRenderManager().removeJobInternal (
this);
110 postMessage (
new UpdateMessage (UpdateMessage::succeded));
115 postMessage (
new UpdateMessage (UpdateMessage::cancelled));
119void RenderManager::Job::handleMessage (
const juce::Message& message)
123 const UpdateMessage::Type type = UpdateMessage::getType (message);
127 case UpdateMessage::started:
129 engine.getRenderManager().addJobToPool (
this);
130 listeners.call (&Listener::jobStarted, *
this);
133 case UpdateMessage::succeded:
134 case UpdateMessage::cancelled:
138 messagesToResend.addIfNotAlreadyThere (type);
139 startTimer (messageRetryTimeout);
143 listeners.call (&Listener::jobFinished, *
this, type == UpdateMessage::succeded);
145 selfReference =
nullptr;
149 case UpdateMessage::unknown:
155void RenderManager::Job::timerCallback()
159 for (
int i = messagesToResend.size(); --i >= 0;)
160 postMessage (
new UpdateMessage (messagesToResend.removeAndReturn (i)));
164RenderManager::RenderManager (
Engine& e) : engine (e)
168RenderManager::~RenderManager()
170 jassert (danglingJobs.isEmpty());
172 jassert (jobsToDelete.isEmpty());
180 for (
int i = jobs.size(); --i >= 0;)
181 pool.removeJob (jobs.getUnchecked (i),
true, 10000);
183 for (
int i = danglingJobs.size(); --i >= 0;)
184 if (
auto j = danglingJobs.getUnchecked (i))
185 j->cleanUpDanglingJob();
187 jassert (danglingJobs.isEmpty());
190 jobsToDelete.clear();
206 if (j !=
nullptr && j->proxy == af)
221 return findJob (proxyFile) !=
nullptr;
226 if (
auto j = findJob (proxyFile))
238 if (j != nullptr && j->proxy == af)
244void RenderManager::addJobInternal (Job* j)
noexcept
247 jobs.addIfNotAlreadyThere (j);
250void RenderManager::removeJobInternal (Job* j)
noexcept
254 jobs.removeAllInstancesOf (j);
259 danglingJobs.addIfNotAlreadyThere (j);
263void RenderManager::addJobToPool (Job* j)
noexcept
268void RenderManager::deleteJob (Job* j)
272 danglingJobs.removeAllInstancesOf (j);
273 jobsToDelete.add (j);
277 if (juce::MessageManager::getInstance()->isThisTheMessageThread())
281void RenderManager::handleAsyncUpdate()
284 jobsToDelete.clear();
void handleUpdateNowIfNeeded()
void triggerAsyncUpdate()
File getChildFile(StringRef relativeOrAbsolutePath) const
static void JUCE_CALLTYPE disableDenormalisedNumberSupport(bool shouldDisable=true) noexcept
ObjectClass * add(ObjectClass *newObject)
The Engine is the central class for all tracktion sessions.
BackgroundJobManager & getBackgroundJobs() const
Returns the BackgroundJobManager instance.
void cleanUp()
Cleans up any remaining jobs - should be called before the manager is deleted.
static juce::StringRef getFileRenderPrefix()
Returns the prefix used for render files.
static AudioFile getAudioFileForHash(Engine &, const juce::File &directory, HashCode hash)
Returns the AudioFile for a particular hash.
juce::ReferenceCountedArray< Job > getRenderJobsWithoutCreating(const AudioFile &)
Returns all the jobs that may be processing the given file.
int getNumJobs() noexcept
Returns the number of jobs in the pool.
bool isProxyBeingGenerated(const AudioFile &proxyFile) noexcept
Returns true if a render is currently being performed for this AudioFile.
float getProportionComplete(const AudioFile &proxyFile, float defaultVal) noexcept
Returns true if a render is currently being performed for this AudioFile.
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.