CUGL 1.3
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CUAudioInput.h
1 //
2 // CUAudioInput.h
3 // CUGL
4 //
5 // Created by Walker White on 11/24/18.
6 // Copyright © 2018 Game Design Initiative at Cornell. All rights reserved.
7 //
8 // TODO: Make record vs playback clearer (active only for recording)
9 #ifndef __CU_AUDIO_INPUT_H__
10 #define __CU_AUDIO_INPUT_H__
11 #include <SDL/SDL.h>
12 #include "CUAudioNode.h"
13 #include <unordered_set>
14 #include <string>
15 #include <memory>
16 #include <vector>
17 #include <deque>
18 #include <mutex>
19 
20 namespace cugl {
21 
23  class AudioManager;
25  class AudioSample;
26 
27  namespace audio {
76 class AudioInput : public AudioNode {
77 private:
79  std::string _dvname;
80 
82  SDL_AudioDeviceID _device;
84  SDL_AudioSpec _audiospec;
85 
87  std::atomic<bool> _record;
88 
90  std::atomic<bool> _active;
91 
93  std::atomic<Sint64> _timeout;
94 
96  mutable std::mutex _buffmtex;
97 
98  // We were forced to use mutexes for this class, so there are no atomics
100  float* _buffer;
102  Uint32 _capacity;
104  Uint32 _buffsize;
106  Uint32 _buffhead;
108  Uint32 _bufftail;
109 
111  Sint64 _playmark;
113  Sint64 _playpost;
115  std::deque<float> _playback;
116 
117 #pragma mark -
118 #pragma mark AudioManager Methods
119 
142  virtual bool init() override;
143 
170  virtual bool init(Uint8 channels, Uint32 rate) override;
171 
210  bool init(Uint8 channels, Uint32 rate, Uint32 buffer, Uint32 delay);
211 
235  bool init(const std::string& device);
236 
274  bool init(const std::string& device, Uint8 channels, Uint32 rate, Uint32 buffer, Uint32 delay);
275 
282  virtual void dispose() override;
283 
293  void setActive(bool active);
294 
296  friend class cugl::AudioManager;
297 
298 public:
300  const static Uint32 DEFAULT_DELAY;
301 
311  AudioInput();
312 
316  ~AudioInput();
317 
318 #pragma mark -
319 #pragma mark Data Access
320 
325  const SDL_AudioDeviceID getAUID() const { return _device; }
326 
332  const std::string& getDevice() const;
333 
342  bool isDefault() const { return _dvname == ""; }
343 
357  Uint16 getCapacity() const { return _audiospec.samples; }
358 
374  Uint32 getDelay() const;
375 
376 #pragma mark -
377 #pragma mark Playback Control
378 
391  virtual bool pause() override;
392 
405  virtual bool resume() override;
406 
415  bool isRecording() const;
416 
428  bool release();
429 
441  bool acquire();
442 
450  void stop();
451 
465  std::shared_ptr<AudioSample> save();
466 
467 #pragma mark -
468 #pragma mark Audio Graph
469 
479  virtual bool completed() override;
480 
500  virtual Uint32 read(float* buffer, Uint32 frames) override;
501 
519  Uint32 record(float* buffer, Uint32 frames);
520 
532  void reboot();
533 
534 #pragma mark -
535 #pragma mark Optional Methods
536 
546  virtual bool mark() override;
547 
557  virtual bool unmark() override;
558 
569  virtual bool reset() override;
570 
580  virtual Sint64 getPosition() const override;
581 
594  virtual Sint64 setPosition(Uint32 position) override;
595 
605  virtual double getElapsed() const override;
606 
619  virtual double setElapsed(double time) override;
620 
631  virtual double getRemaining() const override;
632 
647  virtual double setRemaining(double time) override;
648 
649 };
650  }
651 }
652 #endif /* __CU_AUDIO_INPUT_H__ */
cugl::audio::AudioInput::mark
virtual bool mark() override
cugl::audio::AudioInput::release
bool release()
cugl::audio::AudioInput::setRemaining
virtual double setRemaining(double time) override
cugl::audio::AudioInput::getDelay
Uint32 getDelay() const
cugl::audio::AudioInput::getDevice
const std::string & getDevice() const
cugl::audio::AudioInput::~AudioInput
~AudioInput()
cugl::audio::AudioInput::getAUID
const SDL_AudioDeviceID getAUID() const
Definition: CUAudioInput.h:325
cugl::audio::AudioInput::reset
virtual bool reset() override
cugl::audio::AudioInput::isRecording
bool isRecording() const
cugl::AudioManager
Definition: CUAudioManager.h:74
cugl::audio::AudioInput::isDefault
bool isDefault() const
Definition: CUAudioInput.h:342
cugl::audio::AudioInput::resume
virtual bool resume() override
cugl::audio::AudioInput::getElapsed
virtual double getElapsed() const override
cugl::audio::AudioInput::DEFAULT_DELAY
const static Uint32 DEFAULT_DELAY
Definition: CUAudioInput.h:300
cugl::audio::AudioInput::getCapacity
Uint16 getCapacity() const
Definition: CUAudioInput.h:357
cugl::audio::AudioInput::read
virtual Uint32 read(float *buffer, Uint32 frames) override
cugl::audio::AudioInput::reboot
void reboot()
cugl::audio::AudioInput::getRemaining
virtual double getRemaining() const override
cugl::audio::AudioInput::pause
virtual bool pause() override
cugl::audio::AudioInput::acquire
bool acquire()
cugl::audio::AudioInput::save
std::shared_ptr< AudioSample > save()
cugl::audio::AudioInput::setElapsed
virtual double setElapsed(double time) override
cugl::audio::AudioInput::stop
void stop()
cugl::audio::AudioInput::setPosition
virtual Sint64 setPosition(Uint32 position) override
cugl::audio::AudioInput::unmark
virtual bool unmark() override
cugl::audio::AudioInput::getPosition
virtual Sint64 getPosition() const override
cugl::audio::AudioInput::completed
virtual bool completed() override
cugl::audio::AudioNode
Definition: CUAudioNode.h:93
cugl::audio::AudioInput
Definition: CUAudioInput.h:76
cugl::audio::AudioInput::record
Uint32 record(float *buffer, Uint32 frames)
cugl::audio::AudioInput::AudioInput
AudioInput()