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

📄 audkernel.c

📁 Sunplus 8202S source code.
💻 C
字号:
#include "memmap0.h"
#include "audkernel.h"
#include "DSP3Codec.inc"        // 2004/11/18 yltseng
#include "NESInit.h"

/*WMA/HDCD:
* "This product is protected by certain intellectual property rights of
* Microsoft and cannot be used or further
* distributed without a license from Microsoft.
*/


/***********************************************************************
 *  Macro define Session
 ***********************************************************************/
/*============================================================*/
// To ease the control of audio clocks,
// currently PCMBCK, IECBCK, ADCBCK all source from XCK.
// as a result, when changing sampling frequency, only XCK change is need.
//
// note: if there are needs for enable/disable individual clocks
// we must increase other interfaces
    
#ifndef SPHE1000
  #ifdef SUPPORT_384_XCK //defined in user_init.h
    static const UINT16 xck_clk_fs_table[] = 
    {
        AUDCLK_384XCK_12288, AUDCLK_384XCK_16934, AUDCLK_384XCK_18432, 0, 0,
        AUDCLK_384XCK_33869, AUDCLK_384XCK_36864, 0, 0,
        AUDCLK_384XCK_67736, AUDCLK_384XCK_73728, 0, 0
    };
#define	AUD_BCK_SETTING AUDCLK_64BCK_384
#define	AUD_IEC_SETTING	AUDCLK_128IEC_384
#define	AUD_ADC_SETTING	AUDCLK_64ADC_384
  #else // 256fs
    static const UINT16 xck_clk_fs_table[] = 
    {
        AUDCLK_256XCK_08192, AUDCLK_256XCK_11290, AUDCLK_256XCK_12288, 0, 0,
        AUDCLK_256XCK_22579, AUDCLK_256XCK_24576, 0, 0,
        AUDCLK_256XCK_45158, AUDCLK_256XCK_49152, 0, 0
    };
#define	AUD_BCK_SETTING AUDCLK_64BCK_256
#define	AUD_IEC_SETTING	AUDCLK_128IEC_256
#define	AUD_ADC_SETTING	AUDCLK_64ADC_256
  #endif
#else // SPHE1000
  #ifdef	SUPPORT_384_XCK	//defined in user_init.h    
    static const UINT16 xck_clk_fs_table[] = 
    {
        AUDCLK_384XCK_12288, AUDCLK_384XCK_18432, AUDCLK_384XCK_18432, 0, 0,
        AUDCLK_384XCK_36864, AUDCLK_384XCK_36864, 0, 0,
        AUDCLK_384XCK_73728, AUDCLK_384XCK_73728, 0, 0
    };
#define	AUD_BCK_SETTING	AUDCLK_64BCK_384
#define	AUD_IEC_SETTING	AUDCLK_128IEC_384
#define	AUD_ADC_SETTING	AUDCLK_64ADC_384
  #else		// 256fs
    static const UINT16 xck_clk_fs_table[] = 
    {
        AUDCLK_256XCK_08192, AUDCLK_256XCK_12288, AUDCLK_256XCK_12288, 0, 0,
        AUDCLK_256XCK_24576, AUDCLK_256XCK_24576, 0, 0,
        AUDCLK_256XCK_49152, AUDCLK_256XCK_49152, 0, 0
    };
#define	AUD_BCK_SETTING	AUDCLK_64BCK_256
#define	AUD_IEC_SETTING	AUDCLK_128IEC_256
#define	AUD_ADC_SETTING	AUDCLK_64ADC_256
  #endif //#ifdef SUPPORT_384_XCK
#endif //#ifndef SPHE1000


#define get_dsp3_im_ptr()	get_dsp_im_ptr(0,0)
#define	get_dsp3_pm_ptr()	get_dsp_pcm_ptr(0,0)
#define	get_dsp3_dm_ptr()	get_dsp_aud_ptr(0,0)

extern int dsp3_decompress(const BYTE *rom, BYTE *dst);
#define	dsp3_setupim(rom,len)		dsp3_decompress(rom,get_dsp3_im_ptr()+0)
#define	dsp3_setupdm(rom,len,off)	dsp3_decompress(rom,get_dsp3_dm_ptr()+off)
#define	dsp3_setuppm(rom,len,off)	dsp3_decompress(rom,get_dsp3_pm_ptr()+off)

#define	DSP_RESET()	(regs0->dsp24_control=RF_DSP24_RESET)
#define	DSP_STALL()	(regs0->dsp24_control=RF_DSP24_STALL)
#define	DSP_GO()	(regs0->dsp24_control=0)

extern void dsp3_config(void);

