CUGL 1.3
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CUAudioSynchronizer.h
1 //
2 // CUAudioSynchronizer.h
3 // CUGL
4 //
5 // Created by Walker White on 1/27/19.
6 // Copyright © 2019 Game Design Initiative at Cornell. All rights reserved.
7 //
8 
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>
13 #include <atomic>
14 #include <mutex>
15 
16 namespace cugl {
17  namespace audio {
29 class AudioSynchronizer : public AudioNode {
30 private:
32  std::shared_ptr<AudioNode> _input;
33 
35  std::mutex _mutex;
36 
38  std::atomic<double> _overhead;
39 
41  std::atomic<double> _jitter;
42 
44  std::atomic<double> _inputBPM;
45  std::atomic<Sint32> _prevbeat;
46 
47 
49  std::atomic<timestamp_t> _timestamp;
50 
52  std::atomic<Sint32> _liveStart;
54  std::atomic<Sint32> _liveDone;
56  std::atomic<Sint32> _waitStart;
58  std::atomic<Sint32> _waitDone;
59 
61  float* _buffer;
63  Uint32 _capacity;
64 
65 #pragma mark -
66 #pragma mark Constructors
67 public:
78 
83 
93  virtual bool init() override;
94 
107  virtual bool init(Uint8 channels, Uint32 rate) override;
108 
115  virtual void dispose() override;
116 
117 #pragma mark -
118 #pragma mark Static Constructors
119 
128  static std::shared_ptr<AudioSynchronizer> alloc() {
129  std::shared_ptr<AudioSynchronizer> result = std::make_shared<AudioSynchronizer>();
130  return (result->init() ? result : nullptr);
131  }
132 
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);
148  }
149 
150 #pragma mark -
151 #pragma mark Synchronization Methods
152 
157  double getOverhead() const {
158  return _overhead.load(std::memory_order_relaxed);
159  }
160 
166  void setOverhead(double overhead);
167 
173  double getJitter() const {
174  return _jitter.load(std::memory_order_relaxed);
175  }
176 
180  void clearJitter();
181 
187  bool onBeat();
188 
189 #pragma mark -
190 #pragma mark Audio Graph
191 
210  bool attach(const std::shared_ptr<AudioNode>& node, double bpm=0.0);
211 
219  std::shared_ptr<AudioNode> detach();
220 
226  std::shared_ptr<AudioNode> getInput() const { return _input; }
227 
228 #pragma mark -
229 #pragma mark Playback Control
230 
241  virtual bool completed() override;
242 
260  virtual Uint32 read(float* buffer, Uint32 frames) override;
261 
262 #pragma mark -
263 #pragma mark Optional Methods
264 
281  virtual bool mark() override;
282 
297  virtual bool unmark() override;
298 
314  virtual bool reset() override;
315 
331  virtual Sint64 advance(Uint32 frames) override;
332 
347  virtual Sint64 getPosition() const override;
348 
365  virtual Sint64 setPosition(Uint32 position) override;
366 
381  virtual double getElapsed() const override;
382 
399  virtual double setElapsed(double time) override;
400 
417  virtual double getRemaining() const override;
418 
436  virtual double setRemaining(double time) override;
437 };
438  }
439 }
440 #endif /* __CU_AUDIO_SYNCHRONIZER_H__ */
cugl::audio::AudioSynchronizer::setPosition
virtual Sint64 setPosition(Uint32 position) override
cugl::audio::AudioSynchronizer::getOverhead
double getOverhead() const
Definition: CUAudioSynchronizer.h:157
cugl::audio::AudioSynchronizer::getInput
std::shared_ptr< AudioNode > getInput() const
Definition: CUAudioSynchronizer.h:226
cugl::audio::AudioSynchronizer::advance
virtual Sint64 advance(Uint32 frames) override
cugl::audio::AudioSynchronizer::alloc
static std::shared_ptr< AudioSynchronizer > alloc(Uint8 channels, Uint32 rate)
Definition: CUAudioSynchronizer.h:145
cugl::audio::AudioSynchronizer::unmark
virtual bool unmark() override
cugl::audio::AudioSynchronizer::dispose
virtual void dispose() override
cugl::audio::AudioSynchronizer::getJitter
double getJitter() const
Definition: CUAudioSynchronizer.h:173
cugl::audio::AudioSynchronizer::completed
virtual bool completed() override
cugl::audio::AudioSynchronizer::setOverhead
void setOverhead(double overhead)
cugl::audio::AudioSynchronizer
Definition: CUAudioSynchronizer.h:29
cugl::audio::AudioSynchronizer::AudioSynchronizer
AudioSynchronizer()
cugl::audio::AudioSynchronizer::getRemaining
virtual double getRemaining() const override
cugl::audio::AudioSynchronizer::alloc
static std::shared_ptr< AudioSynchronizer > alloc()
Definition: CUAudioSynchronizer.h:128
cugl::audio::AudioSynchronizer::getPosition
virtual Sint64 getPosition() const override
cugl::audio::AudioSynchronizer::clearJitter
void clearJitter()
cugl::audio::AudioSynchronizer::getElapsed
virtual double getElapsed() const override
cugl::audio::AudioSynchronizer::reset
virtual bool reset() override
cugl::audio::AudioSynchronizer::~AudioSynchronizer
~AudioSynchronizer()
Definition: CUAudioSynchronizer.h:82
cugl::audio::AudioSynchronizer::setRemaining
virtual double setRemaining(double time) override
cugl::audio::AudioSynchronizer::init
virtual bool init() override
cugl::audio::AudioSynchronizer::attach
bool attach(const std::shared_ptr< AudioNode > &node, double bpm=0.0)
cugl::audio::AudioSynchronizer::read
virtual Uint32 read(float *buffer, Uint32 frames) override
cugl::audio::AudioSynchronizer::setElapsed
virtual double setElapsed(double time) override
cugl::audio::AudioSynchronizer::mark
virtual bool mark() override
cugl::audio::AudioSynchronizer::detach
std::shared_ptr< AudioNode > detach()
cugl::audio::AudioNode
Definition: CUAudioNode.h:93
cugl::audio::AudioSynchronizer::onBeat
bool onBeat()