@@ -32,8 +32,6 @@ int16_t* volatile finalBuffer;
3232// OpenPDM filter used to convert PDM into PCM
3333#define FILTER_GAIN 16
3434TPDMFilter_InitStruct filter;
35- uint16_t filterGain = FILTER_GAIN;
36-
3735
3836extern " C" {
3937 __attribute__ ((__used__)) void dmaHandler(void )
@@ -47,15 +45,19 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
4745 _dinPin(dinPin),
4846 _clkPin(clkPin),
4947 _pwrPin(pwrPin),
50- _onReceive(NULL )
48+ _onReceive(NULL ),
49+ _gain(-1 ),
50+ _channels(-1 ),
51+ _samplerate(-1 ),
52+ _init(-1 )
5153{
5254}
5355
5456PDMClass::~PDMClass ()
5557{
5658}
5759
58- int PDMClass::begin (int channels, long sampleRate)
60+ int PDMClass::begin (int channels, int sampleRate)
5961{
6062 // _channels = channels; // only one channel available
6163
@@ -71,15 +73,19 @@ int PDMClass::begin(int channels, long sampleRate)
7173 rawBufferLength = finalBufferLength;
7274 }
7375
74- /* Initialize Open PDM library */
75- filter.Fs = sampleRate;
76- filter.nSamples = rawBufferLength;
77- filter.LP_HZ = sampleRate/2 ;
78- filter.HP_HZ = 10 ;
79- filter.In_MicChannels = 1 ;
80- filter.Out_MicChannels = 1 ;
81- filter.Decimation = decimation;
82- Open_PDM_Filter_Init (&filter);
76+ /* Initialize Open PDM library */
77+ filter.Fs = sampleRate;
78+ filter.nSamples = rawBufferLength;
79+ filter.LP_HZ = sampleRate/2 ;
80+ filter.HP_HZ = 10 ;
81+ filter.In_MicChannels = 1 ;
82+ filter.Out_MicChannels = 1 ;
83+ filter.Decimation = decimation;
84+ if (_gain == -1 ) {
85+ _gain = FILTER_GAIN;
86+ }
87+ filter.filterGain = _gain;
88+ Open_PDM_Filter_Init (&filter);
8389
8490 // Configure PIO state machine
8591 float clkDiv = (float )clock_get_hz (clk_sys) / sampleRate / decimation / 2 ;
@@ -110,6 +116,8 @@ int PDMClass::begin(int channels, long sampleRate)
110116 true // Start immediately
111117 );
112118
119+ _init = 1 ;
120+
113121 return 1 ;
114122}
115123
@@ -142,7 +150,11 @@ void PDMClass::onReceive(void(*function)(void))
142150
143151void PDMClass::setGain (int gain)
144152{
145- filterGain = gain;
153+ _gain = gain;
154+ if (_init == 1 ) {
155+ filter.filterGain = _gain;
156+ Open_PDM_Filter_Init (&filter);
157+ }
146158}
147159
148160void PDMClass::setBufferSize (int bufferSize)
@@ -185,4 +197,4 @@ void PDMClass::IrqHandler(bool halftranfer)
185197
186198PDMClass PDM (PIN_PDM_DIN, PIN_PDM_CLK, -1 );
187199
188- #endif
200+ #endif
0 commit comments