Skip to content

Commit a216699

Browse files
committed
Split input and output channels number
1 parent 87c15a3 commit a216699

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

libraries/PDM/src/stm32/audio.c

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ static DMA_HandleTypeDef hdma_sai_rx;
2222

2323
volatile uint16_t *g_pcmbuf = NULL;
2424

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;
2627
static PDM_Filter_Handler_t PDM_FilterHandler[2];
2728
static PDM_Filter_Config_t PDM_FilterConfig[2];
2829

@@ -133,7 +134,7 @@ void sai_init()
133134
HAL_GPIO_Init(AUDIO_SAI_D1_PORT, &GPIO_InitStruct);
134135
}
135136

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)
137138
{
138139

139140
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
166167
return 0;
167168
}
168169

169-
if (g_channels != 1 && g_channels != 2) {
170+
if (channels != 1 && channels != 2) {
170171
return 0;
172+
} else {
173+
g_o_channels = channels;
171174
}
172175

173176
uint32_t decimation_factor = 64; // Fixed decimation factor
174177
uint32_t decimation_factor_const = get_decimation_factor(decimation_factor);
175178
if (decimation_factor_const == 0) {
176179
return 0;
177180
}
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
179182

180183
hsai.Instance = AUDIO_SAI;
181184
hsai.Init.Protocol = SAI_FREE_PROTOCOL;
182185
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;
184187
hsai.Init.FirstBit = SAI_FIRSTBIT_LSB;
185188
hsai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
186189
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
189192
hsai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
190193
hsai.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
191194
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;
193196
hsai.Init.CompandingMode = SAI_NOCOMPANDING;
194197
hsai.Init.TriState = SAI_OUTPUT_RELEASED;
195198

@@ -212,8 +215,8 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
212215

213216
hsai.SlotInit.FirstBitOffset = 0;
214217
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;
217220

218221
// Initialize the SAI
219222
HAL_SAI_DeInit(&hsai);
@@ -230,8 +233,8 @@ int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float high
230233
hdma_sai_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
231234
hdma_sai_rx.Init.PeriphInc = DMA_PINC_DISABLE;
232235
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;
235238
hdma_sai_rx.Init.Mode = DMA_CIRCULAR;
236239
hdma_sai_rx.Init.Priority = DMA_PRIORITY_HIGH;
237240
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
263266
__HAL_CRC_DR_RESET(&hcrc);
264267

265268
// Configure PDM filters
266-
for (int i=0; i<g_channels; i++) {
269+
for (int i=0; i<g_i_channels; i++) {
267270
PDM_FilterHandler[i].bit_order = PDM_FILTER_BIT_ORDER_MSB;
268271
PDM_FilterHandler[i].endianness = PDM_FILTER_ENDIANNESS_LE;
269272
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;
272275
PDM_Filter_Init(&PDM_FilterHandler[i]);
273276

274277
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
277280
PDM_Filter_setConfig(&PDM_FilterHandler[i], &PDM_FilterConfig[i]);
278281
}
279282

280-
PDMsetBufferSize(samples_per_channel * g_channels * sizeof(int16_t));
283+
PDMsetBufferSize(samples_per_channel * g_o_channels * sizeof(int16_t));
281284
//g_pcmbuf = malloc(samples_per_channel * g_channels * sizeof(int16_t));
282285

283286
return 1;
@@ -303,7 +306,8 @@ void py_audio_deinit()
303306
hdma_sai_rx.Instance = NULL;
304307
}
305308

306-
g_channels = 0;
309+
g_i_channels = 0;
310+
g_o_channels = 0;
307311
//free(g_pcmbuf);
308312
g_pcmbuf = NULL;
309313
}
@@ -316,15 +320,15 @@ void audio_pendsv_callback(void)
316320
xfer_status &= ~(DMA_XFER_HALF);
317321

318322
// Convert PDM samples to PCM.
319-
for (int i=0; i<g_channels; i++) {
323+
for (int i=0; i<g_i_channels; i++) {
320324
PDM_Filter(&((uint8_t*)PDM_BUFFER)[i], &((int16_t*)g_pcmbuf)[i], &PDM_FilterHandler[i]);
321325
}
322326
} else if ((xfer_status & DMA_XFER_FULL)) { // Check for transfer complete.
323327
// Clear buffer state.
324328
xfer_status &= ~(DMA_XFER_FULL);
325329

326330
// Convert PDM samples to PCM.
327-
for (int i=0; i<g_channels; i++) {
331+
for (int i=0; i<g_i_channels; i++) {
328332
PDM_Filter(&((uint8_t*)PDM_BUFFER)[PDM_BUFFER_SIZE / 2 + i], &((int16_t*)g_pcmbuf)[i], &PDM_FilterHandler[i]);
329333
}
330334
}
@@ -336,7 +340,7 @@ void py_audio_start_streaming()
336340
xfer_status &= DMA_XFER_NONE;
337341

338342
// 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) {
340344

341345
}
342346
}
@@ -347,4 +351,4 @@ void py_audio_stop_streaming()
347351
HAL_SAI_DMAStop(&hsai);
348352
}
349353

350-
#endif
354+
#endif

0 commit comments

Comments
 (0)