@@ -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
@@ -79,6 +81,10 @@ int PDMClass::begin(int channels, long sampleRate)
7981 filter.In_MicChannels = 1 ;
8082 filter.Out_MicChannels = 1 ;
8183 filter.Decimation = decimation;
84+ if (_gain == -1 ) {
85+ _gain = FILTER_GAIN;
86+ }
87+ filter.filterGain = _gain;
8288 Open_PDM_Filter_Init (&filter);
8389
8490 // Configure PIO state machine
@@ -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)
0 commit comments