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