#ifndef _AUDIO_H #define _AUDIO_H #include #include "infra/I2S.h" // 16bit, monoral, 16000Hz, linear PCM class Audio { private: I2S* i2s; static const int _headerSize = 44; static const int _i2sBufferSize = 6000; // 22500 char _i2sBuffer[_i2sBufferSize]; char _i2sBuffer2[_i2sBufferSize]; static const int _wavDataSize = 90000; // It must be multiple of _dividedWavDataSize. Recording time is about 1.9 second. static const int _dividedWavDataSize = _i2sBufferSize/4; char** _wavData; // It's divided. Because large continuous memory area can't be allocated in esp32. static const int _prerecordedWavDataSize = _wavDataSize/4; char** _prerecordedWavData; byte _paddedHeader[_headerSize + 4] = {0}; // The size must be multiple of 3 for Base64 encoding. Additional byte size must be even because wave data is 16bit. unsigned long _startMicros = 0; void _writeToBuffer(char** wavBuffer, int waveDataSize); void _createWavHeader(byte* header, int waveDataSize); public: Audio(MicType micType); ~Audio(); char** record(); int getSize(); String print(Stream* stream); unsigned long getStartMicros(); bool isNoiseDetected(int threshold); }; #endif // _AUDIO_H