?? 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];//存放轉(zhuǎn)換過后的M根譜線的能量
extern unsigned short Spectrum_gLinePow[SPECTRUM_LINE_M];//存放轉(zhuǎn)換過后的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);
}
/**************************************************************************
* 函數(shù)描述: 音頻輸出音量設(shè)置
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋: 由于音頻中音效管理需要獨立配置音量,故,在driver層封裝此函數(shù)
***************************************************************************/
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);
}
/**************************************************************************
* 函數(shù)描述: 音頻輸出buf列表內(nèi)部使用
* 入口參數(shù): SLIST_ENTRY *pNode :鏈表中一個節(jié)點的指針
void *pKey :用戶數(shù)據(jù)指針
* 出口參數(shù): 無
* 返回值: 無
* 注釋: 由于slist.c已打包,此函數(shù)現(xiàn)在沒用,目的是防止將來用到時死機
***************************************************************************/
INT32U AudioListCmp(SLIST_ENTRY *pNode , void *pKey)
{
return 1;
}
/**************************************************************************
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋: 使用靜態(tài)鏈表管理,詳細用法參考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;
}
/**************************************************************************
* 函數(shù)描述: 音頻硬件初始化
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋:
***************************************************************************/
void Audio_Init(void)
{
I2S_PowerOnInit(I2S_SlaveMode); //I2S_MasterMode);//
Codec_SetMode(Codec_DACout);
}
/**************************************************************************
* 函數(shù)描述: DMA中斷處理函數(shù)
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋:
***************************************************************************/
void Audio_ISR(void)
{
if (Audio_State_Play == AudioPlayState)
{
AudioOutBufSwitch();
RockOSSendMsg(MBAUDIO, AS_GUAU_Playing, (void*)NULL);
}
}
/**************************************************************************
* 函數(shù)描述: 切換音頻DMA源地址,重啟DMA
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋:
***************************************************************************/
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計時應(yīng)正式開始
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
}
/**************************************************************************
* 函數(shù)描述: 音頻硬件初始化
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 無
* 注釋:
***************************************************************************/
void AudioHWInit(void)
{
Codec_SetMode(Codec_DACout);
// Codec_SetVolumet(OutputVolume);
AudioSetVolume();
}
/**************************************************************************
* 函數(shù)描述: 音頻解碼初始化
* 入口參數(shù): 無
* 出口參數(shù): 無
* 返回值: 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 + -