CUGL 1.3
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CUAudioFader.h
1 //
2 // CUAudioFader.h
3 // Cornell University Game Library (CUGL)
4 //
5 // This module provides an audio node wrapper for fade-in and fade-out support.
6 // We have decoupled fade-in and out from the player since we want to apply it
7 // to arbitrary audio patches. We have also decoupled it from the scheduler,
8 // as the schedule API is complicated enough as it is. By factoring this
9 // out into its own node, it is easier for us to support nonlinear fades (such
10 // as with an easing function.
11 //
12 // NOTE: Easing functions are not yet supported. They are on the milestone
13 // for the next release.
14 //
15 // CUGL MIT License:
16 //
17 // This software is provided 'as-is', without any express or implied
18 // warranty. In no event will the authors be held liable for any damages
19 // arising from the use of this software.
20 //
21 // Permission is granted to anyone to use this software for any purpose,
22 // including commercial applications, and to alter it and redistribute it
23 // freely, subject to the following restrictions:
24 //
25 // 1. The origin of this software must not be misrepresented; you must not
26 // claim that you wrote the original software. If you use this software
27 // in a product, an acknowledgment in the product documentation would be
28 // appreciated but is not required.
29 //
30 // 2. Altered source versions must be plainly marked as such, and must not
31 // be misrepresented as being the original software.
32 //
33 // 3. This notice may not be removed or altered from any source distribution.
34 //
35 // Author: Walker White
36 // Version: 11/20/18
37 //
38 #ifndef __CU_AUDIO_FADER_H__
39 #define __CU_AUDIO_FADER_H__
40 #include <SDL/SDL.h>
41 #include "CUAudioNode.h"
42 #include <mutex>
43 
44 namespace cugl {
45  namespace audio {
46 
68 class AudioFader : public AudioNode {
69 protected:
71  std::shared_ptr<AudioNode> _input;
72 
74  std::mutex _mutex;
75 
76  // Fade-in: For softer starts
78  Sint64 _inmark;
80  Uint64 _fadein;
81 
82  // Fade-out: For smooth stopping
84  Sint64 _outmark;
86  Uint64 _fadeout;
88  bool _outdone;
90  bool _outkeep;
91 
92  // Fade-dip: For smooth pausing
94  Uint64 _fadedip;
96  Sint64 _dipmark;
98  Uint64 _dipstop;
100  bool _diphalf;
102  bool _dipstart;
103 
104 
124  Uint32 doFadeIn(float* buffer, Uint32 frames);
125 
145  Uint32 doFadeOut(float* buffer, Uint32 frames);
146 
169  Uint32 doFadePause(float* buffer, Uint32 frames);
170 
171 public:
172 #pragma mark Constructors
173 
179  AudioFader();
180 
185 
198  virtual bool init() override;
199 
212  virtual bool init(Uint8 channels, Uint32 rate) override;
213 
224  bool init(const std::shared_ptr<AudioNode>& input);
225 
232  virtual void dispose() override;
233 
234 #pragma mark -
235 #pragma mark Static Constructors
236 
245  static std::shared_ptr<AudioFader> alloc() {
246  std::shared_ptr<AudioFader> result = std::make_shared<AudioFader>();
247  return (result->init() ? result : nullptr);
248  }
249 
260  static std::shared_ptr<AudioFader> alloc(Uint8 channels, Uint32 rate) {
261  std::shared_ptr<AudioFader> result = std::make_shared<AudioFader>();
262  return (result->init(channels,rate) ? result : nullptr);
263  }
264 
275  static std::shared_ptr<AudioFader> alloc(const std::shared_ptr<AudioNode>& input) {
276  std::shared_ptr<AudioFader> result = std::make_shared<AudioFader>();
277  return (result->init(input) ? result : nullptr);
278  }
279 
280 #pragma mark -
281 #pragma mark Fade In/Out Support
282 
292  bool attach(const std::shared_ptr<AudioNode>& node);
293 
301  std::shared_ptr<AudioNode> detach();
302 
308  std::shared_ptr<AudioNode> getInput() { return _input; }
309 
310  // TODO: Add easing functions for fade-in/fade-out
324  void fadeIn(double duration);
325 
331  bool isFadeIn();
332 
352  void fadeOut(double duration, bool wrap=false);
353 
359  bool isFadeOut();
360 
379  void fadePause(double duration);
380 
389  bool isFadePause();
390 
410  void fadePause(double fadein, double fadeout);
411 
412 #pragma mark -
413 #pragma mark Overriden Methods
414 
419  virtual bool isPaused() override;
420 
429  virtual bool pause() override;
430 
438  virtual bool resume() override;
439 
458  virtual Uint32 read(float* buffer, Uint32 frames) override;
459 
468  virtual bool completed() override;
469 
478  virtual bool mark() override;
479 
489  virtual bool unmark() override;
490 
499  virtual bool reset() override;
500 
511  virtual Sint64 advance(Uint32 frames) override;
512 
521  virtual Sint64 getPosition() const override;
522 
533  virtual Sint64 setPosition(Uint32 position) override;
534 
543  virtual double getElapsed() const override;
544 
555  virtual double setElapsed(double time) override;
556 
565  virtual double getRemaining() const override;
566 
577  virtual double setRemaining(double time) override;
578 };
579  }
580 }
581 
582 #endif /* __CU_AUDIO_FADER_H__ */
cugl::audio::AudioFader::_dipstart
bool _dipstart
Definition: CUAudioFader.h:102
cugl::audio::AudioFader::getElapsed
virtual double getElapsed() const override
cugl::audio::AudioFader::init
virtual bool init() override
cugl::audio::AudioFader::isPaused
virtual bool isPaused() override
cugl::audio::AudioFader::isFadeOut
bool isFadeOut()
cugl::audio::AudioFader::fadePause
void fadePause(double duration)
cugl::audio::AudioFader::detach
std::shared_ptr< AudioNode > detach()
cugl::audio::AudioFader::_mutex
std::mutex _mutex
Definition: CUAudioFader.h:74
cugl::audio::AudioFader::alloc
static std::shared_ptr< AudioFader > alloc(const std::shared_ptr< AudioNode > &input)
Definition: CUAudioFader.h:275
cugl::audio::AudioFader::setPosition
virtual Sint64 setPosition(Uint32 position) override
cugl::audio::AudioFader::isFadePause
bool isFadePause()
cugl::audio::AudioFader::AudioFader
AudioFader()
cugl::audio::AudioFader::attach
bool attach(const std::shared_ptr< AudioNode > &node)
cugl::audio::AudioFader::read
virtual Uint32 read(float *buffer, Uint32 frames) override
cugl::audio::AudioFader::fadeOut
void fadeOut(double duration, bool wrap=false)
cugl::audio::AudioFader::unmark
virtual bool unmark() override
cugl::audio::AudioFader::doFadePause
Uint32 doFadePause(float *buffer, Uint32 frames)
cugl::audio::AudioFader::_outmark
Sint64 _outmark
Definition: CUAudioFader.h:84
cugl::audio::AudioFader::advance
virtual Sint64 advance(Uint32 frames) override
cugl::audio::AudioFader::alloc
static std::shared_ptr< AudioFader > alloc()
Definition: CUAudioFader.h:245
cugl::audio::AudioFader::_fadedip
Uint64 _fadedip
Definition: CUAudioFader.h:94
cugl::audio::AudioFader::_fadeout
Uint64 _fadeout
Definition: CUAudioFader.h:86
cugl::audio::AudioFader::doFadeIn
Uint32 doFadeIn(float *buffer, Uint32 frames)
cugl::audio::AudioFader::isFadeIn
bool isFadeIn()
cugl::audio::AudioFader::getInput
std::shared_ptr< AudioNode > getInput()
Definition: CUAudioFader.h:308
cugl::audio::AudioFader::~AudioFader
~AudioFader()
Definition: CUAudioFader.h:184
cugl::audio::AudioFader::dispose
virtual void dispose() override
cugl::audio::AudioFader::_fadein
Uint64 _fadein
Definition: CUAudioFader.h:80
cugl::audio::AudioFader::setElapsed
virtual double setElapsed(double time) override
cugl::audio::AudioFader::pause
virtual bool pause() override
cugl::audio::AudioFader::_input
std::shared_ptr< AudioNode > _input
Definition: CUAudioFader.h:71
cugl::audio::AudioFader::setRemaining
virtual double setRemaining(double time) override
cugl::audio::AudioFader::_inmark
Sint64 _inmark
Definition: CUAudioFader.h:78
cugl::audio::AudioFader::resume
virtual bool resume() override
cugl::audio::AudioFader::_outdone
bool _outdone
Definition: CUAudioFader.h:88
cugl::audio::AudioFader::reset
virtual bool reset() override
cugl::audio::AudioFader::_dipstop
Uint64 _dipstop
Definition: CUAudioFader.h:98
cugl::audio::AudioFader::doFadeOut
Uint32 doFadeOut(float *buffer, Uint32 frames)
cugl::audio::AudioFader::alloc
static std::shared_ptr< AudioFader > alloc(Uint8 channels, Uint32 rate)
Definition: CUAudioFader.h:260
cugl::audio::AudioFader
Definition: CUAudioFader.h:68
cugl::audio::AudioFader::_outkeep
bool _outkeep
Definition: CUAudioFader.h:90
cugl::audio::AudioFader::completed
virtual bool completed() override
cugl::audio::AudioFader::mark
virtual bool mark() override
cugl::audio::AudioFader::fadeIn
void fadeIn(double duration)
cugl::audio::AudioFader::getRemaining
virtual double getRemaining() const override
cugl::audio::AudioNode
Definition: CUAudioNode.h:93
cugl::audio::AudioFader::_dipmark
Sint64 _dipmark
Definition: CUAudioFader.h:96
cugl::audio::AudioFader::_diphalf
bool _diphalf
Definition: CUAudioFader.h:100
cugl::audio::AudioFader::getPosition
virtual Sint64 getPosition() const override