⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
//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 + -