blob: ead70d55f4f4fe4f82665c861176009addf25a65 [file] [log] [blame] [raw]
#pragma once
#include <cstdio>
typedef void (*callbackFunc)(unsigned char *stream, int len);
// WAV file header structure
// should be 1-byte aligned
#pragma pack(1)
struct WAVHEADER {
char riff[4];
unsigned int rLen;
char WAVEfmt[8];
unsigned int fLen; /* 0x1020 */;
unsigned short wFormatTag; /* 0x0001 */
unsigned short nChannels; /* 0x0001 */
unsigned int nSamplesPerSec;
unsigned int nAvgBytesPerSec; // nSamplesPerSec*nChannels*(nBitsPerSample%8)
unsigned short nBlockAlign; /* 0x0001 */
unsigned short nBitsPerSample; /* 0x0008 */
char datastr[4];
unsigned int cbSize;
};
#pragma pack()
class Audio {
public:
Audio(unsigned int sampleFrq_) : bufferLength(4096), sampleFrq(sampleFrq_) { // 2048
recording = false;
wavFileHandle = 0;
}
virtual ~Audio() {};
virtual void play() = 0;
virtual void pause() = 0;
virtual void stop() = 0;
virtual void sleep(unsigned int msec) = 0;
virtual void flush() {
unsigned int msec = (unsigned int)(1000.f * double(bufferLength)/double(sampleFrq) + 1);
sleep(msec);
}
virtual void lock() = 0;
virtual void unlock() = 0;
virtual void setSampleRate(unsigned int newSampleRate) {
sampleFrq = newSampleRate;
}
unsigned int getLatency() {
unsigned int msec = (unsigned int)(1000.f * double(bufferLength)/double(sampleFrq) + 1);
return msec;
}
unsigned int getSampleRate() { return sampleFrq; }
bool isPaused() { return paused; };
virtual bool createWav(const char *fileName);
virtual void closeWav();
static bool dumpWavData(FILE *fp, unsigned char *buffer, unsigned int length);
static short getLastSample() { return lastSample; };
protected:
unsigned int bufferLength;
static bool paused;
static callbackFunc callback;
static void audioCallback(void *userData, unsigned char *stream, int len);
static short *ringBuffer;
static size_t ringBufferSize;
static size_t ringBufferIndex;
static bool recording;
static FILE *wavFileHandle;
static size_t wavDataLength;
static short lastSample;
private:
unsigned int sampleFrq;
};