From c58e95bc4262ad06ba05138247c49fabb125ea75 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 16 Apr 2021 15:16:20 +0200 Subject: [PATCH 1/5] 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/5] 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(); + } + } } } From c4d43bb50eef3e03c96e49436b02ef52c7cf1888 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 19 Apr 2021 16:43:40 +0200 Subject: [PATCH 3/5] Store PDM instance --- libraries/PDM/src/PDM.h | 2 +- libraries/PDM/src/stm32/PDM.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libraries/PDM/src/PDM.h b/libraries/PDM/src/PDM.h index 00096afc6..77c99d8ca 100644 --- a/libraries/PDM/src/PDM.h +++ b/libraries/PDM/src/PDM.h @@ -59,7 +59,7 @@ class PDMClass int _init; PDMDoubleBuffer _doubleBuffer; - + void (*_onReceive)(void); }; diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index a51f5a18f..70a00fdef 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -29,6 +29,7 @@ extern "C" { } extern "C" uint16_t *g_pcmbuf; +static PDMClass *_instance = NULL; PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : _dinPin(dinPin), @@ -40,10 +41,12 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : _samplerate(-1), _init(-1) { + _instance = this; } PDMClass::~PDMClass() { + _instance = NULL; } int PDMClass::begin(int channels, int sampleRate) { @@ -146,15 +149,15 @@ void PDMClass::IrqHandler(bool halftranfer) extern "C" { void PDMIrqHandler(bool halftranfer) { - PDM.IrqHandler(halftranfer); + _instance->IrqHandler(halftranfer); } void PDMsetBufferSize(int size) { - PDM.setBufferSize(size); + _instance->setBufferSize(size); } size_t PDMgetBufferSize() { - return PDM.getBufferSize(); + return _instance.getBufferSize(); } } From a1b7130e790c4d3350ece6b43bb5305a5bee5f89 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 19 Apr 2021 18:08:08 +0200 Subject: [PATCH 4/5] Update _instance value when onReceive is called from user Sketch --- libraries/PDM/src/stm32/PDM.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index 70a00fdef..bfaca92df 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -105,6 +105,9 @@ int PDMClass::read(void* buffer, size_t size) void PDMClass::onReceive(void(*function)(void)) { _onReceive = function; + if(_instance != this) { + _instance = this; + } } void PDMClass::setGain(int gain) From 6ef24acf8a3222750a6f3d1d863368ac4a629898 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 20 Apr 2021 08:51:19 +0200 Subject: [PATCH 5/5] Check _instance when begin is called and return error if is not matching --- libraries/PDM/src/stm32/PDM.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index bfaca92df..241da2840 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -66,6 +66,10 @@ int PDMClass::begin(int channels, int sampleRate) { i2c.write(8 << 1, data, sizeof(data)); } + if(_instance != this) { + return 0; + } + _channels = channels; _samplerate = sampleRate;