9 #ifndef __CU_AUDIO_SYNCHRONIZER_H__
10 #define __CU_AUDIO_SYNCHRONIZER_H__
11 #include <cugl/audio/graph/CUAudioNode.h>
12 #include <cugl/util/CUTimestamp.h>
32 std::shared_ptr<AudioNode> _input;
38 std::atomic<double> _overhead;
41 std::atomic<double> _jitter;
44 std::atomic<double> _inputBPM;
45 std::atomic<Sint32> _prevbeat;
49 std::atomic<timestamp_t> _timestamp;
52 std::atomic<Sint32> _liveStart;
54 std::atomic<Sint32> _liveDone;
56 std::atomic<Sint32> _waitStart;
58 std::atomic<Sint32> _waitDone;
66 #pragma mark Constructors
93 virtual bool init()
override;
107 virtual bool init(Uint8 channels, Uint32 rate)
override;
115 virtual void dispose()
override;
118 #pragma mark Static Constructors
128 static std::shared_ptr<AudioSynchronizer>
alloc() {
129 std::shared_ptr<AudioSynchronizer> result = std::make_shared<AudioSynchronizer>();
130 return (result->init() ? result :
nullptr);
145 static std::shared_ptr<AudioSynchronizer>
alloc(Uint8 channels, Uint32 rate) {
146 std::shared_ptr<AudioSynchronizer> result = std::make_shared<AudioSynchronizer>();
147 return (result->init(channels,rate) ? result :
nullptr);
151 #pragma mark Synchronization Methods
158 return _overhead.load(std::memory_order_relaxed);
174 return _jitter.load(std::memory_order_relaxed);
190 #pragma mark Audio Graph
210 bool attach(
const std::shared_ptr<AudioNode>& node,
double bpm=0.0);
219 std::shared_ptr<AudioNode>
detach();
226 std::shared_ptr<AudioNode>
getInput()
const {
return _input; }
229 #pragma mark Playback Control
260 virtual Uint32
read(
float* buffer, Uint32 frames)
override;
263 #pragma mark Optional Methods
281 virtual bool mark()
override;
297 virtual bool unmark()
override;
314 virtual bool reset()
override;
331 virtual Sint64
advance(Uint32 frames)
override;
365 virtual Sint64
setPosition(Uint32 position)
override;
399 virtual double setElapsed(
double time)
override;