📄 audiocontrol.c
字号:
//1音频控制部分
#include "include.h"
//#include <stdlib.h>
//080520,huangsl,修改包含路径,用于 PC仿真编译,保留.
#include "..\application\audio\buffer\buffer.h"
#include "..\application\audio\include\file_access.h"
#include "..\application\audio\include\audio_globals.h"
#include "AudioControl.h"
#include "..\application\AudioWin\AudioWin.h"
#include "..\Effect\effect.h"
#include "slist.h"
#include "Holdonplay.h"
#include "VideoCodecs.h"
//Add for Real Video&Audio Synz. by Vincent Hisung,Nov 24,2007
extern INT64S real_timer_tick;
extern unsigned short RV_SkipFrameEn;
int isFirstDec = 0;
short * FirstOutBuf = NULL;
unsigned long AudioLastRepeatMode = Audio_AllRepeat;
//播放音乐后如果再进有音频的游戏,音频播放的模式会临时改成只播放一次,退出游戏再恢复原来的模式。
extern unsigned long nSamplesPlayed;
extern MY_FILE * pRawFileCache;
extern MY_FILE * pRawFileCache2;
extern BufferState sPlayBuffer;
extern BufferState sRecordBuffer;
extern REG_AUDIOCONFIG* pAudioRegKey;
extern WINDOW* pAudioWin;
extern UINT16 Audio_PMU[];
extern UINT8 AviOpenTrackFlag;
extern int OpenTrack(void);
extern void CloseTrack(void);
extern tEffect EQ;
BOOLEAN AudioStop(UINT16 ReqType);
MY_FILE * outF;
//UINT32 Codec_Samples_Num=0;
INT16U AudioPlayState = Audio_State_Stop;
ALIGN(64) AudioInOut_Type AudioIOBuf;
//int num_fra=0;
//MY_FILE *outfile;
//MY_FILE *outfile2;
//MY_FILE *gFileHandleOfTest;
//int gCurrentDisk;
//int g_Part_ID;
unsigned char CodecMode, BasicMode, VisualMode;
unsigned char CurrentCodec;
unsigned int PlaySamplingRate, PlayBitrate;
//unsigned int CurrentFileNum;
//unsigned int TotalMusicFileNum;
//unsigned int PlaylistFileNum;
//unsigned short PlaySec;
//unsigned char CHECK_TIMER_INT;
//unsigned char CHECK_TIMER_BATTERY;
//unsigned char MenuCDSync;
//unsigned char SpeedVal;
unsigned int SampleRate;
unsigned char ABFlag;
//unsigned int ABMusic[2];
//unsigned long ABTime[2];
//unsigned char fEnableResume;
//unsigned char ValidMusicFlag;
unsigned char gPlugInSkip;
unsigned char gAudioReq = 0;
//int gAudioCount = 0;
//int gVideoCount = 0;
//int gDemuxCount = 0;
unsigned char gStartRec;
unsigned char gAudioDmaState;
unsigned long ulEndOfRAM;
unsigned long buff[0xc000];
AUDIOCONTROL AudioPlayInfo;
//UINT16 gAudioOutBufIndex = 0;
AUDIOLISTENTRY gAudioBufEntries[AUDIO_OUT_BUF_NUM];
SLIST volatile gAudioDecBufList;
short AudioDataMute = 0;
short AudioStopCtl;
short VideoPlaying = 0;
BOOLEAN AudioGetNextMusic(UINT32 msg);
void AudioMediaValidate(void* data);
void AudioOutBufSwitch(void);
void AudioSetEQ(void);
void AudioSetAB(void);
#define SpectrumLoopTime 3
#define SPECTRUM_LINE_M 20
#define MAX(a,b) (a>b)?a:b;
int SpectrumLoop = SpectrumLoopTime;
int SpectrumCnt = 0;
//范围是0~20.
unsigned short SpectrumBuf[SPECTRUM_LINE_M];//存放转换过后的M根谱线的能量
extern unsigned short Spectrum_gLinePow[SPECTRUM_LINE_M];//存放转换过后的M根谱线的能量
extern BOOLEAN AudioFindValidateFile ;
#ifdef MOV_INCLUDE
EXT void MovSetAudioPlayEnd(void);
#endif
BOOLEAN VideoPlayState(void)
{
return VideoPlaying;
}
BOOLEAN AudioPlaying(void)
{
return (Audio_State_Stop != AudioPlayState);
}
/**************************************************************************
* 函数描述: 音频输出音量设置
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 由于音频中音效管理需要独立配置音量,故,在driver层封装此函数
***************************************************************************/
void AudioSetVolume(void)
{
unsigned int Vol = OutputVolume;
#ifdef APE_DEC_INCLUDE
if ((CurrentCodec == CODEC_APE_DEC) || (VideoPlaying))
{
//目前 ape 不做音效处理
Codec_SetVolumet(Vol);
return ;
}
#endif
if (Vol)
{
switch (AudioIOBuf.EffectCtl.Mode)
{
case EQ_NOR:
break;
case EQ_ROCK:
case EQ_POP:
case EQ_CLASSIC:
case EQ_BASS:
case EQ_JAZZ:
case EQ_USER:
Vol += 5;
break;
case EQ_PLAYFX:
{
if (AudioIOBuf.EffectCtl.MSMode == Audio_BB)
Vol += 9;
else if (AudioIOBuf.EffectCtl.MSMode == Audio_3D || AudioIOBuf.EffectCtl.MSMode == Audio_LEQ)
Vol += 5;
}
break;
default:
break;
}
}
Codec_SetVolumet(Vol);
}
/**************************************************************************
* 函数描述: 音频输出buf列表内部使用
* 入口参数: SLIST_ENTRY *pNode :链表中一个节点的指针
void *pKey :用户数据指针
* 出口参数: 无
* 返回值: 无
* 注释: 由于slist.c已打包,此函数现在没用,目的是防止将来用到时死机
***************************************************************************/
INT32U AudioListCmp(SLIST_ENTRY *pNode , void *pKey)
{
return 1;
}
/**************************************************************************
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 使用静态链表管理,详细用法参考SList.c
***************************************************************************/
void AudioInitList(void)
{
UINT16 cnt;
for (cnt = 0;cnt < AUDIO_OUT_BUF_NUM;cnt++)
gAudioBufEntries[cnt].BuffAddr = &AudioIOBuf.PCMBuf[cnt*AUDIO_OUT_BUF_LEN];
gAudioDecBufList.StructSize = sizeof(AUDIOLISTENTRY);
gAudioDecBufList.Func = AudioListCmp;
SListInit((SLIST*)&gAudioDecBufList , AUDIO_OUT_BUF_NUM , gAudioBufEntries);
SListAddEntryTail((SLIST*)&gAudioDecBufList);
SListAddEntryTail((SLIST*)&gAudioDecBufList);
SListAddEntryTail((SLIST*)&gAudioDecBufList);
SListAddEntryTail((SLIST*)&gAudioDecBufList);
SListAddEntryTail((SLIST*)&gAudioDecBufList);
//Add by Vincent Hisung,Nov 24,2007
isFirstDec = 0;
AudioStopCtl = 0;
}
/**************************************************************************
* 函数描述: 音频硬件初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void Audio_Init(void)
{
I2S_PowerOnInit(I2S_SlaveMode); //I2S_MasterMode);//
Codec_SetMode(Codec_DACout);
}
/**************************************************************************
* 函数描述: DMA中断处理函数
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void Audio_ISR(void)
{
if (Audio_State_Play == AudioPlayState)
{
AudioOutBufSwitch();
RockOSSendMsg(MBAUDIO, AS_GUAU_Playing, (void*)NULL);
}
}
/**************************************************************************
* 函数描述: 切换音频DMA源地址,重启DMA
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
short AudioTest[AUDIO_OUT_BUF_LEN*2];
void AudioOutBufSwitch(void)
{
short* OutBuf = AudioTest;
AUDIOLISTENTRY* entry = (AUDIOLISTENTRY*)gAudioDecBufList.UsedList;
if (entry && (0 == AudioDataMute)) //DELATE LAST BUFFE.
{
SListDeleteEntryPtr((SLIST*)&gAudioDecBufList, (SLIST_ENTRY*)entry);
}
entry = (AUDIOLISTENTRY*)gAudioDecBufList.UsedList;
if (entry)
{
AudioDataMute = 0;
OutBuf = entry->BuffAddr;
}
else
{
AudioDataMute = 1;
if (AudioStopCtl)return;
}
//若将切换到第一次解码输出的BUFFER,说明audio计时应正式开始
if ((OutBuf == FirstOutBuf) && (VideoPlaying))
{
RockOSSendMsg(MBAUDIO, AS_GUGU_UnMute, NULL);
//Codec_DACUnMute();
real_timer_tick = 0;
RV_SkipFrameEn = 1;
FirstOutBuf = NULL;
RockOSSendMsg(MBVIDEO, AS_GUVI_RealDisplayStart, NULL);
}
DmaTransmit(AUDIO_DMACHANNEL,
(UINT32)OutBuf,//OutBuf,
(UINT32)RegI2s_TXR,
(UINT32)AudioIOBuf.lOutLength,
(UINT32)DmaI2sPlayCopy,
(DMACallBack)Audio_ISR);
nSamplesPlayed += AudioIOBuf.lOutLength; // For wmv, HuWeiGuo, 08/04/11
}
/**************************************************************************
* 函数描述: 音频硬件初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void AudioHWInit(void)
{
Codec_SetMode(Codec_DACout);
// Codec_SetVolumet(OutputVolume);
AudioSetVolume();
}
/**************************************************************************
* 函数描述: 音频解码初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioDecInit(MY_FILE* pHandle)
{
if ((!pHandle) || AudioPlayState != Audio_State_Stop)
return FALSE;
pRawFileCache = pHandle;
AudioDataMute = 0;
AudioStopCtl = 0;
//.2解头
pAudioRegKey->CurrentTime = 0;
gPlugInSkip = 0;
memset(buff, 0, sizeof(buff));
ulEndOfRAM = (unsigned long)buff;
ID3_GetID3((int)pRawFileCache);
if (0 == OpenTrack())
{
//AudioPlayState = Audio_State_Play;
//RockOSSendMsg(MBAUDIO,AS_GUAU_Stop,Audio_Stop_Normal);
RockOSSendMsg(MBGUI, AS_AUGU_ReportErr, (void*)Audio_Err_DecHead);
return FALSE;
}
CodecGetLength(&pAudioRegKey->TotalTime);
CodecGetSampleRate(&pAudioRegKey->Samplerate);
CodecGetBitrate(&pAudioRegKey->Bitrate);
Codec_SetSampleRate(pAudioRegKey->Samplerate);
if (0 == VideoPlaying)
{
PMU_ExitModule(Audio_PMU[CurrentCodec]);
//CurrentCodec = AudioGetFIleType(AudioFileInfo.Name);
if (CurrentCodec < NUMCODECS)
{
if ((CurrentCodec == CODEC_MP3) && (pAudioRegKey->Samplerate > 44100))
PMU_EnterModule(PMU_MP3H);
else
PMU_EnterModule(Audio_PMU[CurrentCodec]);
}
else
return FALSE;
}
if (pAudioWin)
{
LrcInit();
RockOSSendMsg(MBGUI, AS_AUGU_UpdateAll, NULL);
}
RockOSSendMsg(MBAUDIO, AS_AUAU_DecStart, NULL);
return TRUE;
}
/**************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -