1 #ifndef INCLUDE_AL_AUDIODATA_IO_HPP
2 #define INCLUDE_AL_AUDIODATA_IO_HPP
56 static void deleteBuf(T*& buf) {
62 static int resize(T*& buf,
int n) {
70 static void zero(T* buf,
unsigned int n) {
71 memset(buf, 0, n *
sizeof(T));
76 static void deinterleave(T* dst,
const T* src,
int numFrames,
int numChannels) {
77 int numSamples = numFrames * numChannels;
78 for (
int c = 0; c < numChannels; c++) {
79 for (
int i = c; i < numSamples; i += numChannels) {
87 static void interleave(T* dst,
const T* src,
int numFrames,
int numChannels) {
88 int numSamples = numFrames * numChannels;
89 for (
int c = 0; c < numChannels; c++) {
90 for (
int i = c; i < numSamples; i += numChannels) {
98 static void interleave(T *dst, T **src,
int numFrames,
int numChannels) {
99 int numSamples = numFrames * numChannels;
100 for (
int c = 0; c < numChannels; c++) {
101 float *channelSrc = src[c];
102 for (
int i = c; i < numSamples; i += numChannels) {
103 dst[i] = *channelSrc++;
132 virtual int id()
const;
133 virtual const char*
name()
const;
157 int mChannelsInMax{0};
158 int mChannelsOutMax{0};
159 double mDefaultSampleRate{0};
181 typedef enum { PORTAUDIO, RTAUDIO, DUMMY } Backend;
187 unsigned int frame()
const {
return mFrame; }
190 float&
bus(
unsigned int chan)
const {
return bus(chan,
frame()); }
193 float&
bus(
unsigned int chan,
unsigned int frame)
const;
196 float*
busBuffer(
unsigned int chan = 0)
const {
return &
bus(chan, 0); }
199 const float&
in(
unsigned int chan)
const {
return in(chan,
frame()); }
202 const float&
in(
unsigned int chan,
unsigned int frame)
const;
205 const float*
inBuffer(
unsigned int chan = 0)
const {
return &
in(chan, 0); }
208 float&
out(
unsigned int chan)
const {
return out(chan,
frame()); }
211 float&
out(
unsigned int chan,
unsigned int frame)
const;
214 float*
outBuffer(
unsigned int chan = 0)
const {
return &
out(chan, 0); }
217 void sum(
float v,
unsigned int chan)
const {
out(chan) += v; }
220 void sum(
float v,
unsigned int ch1,
unsigned int ch2)
const {
231 void*
user()
const {
return mUser; }
233 template <
class UserDataType>
234 UserDataType&
user()
const {
235 return *(
static_cast<UserDataType*
>(mUser));
238 int channels(
bool forOutput)
const;
248 void user(
void* v) { mUser = v; }
276 bool usingGain()
const {
return mGain != 1.f || mGainPrev != 1.f; }
278 float mGain, mGainPrev;
282 mutable unsigned int mFrame;
283 unsigned int mFramesPerBuffer;
284 double mFramesPerSecond;
285 float *mBufI, *mBufO, *mBufB;
287 unsigned int mNumI, mNumO, mNumB;
289 void resizeBuffer(
bool forOutput);
virtual void onAudioCB(AudioIOData &io)=0
Callback.
virtual bool hasInput() const =0
Returns whether device has input.
virtual int channelsOutMax() const
Get maximum number of output channels supported.
virtual int channelsInMax() const
Get maximum number of input channels supported.
virtual void setChannelsInMax(int num)
Sets maximum number of Input channels supported.
virtual void setID(int iD)
Sets unique ID.
virtual int id() const
Get device unique ID.
virtual void setName(char *name)
Sets device name.
virtual void print() const =0
Prints info about specific i/o device to stdout.
virtual double defaultSampleRate() const
Get default sample rate.
virtual bool valid() const
Returns whether device is valid.
virtual const char * name() const
Get device name.
virtual bool hasOutput() const =0
Returns whether device has output.
virtual void setChannelsOutMax(int num)
Sets maximum number of Output channels supported.
virtual void setDefaultSampleRate(double rate)
Sets default sample rate.
AudioDeviceInfo(int deviceNum)
float & bus(unsigned int chan) const
Get bus sample at current frame iteration on specified channel.
uint64_t framesPerBuffer() const
Get frames/buffer of audio I/O stream.
void * user() const
Get pointer to user data.
double secondsPerBuffer() const
Get seconds/buffer of audio I/O stream.
void zeroBus()
Zeros all the bus buffers.
float * tempBuffer() const
Get non-interleaved temporary buffer on specified channel.
float & out(unsigned int chan) const
Get output sample at current frame iteration on specified channel.
void frame(unsigned int v)
Set frame count for next iteration.
void user(void *v)
Set user data.
AudioIOData(void *user=nullptr)
Constructor.
virtual void channelsBus(int num)
Set number of bus channels.
const float & in(unsigned int chan) const
Get input sample at current frame iteration on specified channel.
float * outBuffer(unsigned int chan=0) const
Get non-interleaved output buffer on specified channel.
void sum(float v, unsigned int chan) const
Add value to current output sample on specified channel.
virtual void framesPerSecond(double v)
Set number of frames per second.
virtual void framesPerBuffer(unsigned int n)
Set number of frames per processing buffer.
const float * inBuffer(unsigned int chan=0) const
Get non-interleaved input buffer on specified channel.
double framesPerSecond() const
Get frames/second of audio I/O streams.
bool operator()() const
Iterate frame counter, returning true while more frames.
unsigned int channelsIn() const
Get effective number of input channels.
float * busBuffer(unsigned int chan=0) const
Get non-interleaved bus buffer on specified channel.
void zeroOut()
Zeros all the internal output buffers.
unsigned int channelsOut() const
Get effective number of output channels.
float & temp(unsigned int frame) const
Get sample from temporary buffer at specified frame.
virtual void channels(int num, bool forOutput)
unsigned int frame() const
Get current frame number.
unsigned int channelsBus() const
Get number of allocated bus channels.
void channelsIn(int n)
Set number of input channels.
void sum(float v, unsigned int ch1, unsigned int ch2) const
Add value to current output sample on specified channels.
void channelsOut(int n)
Set number of output channels.