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..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; @@ -114,16 +117,29 @@ 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(); + } + } } } @@ -136,6 +152,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();