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

📄 effect.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************************
*
*  Copyright (C),2007, Fuzhou Rockchip Co.,Ltd.
*
*  File name :     effect.c
*  Description:    音频效果处理
*  Remark:
*
*  History:
*           <author>      <time>     <version>       <desc>
*           Huweiguo     07/09/27      1.0
*
*******************************************************************************/
#include "include.h"
#include "audio_globals.h"
#include "effect.h"
#include "RkEQ\rk_eq.h"
#include "PlayFx\msaudspapi.h"


/**************************************************************************
* 函数描述:  RockEQ初始化
* 入口参数:
* 出口参数:
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
static long RKEQInit(void)
{
    return 0;
}

/**************************************************************************
* 函数描述:  微软音效初始化
* 入口参数:
* 出口参数:
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
static long PFEQInit(void)
{
    unsigned long SamplingRate = 44100;

    CodecGetSampleRate(&SamplingRate);

    if (MsAudspInit(SamplingRate) != 0)
        return 1;

    return 0;
}

/**************************************************************************
* 函数描述:  RockEQ参数设置
* 入口参数:  [pEft]   --
* 出口参数:
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
#define EQADDVOL     6

short PresetGain[5][5] =
{

    {16,  8, 12, 16, 16}, // ROCK
    {12, 16, 16, 12, 12}, // POP
    {12, 12, 12, 10, 10}, // CLASSIC
    {18, 16, 14 , 10, 10}, // BASS
    {16, 12, 12, 16, 18} // JAZZ
};

short UseEqTable[7] = {6, 8, 10, 12, 14, 16, 18};
short UseEQ[5];

static long RKEQAdjust(tEffect *pEft)
{

    int i;
    unsigned long SamplingRate = 44100;// = pEft->RKCoef.SmpRate;

    CodecGetSampleRate(&SamplingRate);

    switch (pEft->Mode)
    {
        case EQ_ROCK:
        case EQ_POP:
        case EQ_CLASSIC:
        case EQ_BASS:
        case EQ_JAZZ:
            RockEQAdjust(SamplingRate, PresetGain[pEft->Mode-EQ_ROCK], 1);
            break;

        case EQ_USER:
            for (i = 0;i < 5;i++)
            {
                UseEQ[i] = UseEqTable[pEft->RKCoef.dbGain[i]];
            }
            RockEQAdjust(SamplingRate, UseEQ, 1);
            break;

        default:
            break;
    }

    return 0;
}

/**************************************************************************
* 函数描述:  PlayFx EQ参数设置
* 入口参数:
* 出口参数:
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
static long PFEQAdjust(void)
{
    singal_effect_change_and_refresh_argtbl(pAuDSP, (void *)g_argTable, (void *)g_argTableNew);
    return 0;
}

/**************************************************************************
* 函数描述:  PlayFx EQ参数设置, 当音效模式为NOR 时
* 入口参数:
* 出口参数:
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
static long PFEQAdjustNor(void)
{
    ms_set_leq_enabled(0);
    ms_set_bb_enabled(0);
    ms_set_hv_enabled(0);
    ms_set_bb_level(1);

    singal_effect_change_and_refresh_argtbl(pAuDSP, (void *)g_argTable, (void *)g_argTableNew);
    return 0;
}

/**************************************************************************
* 函数描述:  音效初始化函数
* 入口参数:  无
* 出口参数:  无
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
long EffectInit(void)
{
    if (RKEQInit() != 0)
        return 1;

    if (PFEQInit() != 0)
        return 1;

    return 0;
}

/**************************************************************************
* 函数描述:  音效结束函数
* 入口参数:  无
* 出口参数:  无
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
long EffectEnd(void)
{
    MsAudspEnd();

    return 0;
}

/**************************************************************************
* 函数描述:  音效处理函数
* 入口参数:  [pBuffer]      --      PCM 数据所在的Buffer
*                         [PcmLen]     --       PCM数据的长度
* 出口参数:  无
* 返回值:    0:处理成功; other:失败。
* 注释:      音效处理输入PCM 数据需要以 LRLRLR...的形式存放
***************************************************************************/
int  EQtime;

long EffectProcess(short *pBuffer, long PcmLen)
{
    AudioInOut_Type  *pAudio = &AudioIOBuf;
    tEffect   *pEffect = &pAudio->EffectCtl;

    if (pBuffer == 0)
        return 1;

    if (PcmLen <= 0)
        return 0;

    if (CurrentCodec == CODEC_APE_DEC)
        return 1;   //目前 ape 不做音效处理

    switch (pEffect->Mode)
    {
        case EQ_NOR:
            EQtime = 0;
            break;

        case EQ_PLAYFX:
            MsAudspProssing(pBuffer, PcmLen);

            if (EQtime == 6)
            {
                AudioSetVolume();
                EQtime = 7;
            }
            else
                EQtime++;

            break;

        case EQ_ROCK:
        case EQ_POP:
        case EQ_CLASSIC:
        case EQ_BASS:
        case EQ_JAZZ:
        case EQ_USER:
            EQtime = 0;
            RockEQProcess(pBuffer, PcmLen);

            break;

        default:
            break;
    }

    return 0; //成功
}

/**************************************************************************
* 函数描述:  音效调节函数
* 入口参数:  无
* 出口参数:  无
* 返回值:    0:处理成功; other:失败。
* 注释:
***************************************************************************/
long EffectAdjust(void)
{
    AudioInOut_Type  *pAudio = &AudioIOBuf;
    tEffect   *pEffect = &pAudio->EffectCtl;

    EQtime = 0;
    switch (pEffect->Mode)
    {
        case EQ_NOR:
            AudioSetVolume();
            PFEQAdjustNor(); // NOR 时微软音效需要作一些处理
            PMU_ExitModule(PMU_EQ);
            break;
        case EQ_ROCK:
        case EQ_POP:
        case EQ_CLASSIC:
        case EQ_BASS:
        case EQ_JAZZ:
        case EQ_USER:
            AudioSetVolume();
            RKEQAdjust(pEffect);
            PMU_EnterModule(PMU_EQ);
            break;
        case EQ_PLAYFX:
            PFEQAdjust();
            PMU_EnterModule(PMU_EQ);
            break;

        default:
            break;
    }

    return 0; //成功
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -