From 05af001d8c5c911750b6331c282ef92bbc7cb400 Mon Sep 17 00:00:00 2001 From: DarkSlein Date: Fri, 17 May 2024 18:44:27 +0300 Subject: [PATCH] Finished preceding buffer implementation --- src/domain/Recorder.cpp | 8 +++++++- src/domain/Recorder.h | 3 +++ src/infra/Audio.cpp | 33 +++++++++++++++++---------------- src/infra/Audio.h | 7 ++++--- src/main.cpp | 14 +++++--------- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/domain/Recorder.cpp b/src/domain/Recorder.cpp index 938a87c..ed6cd71 100644 --- a/src/domain/Recorder.cpp +++ b/src/domain/Recorder.cpp @@ -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() { - _audio->writeToPrecedingBuffer(); + if (!_isWritingToPrecedingBuffer && !_recordingAudio) { + _isWritingToPrecedingBuffer = true; + _audio->writeToPrecedingBuffer(); + _isWritingToPrecedingBuffer = false; + } } bool Recorder::isNoiseDetected() { diff --git a/src/domain/Recorder.h b/src/domain/Recorder.h index 58d72e1..51b9cd4 100644 --- a/src/domain/Recorder.h +++ b/src/domain/Recorder.h @@ -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); diff --git a/src/infra/Audio.cpp b/src/infra/Audio.cpp index b78426a..d3e1dfb 100644 --- a/src/infra/Audio.cpp +++ b/src/infra/Audio.cpp @@ -10,7 +10,7 @@ Audio::Audio(MicType micType) { for (int i = 0; i < _wavDataSize/_dividedWavDataSize; ++i) _wavData[i] = new char[_dividedWavDataSize]; - _precedingWavBuffer = new CircularBuffer(PRECEDING_BUFFER_SIZE); // _precedingWavDataSize/_dividedWavDataSize + _precedingWavBuffer = new CircularBuffer(_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]; diff --git a/src/infra/Audio.h b/src/infra/Audio.h index 0f5c27a..a2119f7 100644 --- a/src/infra/Audio.h +++ b/src/infra/Audio.h @@ -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* _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(); diff --git a/src/main.cpp b/src/main.cpp index 0bdc5a2..fef057f 100644 --- a/src/main.cpp +++ b/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()); + } }