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);
void play(const std::shared_ptr< AudioNode > &node, Sint32 loop=0)
void append(const std::shared_ptr< AudioNode > &node, Sint32 loop=0)
virtual bool reset() override
bool empty() const
Definition: CUAudioScheduler.h:120
void setOverlap(double time)
virtual bool mark() override
virtual bool init() override
Definition: CUAudioScheduler.h:61
bool peek(std::shared_ptr< AudioNode > &node, Sint32 &loop) const
void setLoops(Sint32 loop)
virtual Uint32 read(float *buffer, Uint32 frames) override
Definition: CUAction.h:70
void trim(Sint32 size=-1)
Uint32 getTailSize() const
void push(const std::shared_ptr< AudioNode > &node, Sint32 loops=0)
Definition: CUAudioNode.h:93
void clear(bool force=false)
virtual double setElapsed(double time) override
std::deque< std::shared_ptr< AudioNode > > getTail() const
virtual Sint64 advance(Uint32 frames) override
virtual bool unmark() override
static std::shared_ptr< AudioScheduler > alloc(Uint8 channels, Uint32 rate)
Definition: CUAudioScheduler.h:312
virtual void dispose() override
double getOverlap() const
virtual Sint64 setPosition(Uint32 position) override
bool pop(std::shared_ptr< AudioNode > &node, Sint32 &loop)
Definition: CUAudioScheduler.h:219
virtual Sint64 getPosition() const override
Definition: CUAction.h:51
std::shared_ptr< AudioNode > getCurrent() const
bool fill(std::deque< std::shared_ptr< AudioNode >> &container) const
virtual double getElapsed() const override