33 #ifndef __CU_AUDIO_SEQUENCER_H__
34 #define __CU_AUDIO_SEQUENCER_H__
36 #include "CUAudioNode.h"
37 #include "CUAudioPlayer.h"
45 #pragma mark Audio Node Queue
70 std::shared_ptr<AudioNode> value;
87 Entry(
const std::shared_ptr<AudioNode>& node, Sint32 loop) :
88 value(node), loops(loop), next(
nullptr) { }
94 std::atomic<Entry*> _divide;
96 std::atomic<Entry*> _last;
100 #pragma mark Constructors
112 #pragma mark Queue Methods
120 bool empty()
const {
return _divide == _last; }
135 void push(
const std::shared_ptr<AudioNode>& node, Sint32 loops=0);
151 bool peek(std::shared_ptr<AudioNode>& node, Sint32& loop)
const;
167 bool pop(std::shared_ptr<AudioNode>& node, Sint32& loop);
182 bool fill(std::deque<std::shared_ptr<AudioNode>>& container)
const;
194 #pragma mark Sequencer Node
222 std::shared_ptr<AudioNode> _current;
224 std::shared_ptr<AudioNode> _previous;
226 std::atomic<Sint32> _loops;
228 std::atomic<Uint32> _overlap;
236 std::atomic<Uint32> _qsize;
238 std::atomic<Uint32> _qskip;
241 std::deque<std::shared_ptr<AudioNode>> _memory;
246 #pragma mark Constructors
272 virtual bool init()
override;
286 virtual bool init(Uint8 channels, Uint32 rate)
override;
294 virtual void dispose()
override;
312 static std::shared_ptr<AudioScheduler>
alloc(Uint8 channels, Uint32 rate) {
313 std::shared_ptr<AudioScheduler> result = std::make_shared<AudioScheduler>();
314 return (result->init(channels, rate) ? result :
nullptr);
317 #pragma mark Queue Management
341 void play(
const std::shared_ptr<AudioNode>& node, Sint32 loop = 0);
367 void append(
const std::shared_ptr<AudioNode>& node, Sint32 loop = 0);
377 std::shared_ptr<AudioNode>
getCurrent()
const;
387 std::deque<std::shared_ptr<AudioNode>>
getTail()
const;
413 void clear(
bool force=
false);
421 void trim(Sint32 size = -1);
436 void skip(Uint32 n=0);
488 #pragma mark Playback Sequencing
524 #pragma mark Overriden Methods
543 virtual Uint32
read(
float* buffer, Uint32 frames)
override;
565 virtual bool mark()
override;
578 virtual bool unmark()
override;
593 virtual bool reset()
override;
620 virtual Sint64
advance(Uint32 frames)
override;
665 virtual Sint64
setPosition(Uint32 position)
override;
713 virtual double setElapsed(
double time)
override;
715 #pragma mark Scheduling Helpers
735 std::shared_ptr<AudioNode> acquire(Sint32& loop, Uint32
skip=0,
Action action=Action::COMPLETE);