//rawbuf full handler, appending data void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) == RESET) return; static int16_t buff[OUT_BUFSIZE] ; if(cbuffer.count + OUT_BUFSIZE > MAX_BUF_SIZE) while(1);//todo if(rawbuf_status == RAWBUF_UNDERRUN) { SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE); STM_EVAL_LEDOff(LED3); while(1); } uint16_t tail_length = MAX_BUF_SIZE-cbuffer.tail; if(tail_length < OUT_BUFSIZE) //complex case { if(rawbuf_status == RAWBUF_FULL1) { PDM_Filter_64_LSB((uint8_t *)raw_buffer1, (uint16_t*)buff, VOLUME, &pdm); rawbuf_status &= ~RAWBUF_FULL1; } else if(rawbuf_status == RAWBUF_FULL2) { PDM_Filter_64_LSB((uint8_t *)raw_buffer2, (uint16_t*)buff, VOLUME, &pdm); rawbuf_status &= ~RAWBUF_FULL2; }//underrun ???? memcpy(buff, cbuffer.data+cbuffer.tail, sizeof(uint16_t)*tail_length); memcpy(buff+tail_length, cbuffer.data, sizeof(uint16_t)*(OUT_BUFSIZE-tail_length)); cbuffer.tail = OUT_BUFSIZE-tail_length; cbuffer.count += OUT_BUFSIZE; #ifdef DEBUG if(cbuffer.count > debug_countmax) debug_countmax = cbuffer.count; #endif } else { if(rawbuf_status == RAWBUF_FULL1) { PDM_Filter_64_LSB((uint8_t *)raw_buffer1, (uint16_t*)(cbuffer.data+cbuffer.tail), VOLUME, &pdm); rawbuf_status &= ~RAWBUF_FULL1; } else if(rawbuf_status == RAWBUF_FULL2) { PDM_Filter_64_LSB((uint8_t *)raw_buffer2, (uint16_t*)(cbuffer.data+cbuffer.tail), VOLUME, &pdm); rawbuf_status &= ~RAWBUF_FULL2; }//underrun ???? cbuffer.tail += OUT_BUFSIZE; cbuffer.count += OUT_BUFSIZE; EXTI_ClearITPendingBit(EXTI_Line0); } }
/** * @brief Converts audio format from PDM to PCM. * @param PDMBuf: Pointer to data PDM buffer * @param PCMBuf: Pointer to data PCM buffer * @retval AUDIO_OK if correct communication, else wrong communication */ uint8_t BSP_AUDIO_IN_PDMToPCM(uint16_t *PDMBuf, uint16_t *PCMBuf) { uint16_t AppPDM[INTERNAL_BUFF_SIZE/2]; uint32_t index = 0; /* PDM Demux */ for(index = 0; index<INTERNAL_BUFF_SIZE/2; index++) { AppPDM[index] = HTONS(PDMBuf[index]); } for(index = 0; index < DEFAULT_AUDIO_IN_CHANNEL_NBR; index++) { /* PDM to PCM filter */ PDM_Filter_64_LSB((uint8_t*)&AppPDM[index], (uint16_t*)&(PCMBuf[index]), AudioInVolume , (PDMFilter_InitStruct *)&Filter[index]); } /* Duplicate samples since a single microphone in mounted on STM32F4-Discovery */ for(index = 0; index < PCM_OUT_SIZE; index++) { PCMBuf[(index<<1)+1] = PCMBuf[index<<1]; } /* Return AUDIO_OK when all operations are correctly done */ return AUDIO_OK; }
void SPI2_IRQHandler(void) { u16 volume; u16 app; /* Check if data are available in SPI Data register */ if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET) { app = SPI_I2S_ReceiveData(SPI2); InternalBuffer[InternalBufferSize++] = HTONS(app); /* Check to prevent overflow condition */ if (InternalBufferSize >= INTERNAL_BUFF_SIZE) { InternalBufferSize = 0; volume = 50; PDM_Filter_64_LSB((uint8_t *)InternalBuffer, (uint16_t *)pAudioRecBuf, volume , (PDMFilter_InitStruct *)&Filter); if(sample_collected_fp != NULL) sample_collected_fp((int16_t*)pAudioRecBuf); } } }
void SPI2_IRQHandler(void){ extern PDMFilter_InitStruct Filter; extern uint16_t* AudioRecBuf; extern uint16_t* WriteBuf; extern uint16_t PDM_Input_Buffer[]; extern uint16_t PCM_Output_Buffer[]; u16 volume; u16 app; // Check if new data are available in SPI data register if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET){ // Read received data and save it in internal table app = SPI_I2S_ReceiveData(SPI2); // PDM_Input_Buffer[InternalBufferSize++] = (uint8_t)app; PDM_Input_Buffer[InternalBufferSize++] = /*(uint8_t)*/HTONS(app); counter++; // Check to prevent overflow condition if (InternalBufferSize >= PDM_Input_Buffer_SIZE){ InternalBufferSize = 0; volume = 50; PDM_Filter_64_LSB((uint8_t *)PDM_Input_Buffer, (uint16_t *)AudioRecBuf/*PCM_Output_Buffer*/, volume, &Filter); Data_Status = 1; } } }
/** * @brief This function Resumes the audio file stream. * @param PDMBuf: Pointer to data PDM buffer * @param PCMBuf: Pointer to data PCM buffer * @retval AUDIO_OK if correct communication, else wrong communication */ uint8_t BSP_AUDIO_IN_PDMToPCM(uint16_t* PDMBuf, uint16_t* PCMBuf) { uint16_t AppPDM[INTERNAL_BUFF_SIZE/2]; uint32_t index = 0; /* PDM Demux */ for(index = 0; index<INTERNAL_BUFF_SIZE/2; index++) { AppPDM[index] = HTONS(PDMBuf[index]); } for(index = 0; index < DEFAULT_AUDIO_IN_CHANNEL_NBR; index++) { /* PDM to PCM filter */ PDM_Filter_64_LSB((uint8_t*)&AppPDM[index], (uint16_t*)&(PCMBuf[index]), AudioInVolume , (PDMFilter_InitStruct *)&Filter[index]); } return AUDIO_OK; }
void AUDIO_MIC_SPI_IRQHANDLER(void) { u16 app; /* Check if data are available in SPI Data register */ if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET) { /* actually, we receiving 64kSamples/s due we dont care about left/right channel. */ app = SPI_I2S_ReceiveData(SPI2); #ifdef USE_ST_FILTER InternalBuffer[InternalBufferSize++] = HTONS(app); InternalBufferSize++; /* Check to prevent overflow condition */ if (InternalBufferSize >= INTERNAL_BUFF_SIZE) { InternalBufferSize = 0; //got 64 samples of 16bit => 16 samples of output PDM_Filter_64_LSB((uint8_t *) InternalBuffer, (uint16_t *) &pAudioRecBuf_8Khz[PCM_OUT_SIZE*recBuffFillness], 10, (PDMFilter_InitStruct *)&Filter); recBuffFillness++; if(recBuffFillness >= REC_BUFFERS) { Data_Status = 1; recBuffFillness=0; } } #else //pdm_fir_flt_put(&Filter2, HTONS(app)); pdm_fir_flt_put(&Filter2, app); InternalBufferSize++; /* Check to prevent overflow condition */ if (InternalBufferSize >= INTERNAL_BUFF_SIZE) { InternalBufferSize = 0; pAudioRecBuf_8Khz[recBuffFillness] = pdm_fir_flt_get(&Filter2, 16); recBuffFillness++; if(recBuffFillness >= REC_BUFFERS * PCM_OUT_SIZE) { Data_Status = 1; recBuffFillness=0; } } #endif } }