audkernel.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:9k
源码类别:

DVD

开发平台:

C/C++

  1. #include "memmap0.h"
  2. #include "audkernel.h"
  3. #include "DSP3Codec.inc"        // 2004/11/18 yltseng
  4. #include "NESInit.h"
  5. /*WMA/HDCD:
  6. * "This product is protected by certain intellectual property rights of
  7. * Microsoft and cannot be used or further
  8. * distributed without a license from Microsoft.
  9. */
  10. /***********************************************************************
  11.  *  Macro define Session
  12.  ***********************************************************************/
  13. /*============================================================*/
  14. // To ease the control of audio clocks,
  15. // currently PCMBCK, IECBCK, ADCBCK all source from XCK.
  16. // as a result, when changing sampling frequency, only XCK change is need.
  17. //
  18. // note: if there are needs for enable/disable individual clocks
  19. // we must increase other interfaces
  20.     
  21. #ifndef SPHE1000
  22.   #ifdef SUPPORT_384_XCK //defined in user_init.h
  23.     static const UINT16 xck_clk_fs_table[] = 
  24.     {
  25.         AUDCLK_384XCK_12288, AUDCLK_384XCK_16934, AUDCLK_384XCK_18432, 0, 0,
  26.         AUDCLK_384XCK_33869, AUDCLK_384XCK_36864, 0, 0,
  27.         AUDCLK_384XCK_67736, AUDCLK_384XCK_73728, 0, 0
  28.     };
  29. #define AUD_BCK_SETTING AUDCLK_64BCK_384
  30. #define AUD_IEC_SETTING AUDCLK_128IEC_384
  31. #define AUD_ADC_SETTING AUDCLK_64ADC_384
  32.   #else // 256fs
  33.     static const UINT16 xck_clk_fs_table[] = 
  34.     {
  35.         AUDCLK_256XCK_08192, AUDCLK_256XCK_11290, AUDCLK_256XCK_12288, 0, 0,
  36.         AUDCLK_256XCK_22579, AUDCLK_256XCK_24576, 0, 0,
  37.         AUDCLK_256XCK_45158, AUDCLK_256XCK_49152, 0, 0
  38.     };
  39. #define AUD_BCK_SETTING AUDCLK_64BCK_256
  40. #define AUD_IEC_SETTING AUDCLK_128IEC_256
  41. #define AUD_ADC_SETTING AUDCLK_64ADC_256
  42.   #endif
  43. #else // SPHE1000
  44.   #ifdef SUPPORT_384_XCK //defined in user_init.h    
  45.     static const UINT16 xck_clk_fs_table[] = 
  46.     {
  47.         AUDCLK_384XCK_12288, AUDCLK_384XCK_18432, AUDCLK_384XCK_18432, 0, 0,
  48.         AUDCLK_384XCK_36864, AUDCLK_384XCK_36864, 0, 0,
  49.         AUDCLK_384XCK_73728, AUDCLK_384XCK_73728, 0, 0
  50.     };
  51. #define AUD_BCK_SETTING AUDCLK_64BCK_384
  52. #define AUD_IEC_SETTING AUDCLK_128IEC_384
  53. #define AUD_ADC_SETTING AUDCLK_64ADC_384
  54.   #else // 256fs
  55.     static const UINT16 xck_clk_fs_table[] = 
  56.     {
  57.         AUDCLK_256XCK_08192, AUDCLK_256XCK_12288, AUDCLK_256XCK_12288, 0, 0,
  58.         AUDCLK_256XCK_24576, AUDCLK_256XCK_24576, 0, 0,
  59.         AUDCLK_256XCK_49152, AUDCLK_256XCK_49152, 0, 0
  60.     };
  61. #define AUD_BCK_SETTING AUDCLK_64BCK_256
  62. #define AUD_IEC_SETTING AUDCLK_128IEC_256
  63. #define AUD_ADC_SETTING AUDCLK_64ADC_256
  64.   #endif //#ifdef SUPPORT_384_XCK
  65. #endif //#ifndef SPHE1000
  66. #define get_dsp3_im_ptr() get_dsp_im_ptr(0,0)
  67. #define get_dsp3_pm_ptr() get_dsp_pcm_ptr(0,0)
  68. #define get_dsp3_dm_ptr() get_dsp_aud_ptr(0,0)
  69. extern int dsp3_decompress(const BYTE *rom, BYTE *dst);
  70. #define dsp3_setupim(rom,len) dsp3_decompress(rom,get_dsp3_im_ptr()+0)
  71. #define dsp3_setupdm(rom,len,off) dsp3_decompress(rom,get_dsp3_dm_ptr()+off)
  72. #define dsp3_setuppm(rom,len,off) dsp3_decompress(rom,get_dsp3_pm_ptr()+off)
  73. #define DSP_RESET() (regs0->dsp24_control=RF_DSP24_RESET)
  74. #define DSP_STALL() (regs0->dsp24_control=RF_DSP24_STALL)
  75. #define DSP_GO() (regs0->dsp24_control=0)
  76. extern void dsp3_config(void);
  77. /***********************************************************************
  78.  *  Code Session
  79.  ***********************************************************************/
  80.     
  81. void AUDKRNL_Init_AudHW_CLK(void)
  82. {
  83.         AUD_ENABLE_XCK_PAD();
  84.     
  85. #ifndef NO_AUD_SET_BCK
  86.         AUD_SET_BCK(AUD_BCK_SETTING);
  87. #endif//#ifndef NO_AUD_SET_BCK
  88.     
  89.         AUD_SET_IEC(AUD_IEC_SETTING);
  90.         AUD_SET_ADC(AUD_ADC_SETTING);
  91.         AUD_SET_XCK(xck_clk_fs_table[FS_48K]);
  92.     
  93. #ifdef SPHE1000
  94.         AUD_CLR_PLLA();
  95.         AUD_SET_PLLA(1);
  96. #endif
  97.    
  98.         AUD_ENABLE_XCK_CLK();
  99. }
  100. // FUNCTION DESCRIPTION : 
  101. //      Set Audio Hardware Clock
  102. //
  103. void AUDKRNL_Set_AudHW_SmpRate(unsigned fs)
  104. {
  105. int index=0;
  106. #ifndef NO_AUD_SET_BCK
  107.     AUD_SET_BCK(AUD_BCK_SETTING);
  108. #endif//#ifndef NO_AUD_SET_BCK
  109.     AUD_SET_IEC(AUD_IEC_SETTING);
  110.     AUD_SET_ADC(AUD_ADC_SETTING);
  111.     
  112. #ifdef SPHE1000
  113. //printf("cfg6: %x %x %xn", ((fs&0x555)>0), index, fs);
  114. AUD_CLR_PLLA();
  115.     AUD_SET_PLLA((fs&0x222)>0);
  116. #endif
  117.     while ((fs&0x1) == 0)
  118.     {
  119.      fs >>= 1;
  120.      index++;
  121.      if (index >= 12)
  122.      break;
  123.     }
  124. #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
  125.     delay_1ms(100);
  126. #endif//CS4334_AUDIO_CLK_DELAY_TURN_ON
  127.     AUD_SET_XCK(xck_clk_fs_table[index]);
  128.     AUD_ENABLE_XCK_CLK();
  129. }
  130. //
  131. // FUNCTION DESCRIPTION
  132. //      generic dsp3 program download
  133. //    2003/06/06, Bug fixed for AC3->VCD playback switch
  134. //      disable audio output before DSP reset, to cancel any noises of decoder change
  135. //      audio will be enabled automatically by DSP.
  136. INT16 AUDKRNL_Download_DSP3Codec(const BYTE *rom, int len) //(int dsp3_coding_mode)
  137. {
  138.     int res=0;
  139.     
  140. regs0->aud_enable = 0; //disable PCM H/W (PCM, SPDIF, ADC)
  141. DSP_RESET(); //reset dsp24 always disable audio before dsp_reset
  142. dsp3_config(); //config pdm and audio bitstream buffer
  143. // Move MP3 PM, DM table
  144. if(rom == DSP3code_MP3)
  145. {
  146. #ifdef MP3_JPEG_COWORK//enlarge the audio buffer size
  147. //refer to line 67
  148. dsp3_setuppm(DSPMP3DMTab,DSPMP3DMlen,0x1420*3);
  149. dsp3_setuppm(DSPMP3PMTab,DSPMP3PMlen,0x24c0*3);
  150. #else
  151. //refer to line 70
  152. dsp3_setupdm(DSPMP3PMTab,DSPMP3PMlen,0x0c00*3);
  153. dsp3_setuppm(DSPMP3DMTab,DSPMP3DMlen,0x1420*3);
  154. #endif
  155. }
  156. // copy im
  157. if ((res=dsp3_setupim(rom,len)) < 0) {
  158.         #ifdef AUDDRV_DBG // MONE_DSP3_ERROR
  159. auddbg_puts("*ERROR* gunzip dsp code errorn");
  160.         #endif
  161. }
  162. else{
  163.         #ifdef SUPPORT_NESGAME
  164. int i;
  165. if(rom == DSP3code_NES) {
  166. for (i=0;i<15;i++)
  167. regs0->dsp24_port[i]=0;
  168. //DAC initialize format bit8~15, set playback rate(bit-0 ~ bit-1)
  169. regs0->dsp24_port[4]|=(DACFORMAT<<8)|SOUND_PLAYBACK_ID;
  170. }
  171.         #endif // end of SUPPORT_NESGAME
  172.         #ifdef NO_AUDIO_DSP
  173. return res;
  174.         #endif
  175.     #ifdef SETUP_DONT_PAUSE             
  176.       #ifdef SUPPORT_NESGAME   
  177.         if(coding_mode_now!=AUDIF_CODING_MODE_NES)
  178.       #endif                
  179.             regs0->dsp24_port[5]=-1;
  180.     #endif                
  181. DSP_GO();
  182. }
  183.     return res;
  184. }
  185. static inline void AUDKRNL_Set_DSP_Buffer_Addr( const DSP3_CODEC_INFO* pCodecInfo, int coding_mode )
  186. {   // 2004/11/18 yltseng
  187.     #ifdef MOVE_WMA_DSP_CODEC_ADDR//terry,2004/1/12 05:02PM // 2004/09/16 yltseng
  188.     if( (cd_type_loaded==CDROM)&&(coding_mode==AUDIF_CODING_MODE_WMA) )
  189.         set_aud_buf( A_DSP24_WMA_YA, A_DSP24_WMA_YA + pCodecInfo->uiDSPIM, A_DSP24_WMA_YA + pCodecInfo->uiDSPIM + pCodecInfo->uiDSPPM );
  190.     else
  191.     #endif
  192.     #ifdef MOVE_PAL_AUDYA
  193.     if( regs0->mc_compress != 0 )
  194.         set_aud_buf( P_DSP24YA, P_DSP24YA + pCodecInfo->uiDSPIM, P_DSP24YA + pCodecInfo->uiDSPIM + P_DSP24YA + pCodecInfo->uiDSPPM );
  195.     else
  196.     #endif
  197.         set_aud_buf( A_DSP24YA, A_DSP24YA + pCodecInfo->uiDSPIM, A_DSP24YA + pCodecInfo->uiDSPIM + pCodecInfo->uiDSPPM );
  198. }
  199. // FUNCTION DESCRIPTION : 
  200. //      download specific DSP codec
  201. //
  202. void AUDKRNL_Download_Codec(int coding_mode)
  203. {   // 2004/11/18 yltseng
  204.     #ifdef  MONE_DOWNLOAD_CODEC //debug msg enhancement
  205.     auddbg_printf("n-------><download - coding_mode:0x%x>n",coding_mode);
  206.     auddbg_printf("-------><0x1:AC3 0x2:PPCM 0x40:DTS 0x100:MP3 0x200:PCM>n");
  207.     auddbg_printf("-------><0x400:MIDI 0x1000:SPDIF 0x2000:DTSCD 0x4000:WMA>n");
  208.     #endif
  209.     //??? Is it still necessary? already done in AUDKRNL_Download_DSP3Codec()
  210.     #ifndef SPHE1000 // barry remove it in HE1000 because in dsp3_download had stop it
  211.     regs0->aud_enable = 0;  // disable PCM H/W (PCM, SPDIF, ADC)
  212.     DSP_RESET();            // force dsp stop.
  213.     #endif
  214.     
  215.     #if ( defined(SDRAM_16Mb_Mode) && !defined(SDRAM16M_5_1CH) && !defined(RAW_HAVE_ANALOG_OUTPUT) ) 
  216.     if( ( coding_mode == AUDIF_CODING_MODE_AC3 ) && setup_IsSet2SPDIF_Bitstream() )
  217. coding_mode = AUDIF_CODING_MODE_SPDIF;
  218.     #endif
  219.     
  220.     UINT32 uiIndex = GetDSPCodecIndex( coding_mode );
  221.     const DSP3_CODEC_INFO* pCodecInfo = GetDSPCodecInfo( uiIndex );
  222.     AUDKRNL_Set_DSP_Buffer_Addr( pCodecInfo, coding_mode );
  223.     AUDKRNL_Download_DSP3Codec( pCodecInfo->pDSPcode, 0 );
  224. }
  225. UINT32 AUDKRNL_LPCM_Get_BitDepthParam(UINT32 bitsample)
  226. {
  227. switch (bitsample)
  228. {
  229. case 8:
  230. return 4;
  231. case 20:
  232. return 1;
  233. case 24:
  234. return 2;
  235. case 32:
  236. return 3;
  237. default:
  238. return 0;
  239. }
  240. }
  241. UINT32 AUDKRNL_LPCM_Get_FrqParam(UINT32 samprate)
  242. {
  243. UINT32 s1;
  244. if (samprate == 0)
  245. return 0;
  246. if (samprate<7000) // 5 : 6 kHz
  247. s1 = 5;
  248. else if (samprate<9500) // 20 : 8 kHz
  249. s1 = 20;
  250. else if (samprate<11500) // 12 : 11.025 kHz
  251. s1 = 12;
  252. else if (samprate<14000) // 4 : 12 kHz
  253. s1 = 4;
  254. else if (samprate<19000) // 19 : 16 kHz
  255. s1 = 19;
  256. else if (samprate<23000) // 11 : 22.05 kHz
  257. s1 = 11;
  258. else if (samprate<28000) // 3 : 24 kHz
  259. s1 = 3;
  260. else if (samprate<38000) // 16 : 32 kHz
  261. s1 = 16;
  262. else if (samprate<46000) // 8 : 44.1 kHz
  263. s1 = 8;
  264. else if (samprate<68000) // 0 : 48 kHz
  265. s1 = 0;
  266. else if (samprate<92000) // 9 : 88.2 kHz
  267. s1 = 9;
  268. else if (samprate<136000) // 1 : 96 kHz
  269. s1 = 1;
  270. else if (samprate<184000) // 10 : 176.4 kHz
  271. s1 = 10;
  272. else // 2 : 192 kHz
  273. s1 = 2;
  274. return s1;
  275. }