/** * @brief Starts Audio streaming. * @param idx: File index * @retval Audio error */ AUDIO_ErrorTypeDef AUDIO_Start(uint8_t idx) { uint32_t bytesread; if(MTP_GetWavObjectNumber() > idx) { AUDIO_GetFileInfo(idx, &wav_info); BSP_AUDIO_OUT_SetFrequency(wav_info.SampleRate); buffer_ctl.offset = BUFFER_OFFSET_NONE; if(MTP_GetData(idx, 44, AUDIO_BUFFER_SIZE, &buffer_ctl.buff[0], &bytesread) == 0) { audio_state = AUDIO_STATE_PLAY; BSP_LCD_DisplayStringAt(250, LINE(14), (uint8_t *)" [PLAY ]", LEFT_MODE); { if(bytesread != 0) { BSP_AUDIO_OUT_Play((uint16_t*)&buffer_ctl.buff[0], AUDIO_BUFFER_SIZE); buffer_ctl.fptr = bytesread; return AUDIO_ERROR_NONE; } } } } return AUDIO_ERROR_IO; }
/** * @brief Play audio stream * @param frequency: Audio frequency used to play the audio stream. * @retval Audio state. */ AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Play(uint32_t frequency) { uint32_t numOfReadBytes; haudio.state = AUDIOPLAYER_PLAY; /* Fill whole buffer @ first time */ if(f_read(&wav_file, &haudio.buffer[0], AUDIO_BUFFER_SIZE, (void *)&numOfReadBytes) == FR_OK) { if(numOfReadBytes != 0) { BSP_AUDIO_OUT_SetFrequency(frequency); osThreadResume(AudioThreadId); BSP_AUDIO_OUT_Play((uint16_t*)&haudio.buffer[0], AUDIO_BUFFER_SIZE); return AUDIOPLAYER_ERROR_NONE; } } return AUDIOPLAYER_ERROR_IO; }
/** * @brief Audio Play demo * @param None * @retval None */ void AudioPlay_demo (void) { uint32_t *AudioFreq_ptr; uint8_t status = 0; uint8_t FreqStr[256] = {0}; AudioFreq_ptr = AudioFreq+6; /*AF_48K*/ uwPauseEnabledStatus = 1; /* 0 when audio is running, 1 when Pause is on */ uwVolume = 50; Audio_SetHint(); status = BSP_JOY_Init(JOY_MODE_GPIO); if (status != IO_OK) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 100, (uint8_t *)"ERROR", CENTER_MODE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 85, (uint8_t *)"Joystick cannot be initialized", CENTER_MODE); } if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, uwVolume, *AudioFreq_ptr) == 0) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 100, (uint8_t *)" AUDIO CODEC OK ", CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 100, (uint8_t *)" AUDIO CODEC FAIL ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 85, (uint8_t *)" Try to reset board ", CENTER_MODE); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (EVAL_AUDIO_TransferComplete_CallBack() or EVAL_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Start(); /* Display the state on the screen */ BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 85, (uint8_t *)" PLAYING... ", CENTER_MODE); sprintf((char*)FreqStr," VOL: %lu ",uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 55, (uint8_t *)FreqStr, CENTER_MODE); sprintf((char*)FreqStr," FREQ: %lu ",*AudioFreq_ptr); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 40, (uint8_t *)FreqStr, CENTER_MODE); /* IMPORTANT: AUDIO_Process() is called by the SysTick Handler, as it should be called within a periodic process */ /* Infinite loop */ while(1) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); /* Get the Joystick State */ JoyState = BSP_JOY_GetState(); switch(JoyState) { case JOY_UP: /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; sprintf((char*)FreqStr," VOL: %lu ",uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 55, (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(14), (uint8_t *)" ", CENTER_MODE); break; case JOY_DOWN: /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; sprintf((char*)FreqStr," VOL: %lu ",uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 55, (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(14), (uint8_t *)" ", CENTER_MODE); break; case JOY_LEFT: /*Decrease Frequency */ if (*AudioFreq_ptr != 8000) { AudioFreq_ptr--; sprintf((char*)FreqStr," FREQ: %lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); } BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 40, (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(14), (uint8_t *)" ", CENTER_MODE); break; case JOY_RIGHT: /* Increase Frequency */ if (*AudioFreq_ptr != 96000) { AudioFreq_ptr++; sprintf((char*)FreqStr," FREQ: %lu ",*AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); } BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 40, (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(14), (uint8_t *)" ", CENTER_MODE); break; case JOY_SEL: /* Set Pause / Resume */ if (uwPauseEnabledStatus == 1) { /* Pause is enabled, call Resume */ BSP_AUDIO_OUT_Resume(); uwPauseEnabledStatus = 0; BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 85, (uint8_t *)" PLAYING... ", CENTER_MODE); } else { /* Pause the playback */ BSP_AUDIO_OUT_Pause(); uwPauseEnabledStatus = 1; BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 85, (uint8_t *)" PAUSE ... ", CENTER_MODE); } BSP_LCD_DisplayStringAt(0, LINE(14), (uint8_t *)" ", CENTER_MODE); HAL_Delay(200); break; default: break; } /* Toggle LED3 */ BSP_LED_Toggle(LED3); /* Insert 100 ms delay */ HAL_Delay(100); /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 100 ms delay */ HAL_Delay(100); if(CheckForUserInput() > 0) { BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); BSP_AUDIO_OUT_DeInit(); return; } } }
/** * @brief Audio Play demo * @param None * @retval None */ void AudioPlay_demo (void) { uint32_t *AudioFreq_ptr; uint8_t FreqStr[256] = {0}; TS_StateTypeDef TS_State; AudioFreq_ptr = AudioFreq+6; /*AF_48K*/ uwPauseEnabledStatus = 1; /* 0 when audio is running, 1 when Pause is on */ uwVolume = 70; Audio_SetHint(); if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE, uwVolume, *AudioFreq_ptr) == 0) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 95, (uint8_t *)" AUDIO CODEC OK ", CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 95, (uint8_t *)" AUDIO CODEC FAIL ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 80, (uint8_t *)" Try to reset board ", CENTER_MODE); } if (BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()) != TS_OK) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR", CENTER_MODE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 50, (uint8_t *)"Touchscreen cannot be initialized", CENTER_MODE); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (DISCOVERY_AUDIO_TransferComplete_CallBack() or DISCOVERY_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Start(AUDIO_FILE_ADDRESS, AUDIO_FILE_SIZE); /* Display the state on the screen */ BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 80, (uint8_t *)" PLAYING... ", CENTER_MODE); sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)FreqStr, CENTER_MODE); sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 50, (uint8_t *)FreqStr, CENTER_MODE); BSP_AUDIO_OUT_SetVolume(70); BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); /* Infinite loop */ while (1) { /* Check in polling mode in touch screen the touch status and coordinates */ /* if touch occurred */ BSP_TS_GetState(&TS_State); if(TS_State.touchDetected == 1) { if (TS_State.touchY[0] < 30) { /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)FreqStr, CENTER_MODE); } else if (TS_State.touchY[0] > (BSP_LCD_GetYSize() - 30)) { /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)FreqStr, CENTER_MODE); } else if (TS_State.touchX[0] < 30) { /*Decrease Frequency */ if (*AudioFreq_ptr != 8000) { AudioFreq_ptr--; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 50, (uint8_t *)FreqStr, CENTER_MODE); } else if (TS_State.touchX[0] > (BSP_LCD_GetXSize() - 30)) { /* Increase Frequency */ if (*AudioFreq_ptr != 96000) { AudioFreq_ptr++; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 50, (uint8_t *)FreqStr, CENTER_MODE); } /* Wait for touch screen no touch detected */ do { BSP_TS_GetState(&TS_State); }while(TS_State.touchDetected > 0); } if (TS_State.touchDetected >= 2) { /* Set Pause / Resume */ if (uwPauseEnabledStatus == 1) { /* Pause is enabled, call Resume */ BSP_AUDIO_OUT_Resume(); uwPauseEnabledStatus = 0; BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 80, (uint8_t *)" PLAYING... ", CENTER_MODE); } else { /* Pause the playback */ BSP_AUDIO_OUT_Pause(); uwPauseEnabledStatus = 1; BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 80, (uint8_t *)" PAUSE ... ", CENTER_MODE); } /* Wait for touch screen no touch detected */ do { BSP_TS_GetState(&TS_State); }while(TS_State.touchDetected > 0); } if (CheckForUserInput() > 0) { BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); BSP_AUDIO_OUT_DeInit(); return; } } }
/** * @brief Audio Play demo * @param None * @retval None */ void AudioPlay_demo (void) { uint8_t ts_status = TS_OK; uint32_t *AudioFreq_ptr; AudioFreq_ptr = AudioFreq+6; /*AF_48K*/ uint8_t FreqStr[256] = {0}; Point Points2[] = {{100, 140}, {160, 180}, {100, 220}}; uwPauseEnabledStatus = 1; /* 0 when audio is running, 1 when Pause is on */ uwVolume = AUDIO_DEFAULT_VOLUME; if (TouchScreen_IsCalibrationDone() == 0) { ts_status = Touchscreen_Calibration(); if(ts_status == TS_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"Touchscreen calibration success.", CENTER_MODE); } else { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR : touchscreen not yet calibrated.", CENTER_MODE); ts_status = TS_ERROR; } } /* of if (TouchScreen_IsCalibrationDone() == 0) */ AudioPlay_SetHint(); BSP_LCD_SetFont(&Font20); /* if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_SPEAKER, uwVolume, *AudioFreq_ptr) == 0) if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, uwVolume, *AudioFreq_ptr) == 0)*/ if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, uwVolume, *AudioFreq_ptr) == 0) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)" AUDIO CODEC OK ", CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)" AUDIO CODEC FAIL ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(7), (uint8_t *)" Try to reset board ", CENTER_MODE); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (DISCOVERY_AUDIO_TransferComplete_CallBack() or DISCOVERY_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Play_Start((uint32_t *)AUDIO_SRC_FILE_ADDRESS, (uint32_t)AUDIO_FILE_SIZE); /* Display the state on the screen */ BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PLAYING... ", CENTER_MODE); sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_SetFont(&Font16); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 40, (uint8_t *)"Hear nothing ? Have you copied the audio file with STM-LINK UTILITY ?", CENTER_MODE); if(ts_status == TS_OK) { /* Set touchscreen in Interrupt mode and program EXTI accordingly on falling edge of TS_INT pin */ ts_status = BSP_TS_ITConfig(); BSP_TEST_APPLI_ASSERT(ts_status != TS_OK); Touchscreen_DrawBackground_Circle_Buttons(16); } BSP_LCD_SetFont(&Font20); /* draw play triangle */ BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillPolygon(Points2, 3); /* IMPORTANT: AUDIO_Play_Process() is called by the SysTick Handler, as it should be called within a periodic process */ /* Infinite loop */ while (1) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); /* Get the TouchScreen State */ ts_action = (TS_ActionTypeDef) TouchScreen_GetTouchPosition(); switch (ts_action) { case TS_ACT_VOLUME_UP: /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_VOLUME_DOWN: /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_FREQ_DOWN: /*Decrease Frequency */ if (*AudioFreq_ptr != 8000) { AudioFreq_ptr--; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_FREQ_UP: /* Increase Frequency */ if (*AudioFreq_ptr != 96000) { AudioFreq_ptr++; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_PAUSE: /* Set Pause / Resume */ if (uwPauseEnabledStatus == 1) { /* Pause is enabled, call Resume */ BSP_AUDIO_OUT_Resume(); uwPauseEnabledStatus = 0; BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PLAYING... ", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_FillPolygon(Points2, 3); BSP_LCD_SetTextColor(LCD_COLOR_BLACK); BSP_LCD_FillRect(100, 140, 25 , 80); BSP_LCD_FillRect(140, 140, 25 , 80); } else { /* Pause the playback */ BSP_AUDIO_OUT_Pause(); uwPauseEnabledStatus = 1; BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PAUSE ... ", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_FillRect(100, 140, 80 , 80); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillPolygon(Points2, 3); } HAL_Delay(200); break; default: break; } /* Toggle LED4 */ BSP_LED_Toggle(LED4); /* Insert 100 ms delay */ HAL_Delay(100); if (CheckForUserInput() > 0) { /* Set LED4 */ BSP_LED_On(LED4); BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); return; } } }