/** * @brief Play audio stream * @param frequency: Audio frequency used to play the audio stream. * @retval Audio state. */ AUDIO_RECORDER_ErrorTypdef AUDIO_RECORDER_StartRec(uint32_t frequency) { uint32_t byteswritten = 0; /* Initialize header file */ WavProcess_EncInit(DEFAULT_AUDIO_IN_FREQ, pHeaderBuff); /* Write header file */ if(f_write(&wav_file, pHeaderBuff, 44, (void*)&byteswritten) == FR_OK) { if(byteswritten != 0) { BSP_AUDIO_IN_Init(INPUT_DEVICE_DIGITAL_MICROPHONE_2, haudio.in.volume, DEFAULT_AUDIO_IN_FREQ); BSP_AUDIO_IN_Record((uint16_t*)&haudio.buff[0], AUDIO_IN_BUFFER_SIZE/2); if(haudio.in.state == AUDIO_RECORDER_SUSPENDED) { osThreadResume(AudioThreadId); } haudio.in.state = AUDIO_RECORDER_RECORDING; haudio.in.fptr = byteswritten; return AUDIO_RECORDER_ERROR_NONE; } } return AUDIO_RECORDER_ERROR_IO; }
/** * @brief Play audio stream * @param frequency: Audio frequency used to play the audio stream. * @retval Audio state. */ AUDIO_RECORDER_ErrorTypdef AUDIO_RECORDER_StartRec(uint32_t frequency) { uint32_t byteswritten = 0; /* Initialize header file */ WavProcess_EncInit(DEFAULT_AUDIO_IN_FREQ, pHeaderBuff); haudio.ppcm = 0; /* Write header file */ if(f_write(&wav_file, pHeaderBuff, 44, (void*)&byteswritten) == FR_OK) { if(byteswritten != 0) { BSP_AUDIO_IN_Init(DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR); BSP_AUDIO_IN_Record((uint16_t*)&haudio.pdm[0], AUDIO_IN_PDM_BUFFER_SIZE); if(haudio.in.state == AUDIO_RECORDER_SUSPENDED) { osThreadResume(AudioThreadId); } haudio.in.state = AUDIO_RECORDER_RECORDING; haudio.in.fptr = byteswritten; return AUDIO_RECORDER_ERROR_NONE; } } return AUDIO_RECORDER_ERROR_IO; }
/** * @brief Starts Audio streaming. * @param None * @retval Audio error */ AUDIO_ErrorTypeDef AUDIO_REC_Start(void) { uint32_t byteswritten = 0; uint8_t str[FILEMGR_FILE_NAME_SIZE + 20]; uwVolume = 100; /* Create a new file system */ if(f_open(&WavFile, REC_WAVE_NAME, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) { /* Initialize header file */ WavProcess_EncInit(DEFAULT_AUDIO_IN_FREQ, pHeaderBuff); /* Write header file */ if(f_write(&WavFile, pHeaderBuff, 44, (void*)&byteswritten) == FR_OK) { AudioState = AUDIO_STATE_PRERECORD; BSP_LCD_SetTextColor(LCD_COLOR_WHITE); sprintf((char *)str, "Recording file: %s", (char *)REC_WAVE_NAME); BSP_LCD_ClearStringLine(4); BSP_LCD_DisplayStringAtLine(4, str); BSP_LCD_SetTextColor(LCD_COLOR_CYAN); sprintf((char *)str, "Sample rate : %d Hz", (int)DEFAULT_AUDIO_IN_FREQ); BSP_LCD_ClearStringLine(6); BSP_LCD_DisplayStringAtLine(6, str); sprintf((char *)str, "Channels number : %d", (int)DEFAULT_AUDIO_IN_CHANNEL_NBR); BSP_LCD_ClearStringLine(7); BSP_LCD_DisplayStringAtLine(7, str); sprintf((char *)str, "Volume : %d ", (int)uwVolume); BSP_LCD_ClearStringLine(7); BSP_LCD_DisplayStringAtLine(7, str); sprintf((char *)str, "File Size :"); BSP_LCD_ClearStringLine(8); BSP_LCD_DisplayStringAtLine(8, str); AUDIO_REC_DisplayButtons(); BSP_LCD_DisplayStringAt(250, LINE(14), (uint8_t *)" [RECORD]", LEFT_MODE); { if(byteswritten != 0) { BSP_AUDIO_IN_Init(DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR); BSP_AUDIO_IN_Record((uint16_t*)&BufferCtl.pdm_buff[0], AUDIO_IN_PDM_BUFFER_SIZE); BufferCtl.fptr = byteswritten; BufferCtl.pcm_ptr = 0; BufferCtl.offset = 0; BufferCtl.wr_state = BUFFER_EMPTY; return AUDIO_ERROR_NONE; } } } } return AUDIO_ERROR_IO; }
/** * @brief Update the recorded data. * @param None * @retval None */ void WaveRecorderProcess(void) { /* Current size of the recorded buffer */ uint32_t byteswritten = 0; WaveCounter = 0; LEDsState = LEDS_OFF; /* Remove Wave file if it exists on USB Flash Disk */ f_unlink(REC_WAVE_NAME); /* Open the file to write on it */ if((AppliState == APPLICATION_IDLE) || (f_open(&WavFile, REC_WAVE_NAME, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)) { while(1) { /* Toggle LED5 in infinite loop to signal that: USB Flash Disk is not connected/removed or an issue has occurred when creating/opening Wave file */ BSP_LED_Toggle(LED5); } } else { WaveRecStatus = 1; } /* Initialize header file */ WavProcess_EncInit(DEFAULT_AUDIO_IN_FREQ, pHeaderBuff); /* Write the header Wave */ f_write(&WavFile, pHeaderBuff, 44, (void *)&byteswritten); /* Increment the Wave counter */ BufferCtl.fptr = byteswritten; BufferCtl.offset = BUFFER_OFFSET_NONE; BSP_AUDIO_IN_Init(DEFAULT_AUDIO_IN_FREQ, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR); BSP_AUDIO_IN_Record((uint16_t*)&InternalBuffer[0], INTERNAL_BUFF_SIZE); /* Reset the time recording base variable */ TimeRecBase = 0; ITCounter = 0; LEDsState = LED3_TOGGLE; while(AppliState != APPLICATION_IDLE) { /* Wait for the recording time */ if(TimeRecBase <= DEFAULT_TIME_REC) { /* Check if there are Data to write in Usb Key */ if(AUDIODataReady == 1) { /* write buffer in file */ res = f_write(&WavFile, (uint8_t*)(WrBuffer+AUDIOBuffOffset), WR_BUFFER_SIZE, (void*)&byteswritten); if(res != FR_OK) { Error_Handler(); } BufferCtl.fptr += byteswritten; AUDIODataReady = 0; } /* User button pressed */ if(CmdIndex != CMD_RECORD) { /* Stop Audio Recording */ WaveRecorderStop(); /* Switch Command Index to Play */ CmdIndex = CMD_PLAY; /* Toggoling LED6 to signal Play */ LEDsState = LED6_TOGGLE; break; } } else /* End of recording time DEFAULT_TIME_REC */ { /* Stop Audio Recording */ WaveRecorderStop(); /* Change Command Index to Stop */ CmdIndex = CMD_STOP; /* Toggoling LED4 to signal Stop */ LEDsState = LED4_TOGGLE; AUDIODataReady = 0; break; } } /* Update the data length in the header of the recorded Wave */ f_lseek(&WavFile, 0); /* Parse the wav file header and extract required information */ WavProcess_HeaderUpdate(pHeaderBuff, &WaveFormat); f_write(&WavFile, pHeaderBuff, 44, (void*)&byteswritten); /* Close file and unmount MyFilesystem */ f_close (&WavFile); f_mount(NULL, 0, 1); /* Change Command Index to Play */ CmdIndex = CMD_PLAY; }