diff --git a/libraries/PDM/src/PDM.h b/libraries/PDM/src/PDM.h index 77c99d8ca..be497ae16 100644 --- a/libraries/PDM/src/PDM.h +++ b/libraries/PDM/src/PDM.h @@ -58,6 +58,8 @@ class PDMClass int _gain; int _init; + int _cutSamples; + PDMDoubleBuffer _doubleBuffer; void (*_onReceive)(void); diff --git a/libraries/PDM/src/nrf52/PDM.cpp b/libraries/PDM/src/nrf52/PDM.cpp index 57de67e0c..d8cb00bef 100644 --- a/libraries/PDM/src/nrf52/PDM.cpp +++ b/libraries/PDM/src/nrf52/PDM.cpp @@ -43,7 +43,8 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : _gain(-1), _channels(-1), _samplerate(-1), - _init(-1) + _init(-1), + _cutSamples(0) { } diff --git a/libraries/PDM/src/rp2040/PDM.cpp b/libraries/PDM/src/rp2040/PDM.cpp index aa1b2b347..952df8bc1 100644 --- a/libraries/PDM/src/rp2040/PDM.cpp +++ b/libraries/PDM/src/rp2040/PDM.cpp @@ -53,7 +53,8 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : _gain(-1), _channels(-1), _samplerate(-1), - _init(-1) + _init(-1), + _cutSamples(100) { } @@ -138,6 +139,8 @@ int PDMClass::begin(int channels, int sampleRate) true // Start immediately ); + _cutSamples = 100; + _init = 1; return 1; @@ -190,8 +193,6 @@ void PDMClass::setBufferSize(int bufferSize) void PDMClass::IrqHandler(bool halftranfer) { - static int cutSamples = 100; - // Clear the interrupt request. dma_hw->ints0 = 1u << dmaChannel; // Restart dma pointing to the other buffer @@ -210,9 +211,9 @@ void PDMClass::IrqHandler(bool halftranfer) Open_PDM_Filter_64(rawBuffer[rawBufferIndex], finalBuffer, 1, &filter); } - if (cutSamples) { - memset(finalBuffer, 0, cutSamples); - cutSamples = 0; + if (_cutSamples) { + memset(finalBuffer, 0, _cutSamples); + _cutSamples = 0; } // swap final buffer and raw buffers' indexes diff --git a/libraries/PDM/src/stm32/PDM.cpp b/libraries/PDM/src/stm32/PDM.cpp index de335ea5e..749aac4d4 100644 --- a/libraries/PDM/src/stm32/PDM.cpp +++ b/libraries/PDM/src/stm32/PDM.cpp @@ -39,7 +39,8 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : _gain(-1), _channels(-1), _samplerate(-1), - _init(-1) + _init(-1), + _cutSamples(4) { _instance = this; } @@ -80,6 +81,8 @@ int PDMClass::begin(int channels, int sampleRate) { g_pcmbuf = (uint16_t*)_doubleBuffer.data(); _doubleBuffer.swap(0); + _cutSamples = 4 * channels; + if(py_audio_init(channels, sampleRate, _gain, 0.9883f)) { py_audio_start_streaming(); _init = 1; @@ -146,8 +149,12 @@ void PDMClass::IrqHandler(bool halftranfer) _doubleBuffer.swap(g_pcmbuf_size); g_pcmbuf = (uint16_t*)_doubleBuffer.data(); g_pcmbuf_size = 0; - if (_onReceive) { - _onReceive(); + if(_cutSamples == 0) { + if (_onReceive) { + _onReceive(); + } + } else { + _cutSamples--; } } }