mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-26 09:28:07 +02:00
179 lines
5.4 KiB
C++
179 lines
5.4 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
ODTask.h
|
|
|
|
Created by Michael Chinen (mchinen)
|
|
Audacity(R) is copyright (c) 1999-2008 Audacity Team.
|
|
License: GPL v2. See License.txt.
|
|
|
|
******************************************************************//**
|
|
|
|
\class ODTask
|
|
\brief ODTask is an abstract class that outlines the methods that will be used to
|
|
support On-Demand background loading of files. These ODTasks are generally meant to be run
|
|
in a background thread.
|
|
|
|
*//*******************************************************************/
|
|
|
|
|
|
|
|
|
|
#ifndef __AUDACITY_ODTASK__
|
|
#define __AUDACITY_ODTASK__
|
|
|
|
#include "ODTaskThread.h"
|
|
#include "../BlockFile.h"
|
|
#include "../Project.h"
|
|
|
|
#include <vector>
|
|
#include <wx/wx.h>
|
|
class WaveTrack;
|
|
|
|
|
|
DECLARE_EXPORTED_EVENT_TYPE(AUDACITY_DLL_API, EVT_ODTASK_COMPLETE, -1)
|
|
|
|
/// A class representing a modular task to be used with the On-Demand structures.
|
|
class ODTask
|
|
{
|
|
public:
|
|
enum {
|
|
eODNone = 0x00000000,
|
|
eODFLAC = 0x00000001,
|
|
eODMP3 = 0x00000002,
|
|
eODFFMPEG = 0x00000004,
|
|
eODPCMSummary = 0x00001000,
|
|
eODOTHER = 0x10000000,
|
|
} ODTypeEnum;
|
|
// Constructor / Destructor
|
|
|
|
/// Constructs an ODTask
|
|
ODTask();
|
|
|
|
virtual ~ODTask(){};
|
|
|
|
//clones everything except information about the tracks.
|
|
virtual ODTask* Clone()=0;
|
|
|
|
///Subclasses should override to return respective type.
|
|
virtual unsigned int GetODType(){return eODNone;}
|
|
|
|
|
|
///Do a modular part of the task. For example, if the task is to load the entire file, load one BlockFile.
|
|
///Relies on DoSomeInternal(), which is the subclasses must implement.
|
|
///@param amountWork the percent amount of the total job to do. 1.0 represents the entire job. the default of 0.0
|
|
/// will do the smallest unit of work possible
|
|
void DoSome(float amountWork=0.0);
|
|
|
|
///Call DoSome until PercentComplete >= 1.0
|
|
void DoAll();
|
|
|
|
virtual float PercentComplete();
|
|
|
|
virtual bool UsesCustomWorkUntilPercentage(){return false;}
|
|
virtual float ComputeNextWorkUntilPercentageComplete(){return 1.0;}
|
|
|
|
///returns whether or not this task and another task can merge together, as when we make two mono tracks stereo.
|
|
///for Loading/Summarizing, this is not an issue because the entire track is processed
|
|
///Effects that affect portions of a track will need to check this.
|
|
virtual bool CanMergeWith(ODTask* otherTask){return strcmp(GetTaskName(),otherTask->GetTaskName())==0;}
|
|
|
|
virtual void StopUsingWaveTrack(WaveTrack* track);
|
|
|
|
///Replaces all instances to a wavetrack with a new one, effectively transferring the task.
|
|
///ODTask has no wavetrack, so it does nothing. But subclasses that do should override this.
|
|
virtual void ReplaceWaveTrack(WaveTrack* oldTrack,WaveTrack* newTrack);
|
|
|
|
///Adds a WaveTrack to do the task for
|
|
void AddWaveTrack(WaveTrack* track);
|
|
virtual int GetNumWaveTracks();
|
|
virtual WaveTrack* GetWaveTrack(int i);
|
|
|
|
///changes the tasks associated with this Waveform to process the task from a different point in the track
|
|
virtual void DemandTrackUpdate(WaveTrack* track, double seconds);
|
|
|
|
bool IsComplete();
|
|
|
|
void TerminateAndBlock();
|
|
///releases memory that the ODTask owns. Subclasses should override.
|
|
virtual void Terminate(){}
|
|
|
|
virtual const char* GetTaskName(){return "ODTask";}
|
|
|
|
virtual sampleCount GetDemandSample();
|
|
|
|
virtual void SetDemandSample(sampleCount sample);
|
|
|
|
///does an od update and then recalculates the data.
|
|
virtual void RecalculatePercentComplete();
|
|
|
|
///returns the number of tasks created before this instance.
|
|
int GetTaskNumber(){return mTaskNumber;}
|
|
|
|
void SetNeedsODUpdate();
|
|
bool GetNeedsODUpdate();
|
|
void ResetNeedsODUpdate();
|
|
|
|
virtual const wxChar* GetTip()=0;
|
|
|
|
///returns true if the task is associated with the project.
|
|
virtual bool IsTaskAssociatedWithProject(AudacityProject* proj);
|
|
|
|
bool IsRunning();
|
|
|
|
|
|
protected:
|
|
|
|
///calculates the percentage complete from existing data.
|
|
virtual void CalculatePercentComplete() = 0;
|
|
|
|
///pure virtual function that does some part of the task this object represents.
|
|
///this function is meant to be called repeatedly until the IsComplete is true.
|
|
///Does the smallest unit of work for this task.
|
|
virtual void DoSomeInternal() = 0;
|
|
|
|
///virtual method called before DoSomeInternal is used from DoSome.
|
|
virtual void Update(){}
|
|
|
|
///virtual method called in DoSome everytime the user has demanded some OD function so that the
|
|
///ODTask can readjust its computation order. By default just calls Update(), but subclasses with
|
|
///special needs can override this
|
|
virtual void ODUpdate();
|
|
|
|
void SetIsRunning(bool value);
|
|
|
|
|
|
|
|
int mTaskNumber;
|
|
volatile float mPercentComplete;
|
|
ODLock mPercentCompleteMutex;
|
|
volatile bool mDoingTask;
|
|
volatile bool mTaskStarted;
|
|
volatile bool mTerminate;
|
|
ODLock mTerminateMutex;
|
|
//for a function not a member var.
|
|
ODLock mBlockUntilTerminateMutex;
|
|
|
|
std::vector<WaveTrack*> mWaveTracks;
|
|
ODLock mWaveTrackMutex;
|
|
|
|
volatile sampleCount mDemandSample;
|
|
ODLock mDemandSampleMutex;
|
|
|
|
volatile bool mIsRunning;
|
|
ODLock mIsRunningMutex;
|
|
|
|
|
|
private:
|
|
|
|
volatile bool mNeedsODUpdate;
|
|
ODLock mNeedsODUpdateMutex;
|
|
|
|
|
|
|
|
};
|
|
|
|
#endif
|
|
|