DECODER_config.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002                            C   M O D U L E   F I L E
00003 
00004     Copyright (c) 2003 Neuros Audio LLC, All rights reserved.
00005 
00006 ******************************************************************************/
00007 
00021 
00022 /*-- HEADER FILE INCLUDES ---------------------------------------------------*/
00023 #include "../SYSTEM/sys_hardware.h"
00024 #include "../SYSTEM/sys_assert.h"
00025 #include "../codec/codec.h"
00026 #include "../coder/coder.h"
00027 #include "decoder.h"
00028 
00029 /*-- LOCAL DEFINITIONS ------------------------------------------------------*/
00030 static void _xDAIS_init( void );
00031 static void _wavConfig(void);
00032 static void _mp3Config(void);
00033 static void _wmaConfig(void);
00034 static void _oggConfig(void);
00035 
00036 /*-- STATIC DATA ------------------------------------------------------------*/
00037 #pragma DATA_SECTION(_decPipeBuf,   "decoder_global")
00038 // Allocte decoder pipe buffer separately to prevent memory fragmentation
00039 // due to track changes among different formated music.
00040 #define _DEC_PIPE_BUF_LEN           ((576+2)*4)
00041 static int * _decPipeBuf;
00042 
00043 /*-- GLOBAL DATA ------------------------------------------------------------*/
00044 #pragma DATA_SECTION(Decoder,       "idata_resident")
00049 st_DECODER Decoder;
00050 
00051 #pragma DATA_SECTION(Decode,        "decoder_global")
00052 #pragma DATA_SECTION(Decode_memRec, "decoder_global")
00053 #pragma DATA_SECTION(Decode_params, "decoder_global")
00054 #pragma DATA_SECTION(SpecAn,        "decoder_global")
00055 #pragma DATA_SECTION(SpecAn_memRec, "decoder_global")
00056 #pragma DATA_SECTION(SpecAn_params, "decoder_global")
00057 /* These globals can be unioned with that of the encoder. */
00058 IDECODE_Obj *       Decode;
00059 IALG_MemRec *       Decode_memRec;
00060 IDECODE_Params *    Decode_params;
00061                                
00062 ISPECAN_Obj *       SpecAn;
00063 IALG_MemRec *       SpecAn_memRec;
00064 ISPECAN_Params *    SpecAn_params;
00065 
00066 #pragma DATA_SECTION(Bitbuf_params, "decoder_global")
00067 BITBUF_Params Bitbuf_params;
00068 
00069 extern Uns mp3BitstreamData[];
00070 extern Uns wavBitstreamData[];
00071 
00072 #ifdef WMA_SUPPORT
00073 extern void WMA_task(void);
00074 extern Uns wmaBitstreamData[];
00075 extern IDECODE_Obj WMA_TI_obj0;
00076 extern IDECODE_Params WMA_TI_obj0_params;
00077 extern IALG_MemRec WMA_TI_obj0_memRec[];
00078 extern SramPP_Obj SRAMPP;
00079 #endif
00080 
00081 #ifdef WAV_SUPPORT
00082 extern unsigned long wvReadPtr;
00083 extern unsigned long wvEndOfReadPtr;
00084 extern unsigned short wvSilence;
00085 #endif
00086 
00087 extern Uns mp3BitstreamData[];
00088 
00089 /*-- FUNCTIONS --------------------------------------------------------------*/
00090 #pragma CODE_SECTION(DECODER_config, ".decoder_code")
00097 BOOL DECODER_config( DEC_TYPE eType )
00098 {
00099     Decoder.type = eType;
00100     
00101     Coder.subcoder  = DECODER__nullsubcoder;
00102     Coder.cache     = DECODER_cache;
00103     Coder.cacheInit = DECODER_cacheInit;
00104     Coder.mediaInit = NULL;
00105     
00106     _decPipeBuf = (int*)malloc(_DEC_PIPE_BUF_LEN);
00107     if(NULL == _decPipeBuf) SYS_die(SYS_DECODER_CONFIG);
00108     
00109     switch(eType)
00110     {
00111         #ifdef WAV_SUPPORT
00112         case DECWAV:    _wavConfig();       break;
00113         #endif // WAV_SUPPORT
00114         case DECMP3:    _mp3Config();       break;
00115         #ifdef WMA_SUPPORT
00116         case DECWMA:    _wmaConfig();       break;
00117         #endif // WMA_SUPPORT
00118         #ifdef OGG_SUPPORT
00119         case DECOGG:    _oggConfig();       break;          
00120         #endif //OGG_SUPPORT
00121     }
00122    
00123     /* Reset the decoder pipe. */
00124     PIPE_reset(&Decoder.pipe);
00125    
00126     /* Clear decoder file flag. */
00127     Decoder.flag = 0;
00128     
00129     return TRUE;
00130 }
00131 
00132 
00133 #pragma CODE_SECTION(DECODER_releaseObj, ".decoder_code")
00137 void DECODER_releaseObj(void)
00138 {
00139     //PIPE_delete(&Decoder.pipe);
00140     if(_decPipeBuf) free(_decPipeBuf);
00141     _decPipeBuf = NULL;
00142     
00143     #ifdef WMA_SUPPORT
00144     if(AF_WMA == Audio.format) sramPP_delete(&SRAMPP);
00145     #endif
00146 }
00147 
00148 
00149 #pragma CODE_SECTION(_xDAIS_init, ".decoder_code")
00150 static void _xDAIS_init( void )
00151 {
00152     Decoder.decode      = Decode;   
00153     Decoder.decrypt     = &Decrypt;
00154     Decoder.specan      = SpecAn;
00155     
00156     /* This should be the input bitstream buffer size. */
00157     //Decoder.buffer_size =  INPUT_BUFFER_SIZE;
00158         
00159     if (Decoder.decrypt) 
00160     {       
00161             #if 0
00162         Bitbuf_params.numberOfBitstreams = 3;       
00163         BITBUF_init(&Decoder.bitbuf, &Bitbuf_params);
00164         Decoder.inputBitstrm        = &Decoder.bitbuf.bitstream[2];
00165         Decoder.decryptBitstrm  = &Decoder.bitbuf.bitstream[1];
00166         Decoder.decodeBitstrm   = &Decoder.bitbuf.bitstream[0];
00167             #endif
00168     }
00169     else 
00170     {      
00171         BITBUF_init(&Decoder.bitbuf, &Bitbuf_params);      
00172         Decoder.inputBitstrm        = &Decoder.bitbuf.bitstream[1];
00173         Decoder.decryptBitstrm  = 0;
00174         Decoder.decodeBitstrm   = &Decoder.bitbuf.bitstream[0];
00175     }
00176     
00177     SCRYPT_algInit(&Decrypt, Decrypt_memRec, NULL, &Decrypt_params);
00178     DECODE_algInit(Decode, Decode_memRec, NULL, Decode_params);
00179     SPECAN_algInit(SpecAn, SpecAn_memRec, NULL, SpecAn_params);
00180     DECODE_reset(Decoder.decode);
00181 }
00182 
00183 #ifdef WAV_SUPPORT
00184 #pragma CODE_SECTION(_wavConfig, ".wav_code")
00185 // Function configs WAV decoder.
00186 static void _wavConfig(void)
00187 {
00188     Coder.coder                     = DECODER__wav;
00189     Coder.media                     = DECODER__wavmedia;            
00190     Coder.init                      = DECODER__wavfirst;
00191     /* Create pipes. */
00192     if( PIPE_init(&Decoder.pipe, WAV_PIPE_FRAMELEN, 4, 
00193                     _decPipeBuf, _DEC_PIPE_BUF_LEN) == 0 ) 
00194         SYS_die(SYS_DECODER_CONFIG_WAV);
00195 
00196     Decoder.data                    = &wavBitstreamData[0];
00197     Decoder.buffer_size             =  WAV_INPUT_BUFFER_SIZE;
00198     Bitbuf_params.numberOfBitstreams= 2;
00199     Bitbuf_params.startOfBuffer     = &Decoder.data[0];
00200     Bitbuf_params.endOfBuffer       = &Decoder.data[WAV_INPUT_BUFFER_SIZE];
00201 
00202     Bitbuf_params.bitstream         = 0;
00203     Bitbuf_params.maxFreeSpace      = 0;
00204                 
00205     BITBUF_init(&Decoder.bitbuf, &Bitbuf_params);      
00206     Decoder.inputBitstrm        = &Decoder.bitbuf.bitstream[1];
00207     Decoder.decryptBitstrm      = 0;
00208     Decoder.decodeBitstrm       = &Decoder.bitbuf.bitstream[0]; 
00209     
00210     wvReadPtr      = 0L;    
00211     wvEndOfReadPtr = 0L;
00212     wvSilence      = 0;
00213 }
00214 #endif
00215 
00216 #pragma CODE_SECTION(_mp3Config, ".mp3_code")
00217 // Function configs MP3 decoder.
00218 static void _mp3Config(void)
00219 {
00220     Coder.coder                     = DECODER__mp3;
00221     Coder.media                     = DECODER__mp3media;
00222     Coder.init                      = DECODER__mp3first;
00223             
00224     Decoder.data                    = &mp3BitstreamData[0];
00225     Decoder.buffer_size             =  INPUT_BUFFER_SIZE;
00226     Bitbuf_params.numberOfBitstreams= 2;
00227     Bitbuf_params.startOfBuffer     = &Decoder.data[0];
00228     Bitbuf_params.endOfBuffer       = &Decoder.data[INPUT_BUFFER_SIZE];
00229 
00230     Bitbuf_params.bitstream         = 0;
00231     Bitbuf_params.maxFreeSpace      = 0;
00232 
00233     /* Create pipes. */
00234     if( PIPE_init(&Decoder.pipe, MP3_PIPE_FRAMELEN, 2, 
00235                     _decPipeBuf, _DEC_PIPE_BUF_LEN) == 0 ) 
00236         SYS_die(SYS_DECODER_CONFIG_MP3);
00237             
00238     Decode          = &MP3_TI_obj0;         
00239     Decode_memRec   = MP3_TI_obj0_memRec;           
00240     Decode_params   = &MP3_TI_obj0_params;                               
00241     SpecAn          = &SPECMP3_TI_obj0;         
00242     SpecAn_memRec   = SPECMP3_TI_obj0_memRec;           
00243     SpecAn_params   = &SPECMP3_TI_obj0_params;
00244             
00245     _xDAIS_init();
00246     
00247     mp3ReadPtr      = 0;
00248     mp3EndOfReadPtr = 0;
00249     mp3Silence      = 0;
00250     mp3FrameIdx     = 0;
00251 }
00252 
00253 #ifdef WMA_SUPPORT
00254 #pragma CODE_SECTION(_wmaConfig, ".wma_code")
00255 // Function configs WMA decoder.
00256 static void _wmaConfig(void)
00257 {
00258     Coder.coder                     = DECODER__wma;
00259     Coder.subcoder                  = DECODER__wmatask;
00260     Coder.media                     = DECODER__wmamedia;            
00261     Coder.init                      = DECODER__wmafirst;
00262     Coder.subcoderInit              = DECODER__wmainit;
00263 
00264     Decoder.data                    = &wmaBitstreamData[0];
00265     Decoder.buffer_size             =  WMA_INPUT_BUFFER_SIZE;
00266     Bitbuf_params.numberOfBitstreams= 2;
00267     Bitbuf_params.startOfBuffer     = &Decoder.data[0];
00268     Bitbuf_params.endOfBuffer       = &Decoder.data[WMA_INPUT_BUFFER_SIZE];
00269 
00270     Bitbuf_params.bitstream         = 0;
00271     Bitbuf_params.maxFreeSpace      = 0;
00272             
00273     if( PIPE_init(&Decoder.pipe, WMA_PIPE_FRAMELEN, 2, 
00274                     _decPipeBuf, _DEC_PIPE_BUF_LEN) == 0 ) 
00275         SYS_die(SYS_DECODER_CONFIG_WMA);
00276             
00277     if (sramPP_init(&SRAMPP, 4096) == FALSE ) 
00278         SYS_die(SYS_DECODER_CONFIG_WMA2);
00279             
00280     Decode          = &WMA_TI_obj0;
00281     Decode_memRec   = WMA_TI_obj0_memRec;
00282     Decode_params   = &WMA_TI_obj0_params;
00283     SpecAn          =  0;
00284     SpecAn_memRec   = 0;
00285     SpecAn_params   = 0;
00286             
00287     _xDAIS_init();
00288 }
00289 #endif
00290 
00291 #ifdef OGG_SUPPORT
00292 #pragma CODE_SECTION(_oggConfig, ".ogg_code")
00293 // Function configs OGG decoder.
00294 static void _oggConfig(void)
00295 {
00296     Coder.coder                     = DECODER__ogg;
00297     Coder.media                     = DECODER__oggmedia;            
00298     Coder.init                      = DECODER__oggfirst;
00299 
00300     /* Create pipes. */
00301     if( PIPE_init(&Decoder.pipe, OGG_PIPE_FRAMELEN, 32, 
00302                     _decPipeBuf, _DEC_PIPE_BUF_LEN) == 0 ) 
00303         SYS_die(SYS_DECODER_CONFIG_OGG);
00304 }
00305 #endif
00306 
00307 
00308 #pragma CODE_SECTION(DECODER__nullsubcoder, ".decoder_code")
00309 BOOL DECODER__nullsubcoder( void ){return TRUE;}
00310 
00311 
00312 /*****************************************************************************
00313                 Neuros Audio LLC. Confidential Proprietary
00314  *****************************************************************************/

Generated on Wed Jan 19 01:12:38 2005 for neuros-firmware by  doxygen 1.3.9.1