/** * @brief Stops audio stream playing on the used Media. * @param None. * @retval None. */ void Audio_MAL_Stop(void) { /* Stop the Transfer on the I2S side: Stop and disable the DMA stream */ DMA_Cmd(AUDIO_MAL_DMA_CHANNEL, DISABLE); /* Clear all the DMA flags for the next transfer */ DMA_ClearFlag(AUDIO_MAL_DMA_FLAG_ALL); /* Stop the current DMA request by resetting the I2S cell */ Codec_AudioInterface_DeInit(); /* Re-configure the I2S interface for the next paly operation */ Codec_AudioInterface_Init(I2S_InitStructure.I2S_AudioFreq); }
/** * @brief Stops audio stream playing on the used Media. * @param None. * @retval None. */ void Audio_MAL_Stop(void) { /* Stop the Transfer on the I2S side: Stop and disable the DMA stream */ DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); /* Clear all the DMA flags for the next transfer */ DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC |AUDIO_MAL_DMA_FLAG_HT | \ AUDIO_MAL_DMA_FLAG_FE | AUDIO_MAL_DMA_FLAG_TE); /* Wait the DMA Stream to be effectively disabled */ while (DMA_GetCmdStatus(AUDIO_MAL_DMA_STREAM) != DISABLE) {} /* Stop the current DMA request by resetting the I2S cell */ Codec_AudioInterface_DeInit(); /* Re-configure the I2S interface for the next paly operation */ Codec_AudioInterface_Init(I2S_InitStructure.I2S_AudioFreq); }
/** * @brief Restore the audio codec state to default state and free all used * resources. * @param None. * @retval o if correct communication, else wrong communication */ uint32_t Codec_DeInit(void) { uint32_t counter = 0; /* Reset the Codec Registers */ Codec_Reset(); /* Keep Codec powered OFF */ counter += Codec_WriteRegister(0x02, 0x01); /* Deinitialize all use GPIOs */ Codec_GPIO_DeInit(); /* Disable the Codec control interface */ Codec_CtrlInterface_DeInit(); /* Deinitialize the Codec audio interface (I2S) */ Codec_AudioInterface_DeInit(); /* Return communication control value */ return counter; }
/** * @brief Pauses or Resumes the audio stream playing from the Media. * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different * from 0) to resume. * @param Addr: Address from/at which the audio stream should resume/pause. * @param Size: Number of data to be configured for next resume. * @retval None. */ void Audio_MAL_PauseResume(uint32_t Cmd, uint32_t Addr, uint32_t Size) { /* Pause the audio file playing */ if (Cmd == AUDIO_PAUSE) { /* Stop the current DMA request by resetting the I2S cell */ Codec_AudioInterface_DeInit(); /* Re-configure the I2S interface for the next resume operation */ Codec_AudioInterface_Init(I2S_InitStructure.I2S_AudioFreq); /* Disable the DMA Stream */ DMA_Cmd(AUDIO_MAL_DMA_CHANNEL, DISABLE); /* Clear the Interrupt flag */ DMA_ClearFlag(AUDIO_MAL_DMA_FLAG_ALL); } else /* AUDIO_RESUME */ { /* Configure the buffer address and size */ DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Addr; DMA_InitStructure.DMA_BufferSize = (uint32_t)(Size*2); /* Configure the DMA Stream with the new parameters */ DMA_Init(AUDIO_MAL_DMA_CHANNEL, &DMA_InitStructure); /* Enable the I2S DMA Stream*/ DMA_Cmd(AUDIO_MAL_DMA_CHANNEL, ENABLE); /* If the I2S peripheral is still not enabled, enable it */ if ((CODEC_I2S->I2SCFGR & I2S_ENABLE_MASK) == 0) { I2S_Cmd(CODEC_I2S, ENABLE); } } }
/** * @brief Pauses or Resumes the audio stream playing from the Media. * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different * from 0) to resume. * @param Addr: Address from/at which the audio stream should resume/pause. * @param Size: Number of data to be configured for next resume. * @retval None. */ void Audio_MAL_PauseResume(uint32_t Cmd, uint32_t Addr, uint32_t Size) { /* Pause the audio file playing */ if (Cmd == AUDIO_PAUSE) { #ifdef USE_DMA_PAUSE_FEATURE /* Disable the I2S peripheral */ I2S_Cmd(CODEC_I2S, DISABLE); /* Pause the I2S DMA Stream Note. For the STM32F4xx devices, the DMA implements a pause feature, by disabling the stream, all configuration is preserved and data transfer is paused till the next enable of the stream. This feature is not available on STM32F1xx devices. */ DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); #else /* #if !defined(USE_DMA_PAUSE_FEATURE) */ /* Stop the current DMA request by resetting the I2S cell */ Codec_AudioInterface_DeInit(); /* Re-configure the I2S interface for the next resume operation */ Codec_AudioInterface_Init(I2S_InitStructure.I2S_AudioFreq); /* Disable the DMA Stream */ DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); /* Wait the DMA Stream to be effectively disabled */ while (DMA_GetCmdStatus(AUDIO_MAL_DMA_STREAM) != DISABLE) {} /* Clear the Interrupt flag */ DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_ALL); #endif /* USE_DMA_PAUSE_FEATURE */ } else /* AUDIO_RESUME */ { #ifdef USE_DMA_PAUSE_FEATURE /* Resume the I2S DMA Stream Note. For the STM32F4xx devices, the DMA implements a pause feature, by disabling the stream, all configuration is preserved and data transfer is paused till the next enable of the stream. This feature is not available on STM32F1xx devices. */ DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); #else /* Configure the buffer address and size */ DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Addr; DMA_InitStructure.DMA_BufferSize = (uint32_t)(Size*2); /* Configure the DMA Stream with the new parameters */ DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); /* Enable the I2S DMA Stream*/ DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); #endif /* USE_DMA_PAUSE_FEATURE */ /* If the I2S peripheral is still not enabled, enable it */ if ((CODEC_I2S->I2SCFGR & I2S_ENABLE_MASK) == 0) { I2S_Cmd(CODEC_I2S, ENABLE); } } }