1 #ifndef AL_PRESETSEQUENCER_H
2 #define AL_PRESETSEQUENCER_H
47 #include <condition_variable>
56 #include "al/protocol/al_OSC.hpp"
57 #include "al/ui/al_PresetHandler.hpp"
61 class SequenceRecorder;
123 TimeMasterMode timeMasterMode = TimeMasterMode::TIME_MASTER_CPU);
126 typedef enum { PRESET, EVENT, PARAMETER } StepType;
129 StepType type = PRESET;
133 std::vector<ParameterField> params;
137 std::string eventName;
138 std::function<void(
void *data, std::vector<ParameterField> ¶ms)>
153 double timeOffset = 0.0);
155 void stopSequence(
bool triggerCallbacks =
true);
170 bool playbackFinished() {
return mSteps.size() == mCurrentStep; }
200 inline bool running() {
return mRunning; }
222 return registerParameter(param);
225 PresetSequencer ®isterParameter(ParameterMeta ¶m) {
226 mParameters.push_back(¶m);
240 double timeScale = 1.0);
242 std::string currentSequence() {
return mCurrentSequence; }
253 std::string eventName,
254 std::function<
void(
void *data, std::vector<ParameterField> ¶ms)>
258 void setOSCSubPath(std::string subPath) { mOSCsubPath = subPath; }
269 void enableBeginCallback(
bool enable) { mBeginCallbackEnabled = enable; }
271 void toggleEnableBeginCallback() {
272 mBeginCallbackEnabled = !mBeginCallbackEnabled;
283 std::function<
void(
bool finished,
PresetSequencer *sender)> endCallback);
285 void enableEndCallback(
bool enable) { mEndCallbackEnabled = enable; }
286 void toggleEnableEndCallback() { mEndCallbackEnabled = !mEndCallbackEnabled; }
288 void registerTimeChangeCallback(std::function<
void(
float)> func,
289 float minTimeDeltaSec = -1.0);
291 float getSequenceStartOffset(std::string sequenceName);
292 float getSequenceTotalDuration(std::string sequenceName);
306 void setTimeMaster(TimeMasterMode masterMode);
322 void setSequencerStepTime(
double stepTime) { mGranularity = stepTime * 1e9; }
326 std::string rootOSCPath)
override;
328 void processTimeChangeRequest();
329 void updateTime(
double time);
331 void updateSequencer();
336 std::string buildFullPath(std::string sequenceName);
338 void startCpuThread();
339 void stopCpuThread();
341 std::vector<Step> mSteps;
342 std::string mDirectory;
344 std::vector<ParameterMeta *> mParameters;
345 std::string mOSCsubPath;
346 std::string mCurrentSequence;
348 std::atomic<float> mTimeRequest{-1.0f};
351 TimeMasterMode mTimeMasterMode;
353 bool mSequencerActive{
false};
356 std::queue<Step> mParameterList;
357 double mCurrentTime = 0.0;
359 double mLastPresetTime;
360 double mParameterTargetTime;
361 double mLastTimeUpdate = 0.0;
364 uint64_t mGranularity = 10e6;
365 bool mBeginCallbackEnabled;
366 std::function<void(PresetSequencer *)> mBeginCallback;
367 bool mEndCallbackEnabled;
368 std::function<void(
bool, PresetSequencer *)> mEndCallback;
369 std::vector<EventCallback> mEventCallbacks;
370 std::vector<std::function<void(
float)>> mTimeChangeCallbacks;
371 float mTimeChangeMinTimeDelta = 0.05f;
377 std::unique_ptr<std::thread> mSequencerThread;
378 std::mutex mSequenceLock;
379 uint64_t mCurrentStep;
380 PresetHandler::ParameterStates mStartValues;
381 std::mutex mPlayWaitLock;
382 std::condition_variable mPlayWaitVariable;
385 std::shared_ptr<std::promise<void>> mPlayPromiseObj;
The PresetHandler class handles sorting and recalling of presets.
The PresetSequencer class allows triggering presets from a PresetHandler over time.
PresetSequencer & operator<<(PresetHandler &presetHandler)
Register PresetHandler through the << operator.
void appendStep(Step &newStep)
appendStep
void setDirectory(std::string directory)
setDirectory sets the working directory for the PresetSequencer
std::vector< std::string > getSequenceList()
getSequenceList returns a list of sequences in the current sequence directory
void stepSequencer(double dt)
step sequencer forward dt amount of time
void registerEventCommand(std::string eventName, std::function< void(void *data, std::vector< ParameterField > ¶ms)> callback, void *data)
registerEventCommand registers a function associated with an event command
void registerBeginCallback(std::function< void(PresetSequencer *sender)> beginCallback)
registerBeginCallback
void registerEndCallback(std::function< void(bool finished, PresetSequencer *sender)> endCallback)
registerEndCallback
virtual bool consumeMessage(osc::Message &m, std::string rootOSCPath) override
Returns true if message was consumed by this class.
std::vector< Step > loadSequence(std::string sequenceName, double timeScale=1.0)
Load steps from a sequence file.
void setHandlerSubDirectory(std::string subDir)
Sets the sub-directory for the registered PresetHandler.
void stepSequencer()
move sequencer forward by time set using setSequencerStepTime()
PresetSequencer & registerPresetHandler(PresetHandler &presetHandler)
Register preset handler with sequencer.
void setTime(double time)
Set time into the current sequence.
void rewind()
Load sequence an prepare for playback.
void playSequence(std::string sequenceName, double timeScale=1.0f, double timeOffset=0.0)
Start playing the sequence specified.