From c58e95bc4262ad06ba05138247c49fabb125ea75 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 16 Apr 2021 15:16:20 +0200 Subject: [PATCH 1/2] Avoid overwriting DoubleBuffer size if it is big enough --- libraries/PDM/src/PDM.h | 1 + libraries/PDM/src/stm32/PDM.cpp | 9 +++++++++ libraries/PDM/src/stm32/audio.c | 7 +++++-- libraries/PDM/src/utility/PDMDoubleBuffer.cpp | 5 +++++ libraries/PDM/src/utility/PDMDoubleBuffer.h | 1 + 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/libraries/PDM/src/PDM.h b/libraries/PDM/src/PDM.h index c73082250..00096afc6 100644 --- a/libraries/PDM/src/PDM.h +++ b/libraries/PDM/src/PDM.h @@ -42,6 +42,7 @@ class PDMClass //NANO 33 BLE SENSe min 0 max 80 void setGain(int gain); void setBufferSize(int bufferSize); + size_t getBufferSize(); // private: void IrqHandler(bool halftranfer); diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index 69ce30b6b..d4d59f02d 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -114,6 +114,11 @@ void PDMClass::setBufferSize(int bufferSize) _doubleBuffer.setSize(bufferSize); } +size_t PDMClass::getBufferSize() +{ + return _doubleBuffer.getSize(); +} + void PDMClass::IrqHandler(bool halftranfer) { if (_doubleBuffer.available() == 0) { @@ -136,6 +141,10 @@ void PDMIrqHandler(bool halftranfer) void PDMsetBufferSize(int size) { PDM.setBufferSize(size); } + +size_t PDMgetBufferSize() { + return PDM.getBufferSize(); +} } PDMClass PDM(0, 0, 0); diff --git a/libraries/PDM/src/stm32/audio.c b/libraries/PDM/src/stm32/audio.c index 8d8d037ce..3d585c289 100644 --- a/libraries/PDM/src/stm32/audio.c +++ b/libraries/PDM/src/stm32/audio.c @@ -303,8 +303,11 @@ int py_audio_init(size_t channels, uint32_t frequency, int gain_db, float highpa PDM_Filter_setConfig(&PDM_FilterHandler[i], &PDM_FilterConfig[i]); } - PDMsetBufferSize(samples_per_channel * g_o_channels * sizeof(int16_t)); - //g_pcmbuf = malloc(samples_per_channel * g_channels * sizeof(int16_t)); + uint32_t min_buff_size = samples_per_channel * g_o_channels * sizeof(int16_t); + uint32_t buff_size = PDMgetBufferSize(); + if(buff_size < min_buff_size) { + PDMsetBufferSize(min_buff_size); + } return 1; } diff --git a/libraries/PDM/src/utility/PDMDoubleBuffer.cpp b/libraries/PDM/src/utility/PDMDoubleBuffer.cpp index 2e6a4c2c7..d3924c1f0 100644 --- a/libraries/PDM/src/utility/PDMDoubleBuffer.cpp +++ b/libraries/PDM/src/utility/PDMDoubleBuffer.cpp @@ -37,6 +37,11 @@ void PDMDoubleBuffer::setSize(int size) reset(); } +size_t PDMDoubleBuffer::getSize() +{ + return _size; +} + void PDMDoubleBuffer::reset() { _buffer[0] = (uint8_t*)realloc(_buffer[0], _size); diff --git a/libraries/PDM/src/utility/PDMDoubleBuffer.h b/libraries/PDM/src/utility/PDMDoubleBuffer.h index 1544af5bf..7eb8a614a 100644 --- a/libraries/PDM/src/utility/PDMDoubleBuffer.h +++ b/libraries/PDM/src/utility/PDMDoubleBuffer.h @@ -31,6 +31,7 @@ class PDMDoubleBuffer virtual ~PDMDoubleBuffer(); void setSize(int size); + size_t getSize(); void reset(); From 38106828294a166a157d5bc268bb121a25fab441 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 15 Apr 2021 17:18:01 +0200 Subject: [PATCH 2/2] Fix Double buffer fill --- libraries/PDM/src/stm32/PDM.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index d4d59f02d..a51f5a18f 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -70,7 +70,10 @@ int PDMClass::begin(int channels, int sampleRate) { _gain = 24; } - if(py_audio_init(channels, sampleRate, _gain, 0.9883f)) { + g_pcmbuf = (uint16_t*)_doubleBuffer.data(); + _doubleBuffer.swap(0); + + if(py_audio_init(channels, sampleRate, gain_db, 0.9883f)) { py_audio_start_streaming(); _init = 1; return 1; @@ -119,16 +122,24 @@ size_t PDMClass::getBufferSize() return _doubleBuffer.getSize(); } +#define HALF_TRANSFER_SIZE (64*_channels) +static int g_pcmbuf_size=0; + void PDMClass::IrqHandler(bool halftranfer) { - if (_doubleBuffer.available() == 0) { - g_pcmbuf = (uint16_t*)_doubleBuffer.data(); + if (g_pcmbuf_size < _doubleBuffer.getSize()) { audio_pendsv_callback(); - _doubleBuffer.swap(_doubleBuffer.availableForWrite()); - } - - if (_onReceive) { - _onReceive(); + g_pcmbuf += (HALF_TRANSFER_SIZE/2); + g_pcmbuf_size += HALF_TRANSFER_SIZE; + + if(g_pcmbuf_size == _doubleBuffer.getSize()) { + _doubleBuffer.swap(g_pcmbuf_size); + g_pcmbuf = (uint16_t*)_doubleBuffer.data(); + g_pcmbuf_size = 0; + if (_onReceive) { + _onReceive(); + } + } } }