/***********************************************************************
 *  Code Session
 ***********************************************************************/
    
void AUDKRNL_Init_AudHW_CLK(void)
{
        AUD_ENABLE_XCK_PAD();
    
#ifndef NO_AUD_SET_BCK
        AUD_SET_BCK(AUD_BCK_SETTING);
#endif//#ifndef NO_AUD_SET_BCK
    
        AUD_SET_IEC(AUD_IEC_SETTING);
        AUD_SET_ADC(AUD_ADC_SETTING);
        AUD_SET_XCK(xck_clk_fs_table[FS_48K]);
    
#ifdef SPHE1000
        AUD_CLR_PLLA();
        AUD_SET_PLLA(1);
#endif
   
        AUD_ENABLE_XCK_CLK();
}


// FUNCTION DESCRIPTION : 
//      Set Audio Hardware Clock
//
void AUDKRNL_Set_AudHW_SmpRate(unsigned fs)
{
	int index=0;
	
#ifndef NO_AUD_SET_BCK
    AUD_SET_BCK(AUD_BCK_SETTING);
#endif//#ifndef NO_AUD_SET_BCK

    AUD_SET_IEC(AUD_IEC_SETTING);
    AUD_SET_ADC(AUD_ADC_SETTING);
    
#ifdef SPHE1000
	//printf("cfg6: %x %x %x\n", ((fs&0x555)>0), index, fs);
	AUD_CLR_PLLA();
    AUD_SET_PLLA((fs&0x222)>0);
#endif

    while ((fs&0x1) == 0)
    {
    	fs >>= 1;
    	index++;
    	if (index >= 12)
    		break;
    }

#ifdef CS4334_AUDIO_CLK_DELAY_TURN_ON//gerry add it for avoid cs4334 power on noise,but it is not very good to add it here,2004-7-19 21:26
    delay_1ms(100);
#endif//CS4334_AUDIO_CLK_DELAY_TURN_ON

    AUD_SET_XCK(xck_clk_fs_table[index]);
    AUD_ENABLE_XCK_CLK();
}


//
// FUNCTION DESCRIPTION
//      generic dsp3 program download
//    2003/06/06, Bug fixed for AC3->VCD playback switch
//      disable audio output before DSP reset, to cancel any noises of decoder change
//      audio will be enabled automatically by DSP.

INT16 AUDKRNL_Download_DSP3Codec(const BYTE *rom, int len) //(int dsp3_coding_mode)
{
    int res=0;
    
	regs0->aud_enable = 0; //disable PCM H/W (PCM, SPDIF, ADC)
	DSP_RESET(); //reset dsp24 always disable audio before dsp_reset
	
	dsp3_config(); //config pdm and audio bitstream buffer
	
	// Move MP3 PM, DM table
	if(rom == DSP3code_MP3)
	{
		#ifdef	MP3_JPEG_COWORK//enlarge the audio buffer size
		//refer to line 67
		dsp3_setuppm(DSPMP3DMTab,DSPMP3DMlen,0x1420*3);
		dsp3_setuppm(DSPMP3PMTab,DSPMP3PMlen,0x24c0*3);
		#else
		//refer to line 70
		dsp3_setupdm(DSPMP3PMTab,DSPMP3PMlen,0x0c00*3);
		dsp3_setuppm(DSPMP3DMTab,DSPMP3DMlen,0x1420*3);
		#endif
	}
	
	// copy im
	if ((res=dsp3_setupim(rom,len)) < 0) {
        #ifdef AUDDRV_DBG //	MONE_DSP3_ERROR
		auddbg_puts("*ERROR* gunzip dsp code error\n");
        #endif
	}
	else{
        #ifdef SUPPORT_NESGAME
		int i;
		if(rom == DSP3code_NES) {
			for (i=0;i<15;i++)
				regs0->dsp24_port[i]=0;
			
			//DAC initialize format bit8~15, set playback rate(bit-0 ~ bit-1)
			regs0->dsp24_port[4]|=(DACFORMAT<<8)|SOUND_PLAYBACK_ID;
		}
        #endif	// end of SUPPORT_NESGAME

        #ifdef NO_AUDIO_DSP
		return res;
        #endif

    #ifdef SETUP_DONT_PAUSE             
      #ifdef SUPPORT_NESGAME   
        if(coding_mode_now!=AUDIF_CODING_MODE_NES)
      #endif                
            regs0->dsp24_port[5]=-1;
    #endif                

		DSP_GO();
	}
    return res;
}

static inline void AUDKRNL_Set_DSP_Buffer_Addr( const DSP3_CODEC_INFO* pCodecInfo, int coding_mode )
{   // 2004/11/18 yltseng
    #ifdef MOVE_WMA_DSP_CODEC_ADDR//terry,2004/1/12 05:02PM // 2004/09/16 yltseng
    if( (cd_type_loaded==CDROM)&&(coding_mode==AUDIF_CODING_MODE_WMA) )
        set_aud_buf( A_DSP24_WMA_YA, A_DSP24_WMA_YA + pCodecInfo->uiDSPIM, A_DSP24_WMA_YA + pCodecInfo->uiDSPIM + pCodecInfo->uiDSPPM );
    else
    #endif
    #ifdef MOVE_PAL_AUDYA
    if( regs0->mc_compress != 0 )
        set_aud_buf( P_DSP24YA, P_DSP24YA + pCodecInfo->uiDSPIM, P_DSP24YA + pCodecInfo->uiDSPIM + P_DSP24YA + pCodecInfo->uiDSPPM );
    else
    #endif
        set_aud_buf( A_DSP24YA, A_DSP24YA + pCodecInfo->uiDSPIM, A_DSP24YA + pCodecInfo->uiDSPIM + pCodecInfo->uiDSPPM );
}

// FUNCTION DESCRIPTION : 
//      download specific DSP codec
//
void AUDKRNL_Download_Codec(int coding_mode)
{   // 2004/11/18 yltseng
    #ifdef  MONE_DOWNLOAD_CODEC //debug msg enhancement
    auddbg_printf("\n-------><download - coding_mode:0x%x>\n",coding_mode);
    auddbg_printf("-------><0x1:AC3 0x2:PPCM 0x40:DTS 0x100:MP3 0x200:PCM>\n");
    auddbg_printf("-------><0x400:MIDI 0x1000:SPDIF 0x2000:DTSCD 0x4000:WMA>\n");
    #endif
	
    //??? Is it still necessary? already done in AUDKRNL_Download_DSP3Codec()
    #ifndef SPHE1000	// barry remove it in HE1000 because in dsp3_download had stop it
    regs0->aud_enable = 0;  // disable PCM H/W (PCM, SPDIF, ADC)
    DSP_RESET();            // force dsp stop.
    #endif
    
    #if ( defined(SDRAM_16Mb_Mode) && !defined(SDRAM16M_5_1CH) && !defined(RAW_HAVE_ANALOG_OUTPUT) ) 
    if( ( coding_mode == AUDIF_CODING_MODE_AC3 ) && setup_IsSet2SPDIF_Bitstream() )
		coding_mode = AUDIF_CODING_MODE_SPDIF;
    #endif
    
    UINT32 uiIndex = GetDSPCodecIndex( coding_mode );
    const DSP3_CODEC_INFO* pCodecInfo = GetDSPCodecInfo( uiIndex );
    AUDKRNL_Set_DSP_Buffer_Addr( pCodecInfo, coding_mode );
    AUDKRNL_Download_DSP3Codec( pCodecInfo->pDSPcode, 0 );
}


UINT32 AUDKRNL_LPCM_Get_BitDepthParam(UINT32 bitsample)
{
	switch (bitsample)
	{
		case 8:
			return 4;
		case 20:
			return 1;
		case 24:
			return 2;
		case 32:
			return 3;
		default:
			return 0;
	}
}

UINT32 AUDKRNL_LPCM_Get_FrqParam(UINT32 samprate)
{
	UINT32 s1;

	if (samprate == 0)
		return 0;

	if (samprate<7000)			// 5 : 6 kHz
		s1 = 5;
	else if (samprate<9500)		// 20 : 8 kHz
		s1 = 20;
	else if (samprate<11500)	// 12 : 11.025 kHz
		s1 = 12;
	else if (samprate<14000)	// 4 : 12 kHz
		s1 = 4;
	else if (samprate<19000)	// 19 : 16 kHz
		s1 = 19;
	else if (samprate<23000)	// 11 : 22.05 kHz
		s1 = 11;
	else if (samprate<28000)	// 3 : 24 kHz
		s1 = 3;
	else if (samprate<38000)	// 16 : 32 kHz
		s1 = 16;				
	else if (samprate<46000)	// 8 : 44.1 kHz
		s1 = 8;
	else if (samprate<68000)	// 0 : 48 kHz
		s1 = 0;
	else if (samprate<92000)	// 9 : 88.2 kHz
		s1 = 9;
	else if (samprate<136000)	// 1 : 96 kHz
		s1 = 1;
	else if (samprate<184000)	// 10 : 176.4 kHz
		s1 = 10;
	else						// 2 : 192 kHz
		s1 = 2;

	return s1;
}


⌨️ 快捷键说明

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