📄 dac_codec.c
字号:
/* Insure the index parity */
AudioDataIndex &= 0xFFFFFFFE;
/* Resume playing from the new position */
DAC_CODEC_Play((GetVar_AudioDataIndex()));
}
/*******************************************************************************
* Function Name : DAC_CODEC_UpdateStatus
* Description : Check if STOP or PAUSE command are generated and performs the
* : relative action (STOP or PAUSE playing)
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void DAC_CODEC_UpdateStatus(void)
{
/* STOP command is generated => Stop playing the audio file */
if (GetVar_AudioPlayStatus() == AudioPlayStatus_STOPPED)
{
DAC_CODEC_Stop();
}
/* PAUSE Command is generated => PAUSE playing the audio File */
if (GetVar_AudioPlayStatus() == AudioPlayStatus_PAUSED)
{
DAC_CODEC_Pause();
}
}
/*******************************************************************************
* Function Name : GetVar_DataStartAddr
* Description : returns DataStartAddr variable value (used by stm32f10x_it.c file).
* Input : None
* Output : None
* Return : AudioDataIndex
*******************************************************************************/
u32 GetVar_DataStartAddr(void)
{
return DataStartAddr;
}
/*******************************************************************************
* Function Name : GetVar_CurrentVolume
* Description : returns CurrentVolume variable value (used by extern files).
* Input : None
* Output : None
* Return : CurrentVolume
*******************************************************************************/
u8 GetVar_CurrentVolume(void)
{
return CurrentVolume;
}
/*******************************************************************************
* Function Name : DAC_CODEC_WaveParsing
* Description : Checks the format of the .WAV file and gets information about
* the audio format. This is done by reading the value of a
* number of parameters stored in the file header and comparing
* these to the values expected authenticates the format of a
* standard .WAV file (44 bytes will be read). If it is a valid
* .WAV file format, it continues reading the header to determine
* the audio format such as the sample rate and the sampled data
* size. If the audio format is supported by this application,
* it retrieves the audio format in WAVE_Format structure and
* returns a zero value. Otherwise the function fails and the
* return value is nonzero.In this case, the return value specifies
* the cause of the function fails. The error codes that can be
* returned by this function are declared in the header file.
* Input : None
* Output : None
* Return : Zero value if the function succeed, otherwise it return
* a nonzero value which specifies the error code.
*******************************************************************************/
ErrorCode DAC_CODEC_WaveParsing(u8* HeaderTab)
{
u32 Temp = 0x00;
u32 ExtraFormatBytes = 0;
/* Initialize the HeaderTabIndex variable */
HeaderTabIndex = 0;
/* Read chunkID, must be 'RIFF' ----------------------------------------------*/
Temp = ReadUnit(4, BigEndian);
if(Temp != ChunkID)
{
return(Unvalid_RIFF_ID);
}
/* Read the file length ----------------------------------------------------*/
WAVE_Format.RIFFchunksize = ReadUnit(4, LittleEndian);
/* Read the file format, must be 'WAVE' ------------------------------------*/
Temp = ReadUnit(4, BigEndian);
if(Temp != FileFormat)
{
return(Unvalid_WAVE_Format);
}
/* Read the format chunk, must be 'fmt ' -----------------------------------*/
Temp = ReadUnit(4, BigEndian);
if(Temp != FormatID)
{
return(Unvalid_FormatChunk_ID);
}
/* Read the length of the 'fmt' data, must be 0x10 -------------------------*/
Temp = ReadUnit(4, LittleEndian);
if(Temp != 0x10)
{
ExtraFormatBytes = 1;
}
/* Read the audio format, must be 0x01 (PCM) -------------------------------*/
WAVE_Format.FormatTag = ReadUnit(2, LittleEndian);
if(WAVE_Format.FormatTag != WAVE_FORMAT_PCM)
{
return(Unsupporetd_FormatTag);
}
/* Read the number of channels: 0x02->Stereo 0x01->Mono --------------------*/
WAVE_Format.NumChannels = ReadUnit(2, LittleEndian);
/* Read the Sample Rate ----------------------------------------------------*/
WAVE_Format.SampleRate = ReadUnit(4, LittleEndian);
/* Update the OCA value according to the .WAV file Sample Rate */
switch(WAVE_Format.SampleRate)
{
case SampleRate_8000 : TIM2ARRValue = 9000; break; /* 8KHz = 72MHz / 9000 */
case SampleRate_11025: TIM2ARRValue = 6531; break; /* 11.025KHz = 72MHz / 6531 */
case SampleRate_22050: TIM2ARRValue = 3265; break; /* 22.05KHz = 72MHz / 3265 */
case SampleRate_44100: TIM2ARRValue = 1633; break; /* 44.1KHz = 72MHz / 1633 */
default: return(Unsupporetd_Sample_Rate);
}
/* Read the Byte Rate ------------------------------------------------------*/
WAVE_Format.ByteRate = ReadUnit(4, LittleEndian);
/* Read the block alignment ------------------------------------------------*/
WAVE_Format.BlockAlign = ReadUnit(2, LittleEndian);
/* Read the number of bits per sample --------------------------------------*/
WAVE_Format.BitsPerSample = ReadUnit(2, LittleEndian);
if(WAVE_Format.BitsPerSample != Bits_Per_Sample_16)
{
return(Unsupporetd_Bits_Per_Sample);
}
/* If there are Extra format bytes, these bytes will be defined in "Fact Chunk" */
if(ExtraFormatBytes == 1)
{
/* Read th Extra format bytes, must be 0x00 ------------------------------*/
Temp = ReadUnit(2, LittleEndian);
if(Temp != 0x00)
{
return(Unsupporetd_ExtraFormatBytes);
}
/* Read the Fact chunk, must be 'fact' -----------------------------------*/
Temp = ReadUnit(4, BigEndian);
if(Temp != FactID)
{
return(Unvalid_FactChunk_ID);
}
/* Read Fact chunk data Size ---------------------------------------------*/
Temp = ReadUnit(4, LittleEndian);
/* Set the index to start reading just after the header end */
HeaderTabIndex += Temp;
}
/* Read the Data chunk, must be 'data' -------------------------------------*/
Temp = ReadUnit(4, BigEndian);
if(Temp != DataID)
{
return(Unvalid_DataChunk_ID);
}
/* Read the number of sample data ------------------------------------------*/
WAVE_Format.DataSize = ReadUnit(4, LittleEndian);
/* Set the data pointer at the beginning of the effective audio data */
DataStartAddr += HeaderTabIndex;
return(Valid_WAVE_File);
}
/*******************************************************************************
* Function Name : GetVar_AudioDataIndex
* Description : returns AudioDataIndex variable value (used by stm32f10x_it.c file).
* Input : None
* Output : None
* Return : AudioDataIndex
*******************************************************************************/
u32 GetVar_AudioDataIndex(void)
{
return AudioDataIndex;
}
/*******************************************************************************
* Function Name : SetVar_AudioDataIndex
* Description : Sets AudioDataIndex variable value (used by stm32f10x_it.c file).
* Input : None
* Output : None
* Return : AudioDataIndex
*******************************************************************************/
void SetVar_AudioDataIndex(u32 value)
{
AudioDataIndex = value;
}
/*******************************************************************************
* Function Name : IncrementVar_AudioDataIndex
* Description : Increment the AudioDataIndex variable.
* Input : - IncrementNumber: number of incrementations.
* Output : None
* Return : None
*******************************************************************************/
void IncrementVar_AudioDataIndex(u32 IncrementNumber)
{
AudioDataIndex += (u32)IncrementNumber;
if (AudioDataIndex >= AudioDataLength)
{
ResetVar_AudioDataIndex();
Decrement_AudioReplay();
}
}
/*******************************************************************************
* Function Name : DecrementVar_AudioDataIndex
* Description : Set the AudioDataIndex variable to 1.
* Input : None
* Output : None
* Return : None.
*******************************************************************************/
void DecrementVar_AudioDataIndex(u32 DecrementNumber)
{
if (DecrementNumber >= AudioDataIndex)
{
ResetVar_AudioDataIndex();
}
else
{
AudioDataIndex -= (u32)DecrementNumber;
}
}
/*******************************************************************************
* Function Name : ResetVar_AudioDataIndex
* Description : Reset the AudioDataIndex variable.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ResetVar_AudioDataIndex(void)
{
AudioDataIndex = DataStartAddr;
/* Send the read command to the media */
Media_StartReadSequence(AudioFileAddress + DataStartAddr + 1);
}
/*******************************************************************************
* Function Name : GetVar_SendDummyData
* Description : returns SendDummyData variable value (used by stm32f10x_it.c file).
* Input : None
* Output : None
* Return : SendDummyData
*******************************************************************************/
u32 GetVar_SendDummyData(void)
{
return SendDummyData;
}
/*******************************************************************************
* Function Name : SetVar_SendDummyData
* Description : Set the SendDummyData variable to 1.
* Input : None
* Output : None
* Return : SendDummyData
*******************************************************************************/
u32 SetVar_SendDummyData(void)
{
SendDummyData = (u32)0x1;
return SendDummyData;
}
/*******************************************************************************
* Function Name : ResetVar_SendDummyData
* Description : Reset the SendDummyData variable to 0.
* Input : None
* Output : None
* Return : SendDummyData
*******************************************************************************/
u32 ResetVar_SendDummyData(void)
{
SendDummyData = (u32)0;
return SendDummyData;
}
/*******************************************************************************
* Function Name : GetVar_AudioPlayStatus
* Description : returns AudioPlayStatus variable value (used by stm32f10x_it.c file).
* Input : None
* Output : None
* Return : AudioPlayStatus value.
*******************************************************************************/
u32 GetVar_AudioPlayStatus(void)
{
return AudioPlayStatus;
}
/*******************************************************************************
* Function Name : SetVar_AudioPlayStatus
* Description : Set the AudioDataIndex variable to Status.
* Input : Status: could be AudioPlayStatus_STOPPED, AudioPlayStatus_PLAYING
* : or AudioPlayStatus_PAUSED.
* Output : None
* Return : AudioPlayStatus value.
*******************************************************************************/
u32 SetVar_AudioPlayStatus(u32 Status)
{
AudioPlayStatus = (u32)Status;
return AudioPlayStatus;
}
/*******************************************************************************
* Function Name : GetVar_AudioReplay
* Description : returns AudioReplay variable value.
* Input : None
* Output : None
* Return : AudioReplay value.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -