/**
  * @brief  Initializes the Audio Codec audio interface (I2S)
  * @param  AudioFreq: Audio frequency to be configured for the I2S peripheral.
  */
static void I2SOUT_Init(uint32_t AudioFreq)
{
    /* Initialize the hAudioOutI2s Instance parameter */
    hAudioOutI2s.Instance         = I2SOUT;

    /* Disable I2S block */
    __HAL_I2S_DISABLE(&hAudioOutI2s);

    /* Perform MSP initialization at first function call */
    if(HAL_I2S_GetState(&hAudioOutI2s) == HAL_I2S_STATE_RESET)
    {
        I2SOUT_MspInit();
    }

    /* I2SOUT peripheral configuration */
    hAudioOutI2s.Init.AudioFreq   = AudioFreq;
    hAudioOutI2s.Init.CPOL        = I2S_CPOL_LOW;
    hAudioOutI2s.Init.DataFormat  = I2S_DATAFORMAT_16B;
    hAudioOutI2s.Init.MCLKOutput  = I2S_MCLKOUTPUT_ENABLE;
    hAudioOutI2s.Init.Mode        = I2S_MODE_MASTER_TX;
    hAudioOutI2s.Init.Standard    = I2S_STANDARD;

    /* Initialize the I2S peripheral with the structure above */
    HAL_I2S_Init(&hAudioOutI2s);

}
/**
  * @brief  Initializes the Audio Codec audio interface (I2S)
  * @note   This function assumes that the I2S input clock (through PLL_R in 
  *         Devices RevA/Z and through dedicated PLLI2S_R in Devices RevB/Y)
  *         is already configured and ready to be used.    
  * @param  AudioFreq: Audio frequency to be configured for the I2S peripheral. 
  * @retval None
  */
static void I2S2_Init(uint32_t AudioFreq)
{
  /* Initialize the hAudioInI2s Instance parameter */
  hAudioInI2s.Instance          = I2S2;
  
  /* Disable I2S block */
  __HAL_I2S_DISABLE(&hAudioInI2s);
  
  /* I2S2 peripheral configuration */
  hAudioInI2s.Init.AudioFreq    = 2 * AudioFreq;
  hAudioInI2s.Init.ClockSource  = I2S_CLOCK_PLL;
  hAudioInI2s.Init.CPOL         = I2S_CPOL_HIGH;
  hAudioInI2s.Init.DataFormat   = I2S_DATAFORMAT_16B;
  hAudioInI2s.Init.MCLKOutput   = I2S_MCLKOUTPUT_DISABLE;
  hAudioInI2s.Init.Mode         = I2S_MODE_MASTER_RX;
  hAudioInI2s.Init.Standard     = I2S_STANDARD_LSB;
  
  /* Initialize the I2S peripheral with the structure above */
  if(HAL_I2S_GetState(&hAudioInI2s) == HAL_I2S_STATE_RESET)
  { 
    I2S2_MspInit();
  }
  
  HAL_I2S_Init(&hAudioInI2s);
}
/**
  * @brief  Initializes the Audio Codec audio interface (I2S)
  * @param  AudioFreq: Audio frequency to be configured for the I2S peripheral. 
  * @retval AUDIO_StatusTypeDef AUDIO Status
  */
static AUDIO_StatusTypeDef I2Sx_Init(uint32_t AudioFreq)
{
  /* I2S peripheral configuration */
  hAudioOutI2s.Init.AudioFreq   = AudioFreq;
  hAudioOutI2s.Init.ClockSource = I2S_CLOCK_SYSCLK;
  hAudioOutI2s.Init.CPOL        = I2S_CPOL_LOW;
  hAudioOutI2s.Init.DataFormat  = I2S_DATAFORMAT_16B;
  hAudioOutI2s.Init.MCLKOutput  = I2S_MCLKOUTPUT_ENABLE;
  hAudioOutI2s.Init.Mode        = I2S_MODE_MASTER_TX;
  hAudioOutI2s.Init.Standard    = I2S_STANDARD;
  hAudioOutI2s.Instance         = I2Sx;

  /* Disable I2S block */
  __HAL_I2S_DISABLE(&hAudioOutI2s);

  /* Initialize the I2S peripheral with the structure above */
  if(HAL_I2S_GetState(&hAudioOutI2s) == HAL_I2S_STATE_RESET)
  { 
    I2Sx_MspInit();
  }

  if (HAL_I2S_Init(&hAudioOutI2s) != HAL_OK)
  {
    return AUDIO_ERROR;
  }
  
  return AUDIO_OK;
}
/**
  * @brief  Initializes the Audio Codec audio interface (I2S).
  * @param  AudioFreq: Audio frequency to be configured for the I2S peripheral. 
  * @retval None
  */
static void I2Sx_Init(uint32_t AudioFreq)
{
  /* Initialize the haudio_i2s Instance parameter */
  haudio_i2s.Instance = AUDIO_I2Sx;

 /* Disable I2S block */
  __HAL_I2S_DISABLE(&haudio_i2s);  

  haudio_i2s.Init.Mode = I2S_MODE_MASTER_TX;
  haudio_i2s.Init.Standard = I2S_STANDARD;
  haudio_i2s.Init.DataFormat = I2S_DATAFORMAT_16B;
  haudio_i2s.Init.AudioFreq = AudioFreq;
  haudio_i2s.Init.CPOL = I2S_CPOL_LOW;
  haudio_i2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;

  if(HAL_I2S_GetState(&haudio_i2s) == HAL_I2S_STATE_RESET)
  { 
    I2Sx_MspInit();
  }
  /* Init the I2S */
  HAL_I2S_Init(&haudio_i2s); 
}