diff --git a/libraries/PDM/src/PDM.h b/libraries/PDM/src/PDM.h index c73082250..77c99d8ca 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); @@ -58,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 69ce30b6b..241da2840 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) { @@ -63,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; @@ -70,7 +77,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; @@ -99,6 +109,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) @@ -114,27 +127,44 @@ void PDMClass::setBufferSize(int bufferSize) _doubleBuffer.setSize(bufferSize); } +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(); + } + } } } 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 _instance.getBufferSize(); } } 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();