74 lines
1.4 KiB
C++
74 lines
1.4 KiB
C++
|
#ifndef muz_AUDIOENGINE_HPP
|
||
|
#define muz_AUDIOENGINE_HPP
|
||
|
|
||
|
#include <portaudio.h>
|
||
|
|
||
|
#include "commons.hpp"
|
||
|
#include "AudioConf.hpp"
|
||
|
|
||
|
namespace muz
|
||
|
{
|
||
|
class Signal;
|
||
|
|
||
|
MUZ_ERROR(audio_error);
|
||
|
|
||
|
/**
|
||
|
* Make sound from signals.
|
||
|
* @see Signal
|
||
|
**/
|
||
|
class AudioEngine
|
||
|
{
|
||
|
public:
|
||
|
explicit AudioEngine(AudioConf const& conf);
|
||
|
virtual ~AudioEngine();
|
||
|
|
||
|
/**
|
||
|
* Initialize the engine opening audio device.
|
||
|
**/
|
||
|
void init();
|
||
|
|
||
|
/**
|
||
|
* Run the engine, making sound.
|
||
|
**/
|
||
|
void run();
|
||
|
|
||
|
/**
|
||
|
* Push a new signal in the signals queue.
|
||
|
*/
|
||
|
void push_signal(std::unique_ptr<Signal> signal);
|
||
|
|
||
|
/**
|
||
|
* Pop the current signal or does nothing if the queue is empty.
|
||
|
**/
|
||
|
void pop_signal();
|
||
|
|
||
|
private:
|
||
|
AudioConf m_conf;
|
||
|
PaStream* m_stream = nullptr;
|
||
|
std::vector<std::unique_ptr<Signal>> m_sig_queue;
|
||
|
std::mutex m_sig_mtx;
|
||
|
|
||
|
/**
|
||
|
* Throws an audio_error exception if err is an error.
|
||
|
**/
|
||
|
void check_error(PaError err);
|
||
|
|
||
|
/**
|
||
|
* Gives the next sample of the current signal.
|
||
|
* @see Signal
|
||
|
**/
|
||
|
std::vector<float> next();
|
||
|
|
||
|
/**
|
||
|
* Portaudio audio callback.
|
||
|
**/
|
||
|
static int callback(void const* input, void* output,
|
||
|
unsigned long frames_per_buffer,
|
||
|
PaStreamCallbackTimeInfo const* time,
|
||
|
PaStreamCallbackFlags flags,
|
||
|
void* data);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
#endif
|