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

📄 dspkernel.c

📁 Sunplus 8202S source code.
💻 C
字号:
#include "config.h"
#include "regmap.h"
#include "global.h"
#include "macro.h"
#include "dsp3_def.h"
#include "iop.h"

#include "audkernel.h"	


// use extern temporary...
// These 2 tables should be define here, but not doing so is for compiling issue.
#ifdef  VOL_80  
extern BYTE  VolTab[17+65];
#elif defined(VOL_20)
extern BYTE  VolTab[22];
#else
extern BYTE  VolTab[17];
#endif

BYTE bOutVol=0xff;
extern BYTE  MICVolTab[9];
extern UINT8 power_on_mute;

extern int check_chipinfo(int n);
extern BYTE wait_dsp_port0_5(int port0,int port5,int val,UINT32 risc_waiting_dsp_tm);
extern int WriteToI2c(int,int,BYTE *,int); // using I2C function in iop.c
/***********************************************************************
 *  Code Session
 ***********************************************************************/

void DSP_ADCmd(UINT16 cmd,UINT16 cType)
{	
	//2002-5-29 for fuss mic
	if(cType!=0) regs0->dsp24_port[1] = 0xffff;
    regs0->dsp24_port[0] = cmd | (MICVolTab[cType]);
			
    #ifdef AUDKRNL_DBG 
    printf("DSPKRNL : MIC:0x%x  AD:0x%x ", MICVolTab[cType], (VolTab[cType*2])); 
    #endif
}


//  Function Description : Do DSP Audio-IO-Control
//  Parameters :
//    #define VOL0_IS_NO_VOICE
//      mute: cType=0 , port1=0
//      vol0: cType=0 , port1=1
//      BBK vol0: cType=0 , port1=1
void DSP_Set_Vol(UINT8 cType)
{
    printf("cType:%d\n",cType);
 
    if (user_mute)  
        regs0->dsp24_port[1] = 0;
  #if defined(NO_DTS_OUTPUT)&&!defined(DIVIDE_AC3_DTS_SPDIF_OUTPUTS)&&!defined(EASTECH_NEW_SETUP_MENU)
    else if(setup_DTSCD_IsSet2SPDIF_PCMAndOff()==1) {
        regs0->dsp24_port[1] = 0;
        cType=0;
    } 
  #endif
    else if(((audio_only==1)&&((adv_search_time<4)&&(adv_search_time>(-4))))||(cType==0)) {
        if((cd_subtype==CD_DTS)&&(adv_search_time))
            regs0->dsp24_port[1]= 0;
        else {
          #ifdef  MP3_CD_FF1_BF1_MUTE//YX822BC//nono 20020822
            //mix YUXING822BC when forward||backwardX2,pressing SELECT,demute will be run.
            if(adv_search_time)
                regs0->dsp24_port[1] = 0;
            else
          #endif

          #ifdef VOL0_IS_NO_VOICE
            regs0->dsp24_port[1]=0;
          #else
            regs0->dsp24_port[1]=1;
          #endif	
        } //else
    } //else if(((audio_onlu
            
   //Jeff 20020530
    if(cType!=0)
        regs0->dsp24_port[1] = 0xffff;   
			
    if(bOutVol != VolTab[cType]) {
        regs0->dsp24_port[0] = 0x1100 | (VolTab[cType]);
        bOutVol = VolTab[cType];
      #ifdef Ti3001_OSD_UI_1
        amp_setup[ADDR_M_VOL]=audio_volume;
        save_amplifier_setup(ADDR_M_VOL+ADDR_I2C_START,&audio_volume);
      #endif

      #ifdef VOLUME_RECODE
        {  
        int volume;			     	
        #ifdef CNTR_5SPK_VOLUME
        volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME, (BYTE *)&volume_5SPK[0],1);
        #else
        volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME, (BYTE *)&audio_volume, 1);
        #endif
        }
      #endif
    } else if (bOutVol==0) {
     //there are two types of volume-0: 1.sound-0(0x1100-0x0001), 2.mute(0x1100-0x0000)
     //bOutVol only record 0x1100(not include 0x0001 or 0x0000), so we force to send it
        regs0->dsp24_port[0] = 0x1100;
    }
   
    #ifdef AUDKRNL_DBG 
    printf("Source VOLUME,VolTab[cType]:%d cType:%d bOutVol:%d",VolTab[cType],cType,bOutVol);
    printf("regs0->dsp24_port[1]=%x\n", regs0->dsp24_port[1]);
    #endif    
}


