@@ -22,7 +22,8 @@ static DMA_HandleTypeDef hdma_sai_rx;
22
22
23
23
volatile uint16_t * g_pcmbuf = NULL ;
24
24
25
- static int g_channels = AUDIO_SAI_NBR_CHANNELS ;
25
+ static int g_i_channels = AUDIO_SAI_NBR_CHANNELS ;
26
+ static int g_o_channels = AUDIO_SAI_NBR_CHANNELS ;
26
27
static PDM_Filter_Handler_t PDM_FilterHandler [2 ];
27
28
static PDM_Filter_Config_t PDM_FilterConfig [2 ];
28
29
@@ -133,7 +134,7 @@ void sai_init()
133
134
HAL_GPIO_Init (AUDIO_SAI_D1_PORT , & GPIO_InitStruct );
134
135
}
135
136
136
- int py_audio_init (size_t g_channels , uint32_t frequency , int gain_db , float highpass )
137
+ int py_audio_init (size_t channels , uint32_t frequency , int gain_db , float highpass )
137
138
{
138
139
139
140
RCC_PeriphCLKInitTypeDef rcc_ex_clk_init_struct ;
@@ -166,21 +167,23 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
166
167
return 0 ;
167
168
}
168
169
169
- if (g_channels != 1 && g_channels != 2 ) {
170
+ if (channels != 1 && channels != 2 ) {
170
171
return 0 ;
172
+ } else {
173
+ g_o_channels = channels ;
171
174
}
172
175
173
176
uint32_t decimation_factor = 64 ; // Fixed decimation factor
174
177
uint32_t decimation_factor_const = get_decimation_factor (decimation_factor );
175
178
if (decimation_factor_const == 0 ) {
176
179
return 0 ;
177
180
}
178
- uint32_t samples_per_channel = (PDM_BUFFER_SIZE * 8 ) / (decimation_factor * g_channels * 2 ); // Half a transfer
181
+ uint32_t samples_per_channel = (PDM_BUFFER_SIZE * 8 ) / (decimation_factor * g_i_channels * 2 ); // Half a transfer
179
182
180
183
hsai .Instance = AUDIO_SAI ;
181
184
hsai .Init .Protocol = SAI_FREE_PROTOCOL ;
182
185
hsai .Init .AudioMode = SAI_MODEMASTER_RX ;
183
- hsai .Init .DataSize = (g_channels == 1 ) ? SAI_DATASIZE_8 : SAI_DATASIZE_16 ;
186
+ hsai .Init .DataSize = (g_i_channels == 1 ) ? SAI_DATASIZE_8 : SAI_DATASIZE_16 ;
184
187
hsai .Init .FirstBit = SAI_FIRSTBIT_LSB ;
185
188
hsai .Init .ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE ;
186
189
hsai .Init .Synchro = SAI_ASYNCHRONOUS ;
@@ -189,7 +192,7 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
189
192
hsai .Init .FIFOThreshold = SAI_FIFOTHRESHOLD_1QF ;
190
193
hsai .Init .SynchroExt = SAI_SYNCEXT_DISABLE ;
191
194
hsai .Init .AudioFrequency = SAI_AUDIO_FREQUENCY_MCKDIV ;
192
- hsai .Init .MonoStereoMode = (g_channels == 1 ) ? SAI_MONOMODE : SAI_STEREOMODE ;
195
+ hsai .Init .MonoStereoMode = (g_i_channels == 1 ) ? SAI_MONOMODE : SAI_STEREOMODE ;
193
196
hsai .Init .CompandingMode = SAI_NOCOMPANDING ;
194
197
hsai .Init .TriState = SAI_OUTPUT_RELEASED ;
195
198
@@ -212,8 +215,8 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
212
215
213
216
hsai .SlotInit .FirstBitOffset = 0 ;
214
217
hsai .SlotInit .SlotSize = SAI_SLOTSIZE_DATASIZE ;
215
- hsai .SlotInit .SlotNumber = (g_channels == 1 ) ? 2 : 1 ;
216
- hsai .SlotInit .SlotActive = (g_channels == 1 ) ? (SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1 ) : SAI_SLOTACTIVE_0 ;
218
+ hsai .SlotInit .SlotNumber = (g_i_channels == 1 ) ? 2 : 1 ;
219
+ hsai .SlotInit .SlotActive = (g_i_channels == 1 ) ? (SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1 ) : SAI_SLOTACTIVE_0 ;
217
220
218
221
// Initialize the SAI
219
222
HAL_SAI_DeInit (& hsai );
@@ -230,8 +233,8 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
230
233
hdma_sai_rx .Init .Direction = DMA_PERIPH_TO_MEMORY ;
231
234
hdma_sai_rx .Init .PeriphInc = DMA_PINC_DISABLE ;
232
235
hdma_sai_rx .Init .MemInc = DMA_MINC_ENABLE ;
233
- hdma_sai_rx .Init .PeriphDataAlignment = (g_channels == 1 ) ? DMA_PDATAALIGN_BYTE : DMA_PDATAALIGN_HALFWORD ;
234
- hdma_sai_rx .Init .MemDataAlignment = (g_channels == 1 ) ? DMA_MDATAALIGN_BYTE : DMA_MDATAALIGN_HALFWORD ;
236
+ hdma_sai_rx .Init .PeriphDataAlignment = (g_i_channels == 1 ) ? DMA_PDATAALIGN_BYTE : DMA_PDATAALIGN_HALFWORD ;
237
+ hdma_sai_rx .Init .MemDataAlignment = (g_i_channels == 1 ) ? DMA_MDATAALIGN_BYTE : DMA_MDATAALIGN_HALFWORD ;
235
238
hdma_sai_rx .Init .Mode = DMA_CIRCULAR ;
236
239
hdma_sai_rx .Init .Priority = DMA_PRIORITY_HIGH ;
237
240
hdma_sai_rx .Init .FIFOMode = DMA_FIFOMODE_ENABLE ;
@@ -263,12 +266,12 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
263
266
__HAL_CRC_DR_RESET (& hcrc );
264
267
265
268
// Configure PDM filters
266
- for (int i = 0 ; i < g_channels ; i ++ ) {
269
+ for (int i = 0 ; i < g_i_channels ; i ++ ) {
267
270
PDM_FilterHandler [i ].bit_order = PDM_FILTER_BIT_ORDER_MSB ;
268
271
PDM_FilterHandler [i ].endianness = PDM_FILTER_ENDIANNESS_LE ;
269
272
PDM_FilterHandler [i ].high_pass_tap = (uint32_t ) (highpass * 2147483647U ); // coff * (2^31-1)
270
- PDM_FilterHandler [i ].out_ptr_channels = g_channels ;
271
- PDM_FilterHandler [i ].in_ptr_channels = g_channels ;
273
+ PDM_FilterHandler [i ].out_ptr_channels = g_o_channels ;
274
+ PDM_FilterHandler [i ].in_ptr_channels = g_i_channels ;
272
275
PDM_Filter_Init (& PDM_FilterHandler [i ]);
273
276
274
277
PDM_FilterConfig [i ].mic_gain = gain_db ;
@@ -277,7 +280,7 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
277
280
PDM_Filter_setConfig (& PDM_FilterHandler [i ], & PDM_FilterConfig [i ]);
278
281
}
279
282
280
- PDMsetBufferSize (samples_per_channel * g_channels * sizeof (int16_t ));
283
+ PDMsetBufferSize (samples_per_channel * g_o_channels * sizeof (int16_t ));
281
284
//g_pcmbuf = malloc(samples_per_channel * g_channels * sizeof(int16_t));
282
285
283
286
return 1 ;
@@ -303,7 +306,8 @@ void py_audio_deinit()
303
306
hdma_sai_rx .Instance = NULL ;
304
307
}
305
308
306
- g_channels = 0 ;
309
+ g_i_channels = 0 ;
310
+ g_o_channels = 0 ;
307
311
//free(g_pcmbuf);
308
312
g_pcmbuf = NULL ;
309
313
}
@@ -316,15 +320,15 @@ void audio_pendsv_callback(void)
316
320
xfer_status &= ~(DMA_XFER_HALF );
317
321
318
322
// Convert PDM samples to PCM.
319
- for (int i = 0 ; i < g_channels ; i ++ ) {
323
+ for (int i = 0 ; i < g_i_channels ; i ++ ) {
320
324
PDM_Filter (& ((uint8_t * )PDM_BUFFER )[i ], & ((int16_t * )g_pcmbuf )[i ], & PDM_FilterHandler [i ]);
321
325
}
322
326
} else if ((xfer_status & DMA_XFER_FULL )) { // Check for transfer complete.
323
327
// Clear buffer state.
324
328
xfer_status &= ~(DMA_XFER_FULL );
325
329
326
330
// Convert PDM samples to PCM.
327
- for (int i = 0 ; i < g_channels ; i ++ ) {
331
+ for (int i = 0 ; i < g_i_channels ; i ++ ) {
328
332
PDM_Filter (& ((uint8_t * )PDM_BUFFER )[PDM_BUFFER_SIZE / 2 + i ], & ((int16_t * )g_pcmbuf )[i ], & PDM_FilterHandler [i ]);
329
333
}
330
334
}
@@ -336,7 +340,7 @@ void py_audio_start_streaming()
336
340
xfer_status &= DMA_XFER_NONE ;
337
341
338
342
// Start DMA transfer
339
- if (HAL_SAI_Receive_DMA (& hsai , (uint8_t * ) PDM_BUFFER , PDM_BUFFER_SIZE / g_channels ) != HAL_OK ) {
343
+ if (HAL_SAI_Receive_DMA (& hsai , (uint8_t * ) PDM_BUFFER , PDM_BUFFER_SIZE / g_i_channels ) != HAL_OK ) {
340
344
341
345
}
342
346
}
@@ -347,4 +351,4 @@ void py_audio_stop_streaming()
347
351
HAL_SAI_DMAStop (& hsai );
348
352
}
349
353
350
- #endif
354
+ #endif
0 commit comments