Finished preceding buffer implementation
This commit is contained in:
parent
6cc1cb34f1
commit
05af001d8c
@ -15,6 +15,7 @@ Recorder::~Recorder() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Recorder::recordAudio() {
|
void Recorder::recordAudio() {
|
||||||
|
_recordingAudio = true;
|
||||||
_ready();
|
_ready();
|
||||||
|
|
||||||
if (_http->connect(RAT_IP, RAT_PORT)) {
|
if (_http->connect(RAT_IP, RAT_PORT)) {
|
||||||
@ -28,6 +29,7 @@ void Recorder::recordAudio() {
|
|||||||
} else {
|
} else {
|
||||||
Serial.println("| Connection failed");
|
Serial.println("| Connection failed");
|
||||||
}
|
}
|
||||||
|
_recordingAudio = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Recorder::_ready() {
|
void Recorder::_ready() {
|
||||||
@ -79,7 +81,11 @@ String Recorder::_formPayloadEnd() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Recorder::writeToPrecedingBuffer() {
|
void Recorder::writeToPrecedingBuffer() {
|
||||||
|
if (!_isWritingToPrecedingBuffer && !_recordingAudio) {
|
||||||
|
_isWritingToPrecedingBuffer = true;
|
||||||
_audio->writeToPrecedingBuffer();
|
_audio->writeToPrecedingBuffer();
|
||||||
|
_isWritingToPrecedingBuffer = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Recorder::isNoiseDetected() {
|
bool Recorder::isNoiseDetected() {
|
||||||
|
@ -8,6 +8,9 @@ private:
|
|||||||
Audio* _audio;
|
Audio* _audio;
|
||||||
Http* _http;
|
Http* _http;
|
||||||
|
|
||||||
|
bool _isWritingToPrecedingBuffer = false;
|
||||||
|
bool _recordingAudio = false;
|
||||||
|
|
||||||
void _ready();
|
void _ready();
|
||||||
void _transcribe();
|
void _transcribe();
|
||||||
void _printContent(String payloadStart, String payloadEnd, Stream* stream);
|
void _printContent(String payloadStart, String payloadEnd, Stream* stream);
|
||||||
|
@ -10,7 +10,7 @@ Audio::Audio(MicType micType) {
|
|||||||
for (int i = 0; i < _wavDataSize/_dividedWavDataSize; ++i)
|
for (int i = 0; i < _wavDataSize/_dividedWavDataSize; ++i)
|
||||||
_wavData[i] = new char[_dividedWavDataSize];
|
_wavData[i] = new char[_dividedWavDataSize];
|
||||||
|
|
||||||
_precedingWavBuffer = new CircularBuffer<char*>(PRECEDING_BUFFER_SIZE); // _precedingWavDataSize/_dividedWavDataSize
|
_precedingWavBuffer = new CircularBuffer<char*>(_precedingWavPartsAmount);
|
||||||
|
|
||||||
i2s = new I2S(micType);
|
i2s = new I2S(micType);
|
||||||
}
|
}
|
||||||
@ -77,9 +77,8 @@ char** Audio::record() {
|
|||||||
_createWavHeader(_paddedHeader, _wavDataSize);
|
_createWavHeader(_paddedHeader, _wavDataSize);
|
||||||
|
|
||||||
_startMicros = micros();
|
_startMicros = micros();
|
||||||
//_readFromPrecedingBuffer(_wavData, _precedingWavDataSize);
|
_readFromPrecedingBuffer(_wavData);
|
||||||
//_recordToBuffer(_wavData + _precedingWavDataSize, _wavDataSize - _precedingWavDataSize);
|
_recordToBuffer(_wavData + _precedingWavPartsAmount, _wavDataSize - _precedingWavDataSize);
|
||||||
_recordToBuffer(_wavData, _wavDataSize);
|
|
||||||
|
|
||||||
return _wavData;
|
return _wavData;
|
||||||
}
|
}
|
||||||
@ -104,6 +103,19 @@ void Audio::_recordToBuffer(char** wavBuffer, int waveDataSize) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Audio::_readFromPrecedingBuffer(char** wavBuffer) {
|
||||||
|
for (int i = 0; i < _precedingWavPartsAmount; i++) {
|
||||||
|
if (!_precedingWavBuffer->isEmpty()) {
|
||||||
|
char* tmp;
|
||||||
|
_precedingWavBuffer->popFront(tmp);
|
||||||
|
delete wavBuffer[i];
|
||||||
|
wavBuffer[i] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emptyPrecedingBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
void Audio::emptyPrecedingBuffer() {
|
void Audio::emptyPrecedingBuffer() {
|
||||||
while (!_precedingWavBuffer->isEmpty()) {
|
while (!_precedingWavBuffer->isEmpty()) {
|
||||||
char* tmp;
|
char* tmp;
|
||||||
@ -122,23 +134,12 @@ void Audio::writeToPrecedingBuffer() {
|
|||||||
i2s->Read(_i2sBuffer, _i2sBufferSize/2);
|
i2s->Read(_i2sBuffer, _i2sBufferSize/2);
|
||||||
_noiseDetectedInPrecedingBuffer = _isNoiseDetectedInPrecedingBuffer();
|
_noiseDetectedInPrecedingBuffer = _isNoiseDetectedInPrecedingBuffer();
|
||||||
|
|
||||||
char* _partialWavBuffer = new char[_precedingWavDataSize];
|
char* _partialWavBuffer = new char[_dividedWavDataSize];
|
||||||
_convertBufferToWav(_partialWavBuffer);
|
_convertBufferToWav(_partialWavBuffer);
|
||||||
|
|
||||||
CircularBufferErrorCode err = _precedingWavBuffer->pushBack(_partialWavBuffer);
|
CircularBufferErrorCode err = _precedingWavBuffer->pushBack(_partialWavBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Audio::_readFromPrecedingBuffer(char** wavBuffer, int waveDataSize) {
|
|
||||||
char* tmp;
|
|
||||||
|
|
||||||
for (int i = 0; i < PRECEDING_BUFFER_SIZE; i++) {
|
|
||||||
_precedingWavBuffer->popFront(tmp);
|
|
||||||
wavBuffer[i] = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
emptyPrecedingBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Audio::_convertBufferToWav(char* partialWavBuffer) {
|
void Audio::_convertBufferToWav(char* partialWavBuffer) {
|
||||||
for (int i = 0; i < _i2sBufferSize/8; ++i) {
|
for (int i = 0; i < _i2sBufferSize/8; ++i) {
|
||||||
partialWavBuffer[2*i] = _i2sBuffer[4*i + 2];
|
partialWavBuffer[2*i] = _i2sBuffer[4*i + 2];
|
||||||
|
@ -11,7 +11,7 @@ class Audio {
|
|||||||
private:
|
private:
|
||||||
I2S* i2s;
|
I2S* i2s;
|
||||||
static const int _headerSize = 44;
|
static const int _headerSize = 44;
|
||||||
static const int _i2sBufferSize = 6000; // 22500
|
static const int _i2sBufferSize = 6000;
|
||||||
char _i2sBuffer[_i2sBufferSize];
|
char _i2sBuffer[_i2sBufferSize];
|
||||||
char _i2sBuffer2[_i2sBufferSize];
|
char _i2sBuffer2[_i2sBufferSize];
|
||||||
|
|
||||||
@ -19,7 +19,8 @@ private:
|
|||||||
static const int _dividedWavDataSize = _i2sBufferSize/4;
|
static const int _dividedWavDataSize = _i2sBufferSize/4;
|
||||||
char** _wavData; // It's divided. Because large continuous memory area can't be allocated in esp32.
|
char** _wavData; // It's divided. Because large continuous memory area can't be allocated in esp32.
|
||||||
|
|
||||||
static const int _precedingWavDataSize = _wavDataSize/4;
|
static const int _precedingWavPartsAmount = 12;
|
||||||
|
static const int _precedingWavDataSize = _precedingWavPartsAmount*_dividedWavDataSize;
|
||||||
char** _precedingWavData;
|
char** _precedingWavData;
|
||||||
CircularBuffer<char*>* _precedingWavBuffer;
|
CircularBuffer<char*>* _precedingWavBuffer;
|
||||||
bool _precedingBufferFull = false;
|
bool _precedingBufferFull = false;
|
||||||
@ -30,8 +31,8 @@ private:
|
|||||||
unsigned long _startMicros = 0;
|
unsigned long _startMicros = 0;
|
||||||
|
|
||||||
void _recordToBuffer(char** wavBuffer, int waveDataSize);
|
void _recordToBuffer(char** wavBuffer, int waveDataSize);
|
||||||
|
void _readFromPrecedingBuffer(char** wavBuffer);
|
||||||
void _convertBufferToWav(char* partialWavBuffer);
|
void _convertBufferToWav(char* partialWavBuffer);
|
||||||
void _readFromPrecedingBuffer(char** wavBuffer, int waveDataSize);
|
|
||||||
void _createWavHeader(byte* header, int waveDataSize);
|
void _createWavHeader(byte* header, int waveDataSize);
|
||||||
bool _isNoiseDetectedInPrecedingBuffer();
|
bool _isNoiseDetectedInPrecedingBuffer();
|
||||||
|
|
||||||
|
14
src/main.cpp
14
src/main.cpp
@ -68,7 +68,7 @@ void setup() {
|
|||||||
setInitialTime();
|
setInitialTime();
|
||||||
recorder = new Recorder(ADMP441, &http);
|
recorder = new Recorder(ADMP441, &http);
|
||||||
|
|
||||||
createWriteToPrecedingBufferTask();
|
//createWriteToPrecedingBufferTask();
|
||||||
|
|
||||||
beginMicros = micros();
|
beginMicros = micros();
|
||||||
}
|
}
|
||||||
@ -76,13 +76,9 @@ void setup() {
|
|||||||
void loop() {
|
void loop() {
|
||||||
eth.readAndPrintData(true); // set to false for better speed measurement
|
eth.readAndPrintData(true); // set to false for better speed measurement
|
||||||
|
|
||||||
/*if (loudnessFlag) {
|
recorder->writeToPrecedingBuffer();
|
||||||
loudnessFlag = false;
|
|
||||||
|
if (recorder->isNoiseDetected()) {
|
||||||
recorder->recordAudio();
|
recorder->recordAudio();
|
||||||
}*/
|
}
|
||||||
|
|
||||||
//recorder->recordAudio();
|
|
||||||
//delay(15000);
|
|
||||||
|
|
||||||
//eth.handleDisconnect(beginMicros, micros());
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user