//  Function Description : Do DSP Audio-IO-Control
//  Parameters :
//    wCode : Command code
//    cType : sub-command or parameter
//    wParam: optional parameter
//
#ifdef SUPPORT_SOUND_EFFECT
int DSP_AudioIOControl(UINT16 wCode, UINT32 cType, UINT32 wParam)
#else
int DSP_AudioIOControl(UINT16 wCode, BYTE cType, UINT16 wParam)
#endif
{
    int iRes = 0;

#ifdef NO_AUDIO_DSP
    return 1;
#endif    
    
    //these DSP code doesn't support generic audio command
    if (coding_mode_now&(AUDIF_CODING_MODE_NES) ) {
        return 1;
    }

#ifdef SUPPORT_MIDI_MENU_SEL // Jeff 20031104
    if (coding_mode_now&AUDIF_CODING_MODE_MIDI) {
        extern BYTE midiState;   //dtb in 20040109

        if(midiState != 2) //MIDI_STATE_PAYLOAD
            return 1;
    }
#endif
	
    regs0->dsp24_port[1] = wParam;
	
    switch (wCode) {
	case FLOW:
		regs0->dsp24_port[0] = 0x0200 | cType;
		
		switch (cType) {
		case AUDIOPLAY:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOPLAY "); 
            #endif
			break;
		case AUDIOCONTINUE:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOCONTINUE "); 
            #endif
			break;
		case AUDIOSTOP:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOSTOP "); 
            #endif
			break;
		case AUDIOPAUSE:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOPAUSE "); 
            #endif
			break;
		case AUDIOFLUSH:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOFLUSH "); 
            #endif
			break;
		case AUDIOFF2X:
		case AUDIOFF4X:
		case AUDIOFF5X:
		case AUDIOFF8X:
		case AUDIOFF10X:
		case AUDIOFF20X:
		case AUDIOFF16X:
		case AUDIOFF30X:
		case AUDIOFF32X:
		case AUDIOFF60X:
			//to check DSP mode
			if (regs0->dsp24_port[5]!=0) {
				regs0->dsp24_port[0] = 0x0200 | cType;
                #ifdef AUDKRNL_DBG
				printf("DSPKRNL : set AUDIO FF-%d x ", cType);
                #endif
			}
			break;
			
		case AUDIOFF2PLAY:
            #ifdef AUDKRNL_DBG 
            printf("DSPKRNL : set AUDIOFF2PLAY "); 
            #endif
			break;
			
		default:
			iRes = -1;
			break;
		} //end of switch (cType)
		
		break;
        case OUTMODE:
            regs0->dsp24_port[0] = 0x0300 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set OUTMODE:%d %x", cType, regs0->dsp24_port[1]);
            #endif
            break;
        case VOLUME:            
            DSP_Set_Vol(cType);//dsp3_if_set_vol(cType);//terry,2004/2/11 05:40PM
	        break;
        case KEY:
            regs0->dsp24_port[0] = 0x0500 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set KEY:%d ", cType);
            #endif
            break;
        case ECHO:
            regs0->dsp24_port[0] = 0x0600 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set ECHO:%d ", cType);
            #endif
            break;
        case SURROUND:
            regs0->dsp24_port[0] = 0x0700 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SURROUND:%d ", cType);
            #endif
            break;
        case SUBWOOF:
            regs0->dsp24_port[0] = 0x0800 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SUBWOOF:%d ", cType);
            #endif
            break;
        #ifdef TEST_BASS_MANAGEMENT 
            #ifdef TEST_BASS_COMMAND
        case BASSMANAGEMENT:        
            regs0->dsp24_port[0] = 0x2000 | cType;			                  

            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set BASS_MANAGEMENT:%x\n", wParam);
            #endif
             break;   
            #endif
        #endif    
        case SPDIF:
            if (is_dts_force_spdif_bitstream() && cType==1) 
                cType=2;
            regs0->dsp24_port[0] = 0x0900 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SPDIF:%d ", cType);
            #endif
            break;
        case EQ:
            regs0->dsp24_port[0] = 0x0a00 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set EQ:%d ", cType);
            #endif
            break;
        case MIC:
            regs0->dsp24_port[0] = 0x0d00 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set MIC:%d ", cType);
            #endif
            break;
        case AD: // oliver : set AD Gain (MIC) Control, channel 1
        	DSP_ADCmd(0x1200,cType);//dsp_AD_cmd(0x1200,cType);
            break;
        case AD_2: // oliver : AD Gain, channel 2  //wangfeng 2003-09-12 17:11
        	DSP_ADCmd(0x1700,cType);//dsp_AD_cmd(0x1700,cType);
            break;
        case SPKDELAY:
            regs0->dsp24_port[0] = 0x0c00 | cType;
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SPKDELAY(%d):%d ms\n", cType, wParam);
            #endif			
            break;			
        case FSPKGAIN:
            regs0->dsp24_port[0] = 0x1300 | (VolTab[cType*2]);//nono 2003-9-3 11:54 add"*2"
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set FSPKGAIN:%d\n", cType);
            #endif			
            break;
        #if !defined(CNTR_5SPK_VOLUME)
        case CSPKGAIN:
          #ifdef YUXING_DVD
            //wangap add it when CSPKGAIN is 0/1 the volumn is wrong 2003/12/23
            if((cType+2)==257)
                regs0->dsp24_port[0] = 0x1500 | 0x02;
            else if((cType+2)==256)
                regs0->dsp24_port[0] = 0x1500 | 0x00;
            else
                regs0->dsp24_port[0] = 0x1500 | (VolTab[(cType+2)*2]);
          #else
            regs0->dsp24_port[0] = 0x1500 | (VolTab[cType*2]);
          #endif
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set CSPKGAIN:%d\n", cType);
            #endif			
            break;
        #endif

        case SSPKGAIN:
            regs0->dsp24_port[0] = 0x1400 | (VolTab[cType*2]);//nono 2003-9-3 11:54 add"*2"
			
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SSPKGAIN:%d\n", cType);
            #endif			
            break;

        #ifdef CNTR_5SPK_VOLUME
        case FLSPKGAIN:
            regs0->dsp24_port[0] = 0x1A00 | (VolTab[cType]);
		  #ifdef VOLUME_RECODE
			{  
			    int volume;			     	
				printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
				volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+1, (BYTE *)&volume_5SPK[1], 1);
            }
	      #endif
	    	#ifdef AUDKRNL_DBG
            printf("DSPKRNL : set FLSPKGAIN:%d\n", cType);
            #endif
            break;
        case FRSPKGAIN:
            regs0->dsp24_port[0] = 0x1B00 | (VolTab[cType]);
	      #ifdef VOLUME_RECODE
			{  
			    int volume;			     	
				printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
			    volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+2, (BYTE *)&volume_5SPK[2], 1);
            }
	      #endif		
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set FRSPKGAIN:%d\n", cType);
            #endif
            break;
        case SLSPKGAIN:
            regs0->dsp24_port[0] = 0x1C00 | (VolTab[cType]);
	      #ifdef VOLUME_RECODE
			{  
			    int volume;			     	
				printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
			    volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+3, (BYTE *)&volume_5SPK[3], 1);
            }
	      #endif	
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SLSPKGAIN:%d\n", cType);
            #endif
            break;
        case SRSPKGAIN:
            regs0->dsp24_port[0] = 0x1D00 | (VolTab[cType]);
	      #ifdef VOLUME_RECODE
			{  
			    int volume;			     	
				printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
			    volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+4, (BYTE *)&volume_5SPK[4], 1);
			}
	      #endif	
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SRSPKGAIN:%d\n", cType);
            #endif
            break;
        case CSPKGAIN:
            regs0->dsp24_port[0] = 0x1500 | (VolTab[cType]);
	      #ifdef VOLUME_RECODE
			{  
			    int volume;			     	
				printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
			    volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+5, (BYTE *)&volume_5SPK[5], 1);
			}
	      #endif	
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set CSPKGAIN:%d\n", cType);
            #endif			
            break;
        case SWSPKGAIN: //Jeff 20031028
            regs0->dsp24_port[0] = 0x1E00 | (VolTab[cType]);
          #ifdef VOLUME_RECODE
            {  
                int volume;			     	
                printf("DSPKRNL : set audio_vol=%d\n",audio_volume);
			    volume=WriteToI2c(I2C_ID_MEMORY, ADDR_I2C_VOLUME+6, (BYTE *)&volume_5SPK[6], 1);
            }
          #endif	
            #ifdef AUDKRNL_DBG
            printf("DSPKRNL : set SWSPKGAIN:%d\n", cType);
            #endif
            break;
        #endif //#ifdef CNTR_5SPK_VOLUME

        #ifdef SUPPORT_PROLOGIC_II		// alan, 2003/7/11 03:28

⌨️ 快捷键说明

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