Skip to content

Commit 1082779

Browse files
authoredApr 20, 2021
Merge pull request #198 from pennam/pdm_buffer
PDM.setBufferSize()
2 parents 0569965 + 3810682 commit 1082779

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed
 

‎libraries/PDM/src/PDM.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class PDMClass
4242
//NANO 33 BLE SENSe min 0 max 80
4343
void setGain(int gain);
4444
void setBufferSize(int bufferSize);
45+
size_t getBufferSize();
4546

4647
// private:
4748
void IrqHandler(bool halftranfer);

‎libraries/PDM/src/stm32/PDM.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ int PDMClass::begin(int channels, int sampleRate) {
7070
_gain = 24;
7171
}
7272

73-
if(py_audio_init(channels, sampleRate, _gain, 0.9883f)) {
73+
g_pcmbuf = (uint16_t*)_doubleBuffer.data();
74+
_doubleBuffer.swap(0);
75+
76+
if(py_audio_init(channels, sampleRate, gain_db, 0.9883f)) {
7477
py_audio_start_streaming();
7578
_init = 1;
7679
return 1;
@@ -114,16 +117,29 @@ void PDMClass::setBufferSize(int bufferSize)
114117
_doubleBuffer.setSize(bufferSize);
115118
}
116119

120+
size_t PDMClass::getBufferSize()
121+
{
122+
return _doubleBuffer.getSize();
123+
}
124+
125+
#define HALF_TRANSFER_SIZE (64*_channels)
126+
static int g_pcmbuf_size=0;
127+
117128
void PDMClass::IrqHandler(bool halftranfer)
118129
{
119-
if (_doubleBuffer.available() == 0) {
120-
g_pcmbuf = (uint16_t*)_doubleBuffer.data();
130+
if (g_pcmbuf_size < _doubleBuffer.getSize()) {
121131
audio_pendsv_callback();
122-
_doubleBuffer.swap(_doubleBuffer.availableForWrite());
123-
}
124-
125-
if (_onReceive) {
126-
_onReceive();
132+
g_pcmbuf += (HALF_TRANSFER_SIZE/2);
133+
g_pcmbuf_size += HALF_TRANSFER_SIZE;
134+
135+
if(g_pcmbuf_size == _doubleBuffer.getSize()) {
136+
_doubleBuffer.swap(g_pcmbuf_size);
137+
g_pcmbuf = (uint16_t*)_doubleBuffer.data();
138+
g_pcmbuf_size = 0;
139+
if (_onReceive) {
140+
_onReceive();
141+
}
142+
}
127143
}
128144
}
129145

@@ -136,6 +152,10 @@ void PDMIrqHandler(bool halftranfer)
136152
void PDMsetBufferSize(int size) {
137153
PDM.setBufferSize(size);
138154
}
155+
156+
size_t PDMgetBufferSize() {
157+
return PDM.getBufferSize();
158+
}
139159
}
140160

141161
PDMClass PDM(0, 0, 0);

‎libraries/PDM/src/stm32/audio.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,11 @@ int py_audio_init(size_t channels, uint32_t frequency, int gain_db, float highpa
303303
PDM_Filter_setConfig(&PDM_FilterHandler[i], &PDM_FilterConfig[i]);
304304
}
305305

306-
PDMsetBufferSize(samples_per_channel * g_o_channels * sizeof(int16_t));
307-
//g_pcmbuf = malloc(samples_per_channel * g_channels * sizeof(int16_t));
306+
uint32_t min_buff_size = samples_per_channel * g_o_channels * sizeof(int16_t);
307+
uint32_t buff_size = PDMgetBufferSize();
308+
if(buff_size < min_buff_size) {
309+
PDMsetBufferSize(min_buff_size);
310+
}
308311

309312
return 1;
310313
}

‎libraries/PDM/src/utility/PDMDoubleBuffer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ void PDMDoubleBuffer::setSize(int size)
3737
reset();
3838
}
3939

40+
size_t PDMDoubleBuffer::getSize()
41+
{
42+
return _size;
43+
}
44+
4045
void PDMDoubleBuffer::reset()
4146
{
4247
_buffer[0] = (uint8_t*)realloc(_buffer[0], _size);

‎libraries/PDM/src/utility/PDMDoubleBuffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class PDMDoubleBuffer
3131
virtual ~PDMDoubleBuffer();
3232

3333
void setSize(int size);
34+
size_t getSize();
3435

3536
void reset();
3637

0 commit comments

Comments
 (0)
Please sign in to comment.