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

📄 cddsp.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 C
字号:
/*
** FILE
** cddsp.c
**
** DESCRIPTION
*/
#include "config.h"
#include "regmap.h"
#include "global.h"
#include "memmap.h"
#include "func.h"
#include "util.h"
#include "cdfunc.h"
#include "cd.h"
//#include "func.h"//redundancy
//#include "cfont.h"//no used
#include "ringbuf.h"
#include "sig.h"
#include "avd.h"
#include "cddsp.h"
#include "cdxa.h"
#include "epp.h"
#include "dma.h"
#ifdef SUPPORT_MP3_BUFFER_FULL_STOP
#include "auctrl.h"
#endif

//in mp3common.c
extern int mp3_abv_bitstream_size(void);

//#define MONE_CD_PAUSE
//#define MONE_CD_OSD_PAUSE
//#define MONE_CD_RESEEK



void set_cddsp_config(void)
{
    regs0->cddsp_config = cddsp_config;
}

void set_cddsp_config_cdda(void)
{
    regs0->cddsp_control = RF_CDDSP_RESET | RF_CDDSP_STOP;
    regs0->cddsp_config = cddsp_config | RF_CD_DATA_raw | RF_CD_DATA_nosync;
    regs0->cddsp_control = 0;
}


/*
** FUNCTION
** reset_cddsp
**
** DESCRIPTION
*/
void reset_cddsp(void)
{
    regs0->cddsp_config = cddsp_config;
    regs0->cddsp_control = RF_CDDSP_RESET | RF_CDDSP_STOP;
    regs0->cddsp_status = 0;
    regs0->cddsp_control = 0;
    SET_CDDSP_VX(0);
    SET_CDDSP_VY(0);
//  epp_write_slow("reset cddsp..............\n");
//  SET_CDDSP_LIMIT(-CBV_LIMIT);
}


/*
** FUNCTION
** polling_cddsp
**
** DESCRIPTION
** monitor CDDSP buffer and try to keep system decoding timely.
**/
#if CONFIG==CONFIG_COMBO_SVCD
#ifdef SUPPORT_CD_MOVE
//#define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 : ((cd_type_loaded==CDSVCD) ? 370: 32))
#ifdef SUPPORT_ESP                          //kevinlu 2002/8/15 04:44PM
#define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 8 :((cd_type_loaded==CDDA) ?  8: 360))
#else
#define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 :((cd_type_loaded==CDSVCD) ?  96: 32))    //64: 32))
#endif
#else
//#define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 : 8)
    /*jhuang 2003/3/11 add*/
    #ifdef SUPPORT_ESP
        #if (/*SUPPORT_2Mx2_SDRAM || */SUPPORT_8Mx1_SDRAM)
            #define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 :((cd_type_loaded==CDDA) ?  8: ((cdrom_speed==0)?8:5120)))//jhuang 2003/3/6
        #else                                   
            #define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 :((cd_type_loaded==CDDA) ?  8: 360))      
        #endif  
    #else
#define CBV_SIZE_START      ((cd_type_loaded==CDROM) ? 16 : 8)
#endif
#endif
#define CBV_SIZE_LOW            4
#define CBV_SIZE_SPEEDUP    5
#define CBV_SIZE_SPEEDDOWN  6
//#define   CBV_FREE_PAUSE      860//910_ok//960_ok//160//3
#ifdef SUPPORT_CD_MOVE
//#define CBV_FREE_PAUSE      ((cd_type_loaded==CDROM) ? 16 : ((cd_type_loaded==CDSVCD) ? 64: 4))
#ifdef SUPPORT_ESP
#define CBV_FREE_PAUSE      8       //((cd_type_loaded==CDROM) ? 16 :((cd_type_loaded==CDSVCD) ?  32: 4))
#else
#define CBV_FREE_PAUSE      16  //((cd_type_loaded==CDROM) ? 16 :((cd_type_loaded==CDSVCD) ?  32: 4))
#endif
#else
    //#define CBV_FREE_PAUSE      ((cd_type_loaded==CDROM) ? 16 : 4)
    
    #ifdef SUPPORT_ESP 
        #define CBV_FREE_PAUSE     8    
    #else
#define CBV_FREE_PAUSE      ((cd_type_loaded==CDROM) ? 16 : 4)
#endif
#endif
#define VBV_LOW         24          //16
#define ABV_LOW         2               //4//2

#elif CONFIG==CONFIG_COMBO_VCD

#define CBV_SIZE_START          ((cd_type==CDROM_MP3) ? 8 : 2)
#define CBV_SIZE_LOW                4
#define CBV_SIZE_SPEEDUP        5
#define CBV_SIZE_SPEEDDOWN  6
#define CBV_FREE_PAUSE          ((cd_type==CDROM_MP3) ? 16 : 4)//org 3,set 4 is more smooth
#define VBV_LOW                         16
#define ABV_LOW                         2

#else

#define CBV_SIZE_START      32
#define CBV_SIZE_LOW        64
#define CBV_SIZE_SPEEDUP    90
#define CBV_SIZE_SPEEDDOWN  180
#define CBV_FREE_PAUSE      8
#define VBV_LOW         1024
#define ABV_LOW         2

#endif

//#ifdef    EMULATION
//#undef    CBV_FREE_PAUSE
//#define   CBV_FREE_PAUSE      16
//#endif
//
/*
** Calculate CDDSP buffer occupied data size
*/
int get_cbv_size(void)
{
    int     ch;

#ifdef SUPPORT_CD_MOVE
    if(cd_type_loaded == CDSVCD)
#ifdef SUPPORT_ESP
        ch = VCD_CDMOVE_CBV_H;
#else
        ch = SVCD_CDMOVE_CBV_H;
#endif
    else if(cd_type_loaded == CDDA)
        ch = SVCD_CDMOVE_CBV_H;
    else
        ch = ((cd_type_loaded == CDROM) ? MP3_CDMOVE_CBV_H : VCD_CDMOVE_CBV_H);
    return (RingBufferSize_CD(GET_CDDSP_VY(), cbv_y, ch));
#else   /* NOT SUPPORT_CD_MOVE */
    ch = ((cd_type_loaded == CDROM) ? MP3_CBV_H : CBV_H);
    return (RingBufferSize(GET_CDDSP_VY(), cbv_y, ch));
#endif /* SUPPORT_CD_MOVE */


}
int polling_cddsp(void)
{
    int     cy = cbv_y;

    //int cx                = cbv_x;//Tony modified 02/05/06 prevent from warning, unused variable, at compiling time
    //int ch        = CBV_H;
    int     ch;
    int     cbv_size;
    int     cbv_free;
    int     cbv_free_pause_var;     /*bondy 890927 */
    int     vbv_low_var;                    /*bondy 891002 */

#ifdef SUPPORT_CD_MOVE
    if(cd_type_loaded == CDSVCD)
        // ch = ((cd_type_loaded==CDROM)? MP3_CDMOVE_CBV_H : SVCD_CDMOVE_CBV_H);
#ifdef SUPPORT_ESP
        ch = VCD_CDMOVE_CBV_H;          //kevinlu 2002/10/4 04:42PM because used vcd cddsp buffer
#else
        ch = SVCD_CDMOVE_CBV_H;         //kevinlu 2002/10/4 04:25PM code size down
#endif
    else if(cd_type_loaded == CDDA)
        ch = SVCD_CDMOVE_CBV_H;
    else
        ch = ((cd_type_loaded == CDROM) ? MP3_CDMOVE_CBV_H : VCD_CDMOVE_CBV_H);
    cbv_size = RingBufferSize_CD(GET_CDDSP_VY(), cy, ch);
    cbv_free = (ch * 288) / 1024 - cbv_size;
#else
    ch = ((cd_type_loaded == CDROM) ? MP3_CBV_H : CBV_H);
    cbv_size = RingBufferSize(GET_CDDSP_VY(), cy, ch);
    cbv_free = ch - cbv_size;
#endif

//  if (start_dumping==1)
//  {
//  psprintf(linebuf,"size=%02x,free=%02x,VY=%02x,cy=%02x,cx=%02x\n",cbv_size,cbv_free,GET_CDDSP_VY(),cy,cx);
//  epp_write_wait(linebuf);
//  }
//
#ifdef LINEAR_PLAYBACK
        return 0;
#endif
    if(CDPaused() || (regs0->cddsp_control & (RF_CDDSP_PAUSE | RF_CDDSP_STOP)))
    {
        int     cd_start = 0;

        /*
         ** try to flood CDDSP input buffer
         */
        if(cbv_size <= CBV_SIZE_START)
            cd_start = 1;

        /*bondy 891002 */
#if CONFIG==CONFIG_COMBO_SVCD
        vbv_low_var = VBV_LOW;
#else
        if(video_slow == 0)
            vbv_low_var = VBV_LOW;
        else
            vbv_low_var = 28;
#endif

        if(!cd_start && cbv_size < CBV_SIZE_LOW)
        {
            /*
             ** if VBV low, also start CD
             */
            if(vcd_state & VCD_VIDEO)
            {
                if(RingBufferSize(vbv_y, video_parsing_barrier, VBV_H) <
                     vbv_low_var /*VBV_LOW */ )
                    cd_start = 1;
            }

            /*
             ** if ABV low, also start CD
             */

            if(!cd_start && (vcd_state & VCD_AUDIO))
            {
#ifdef SUPPORT_AUD_MOVE
                #if CONFIG == CONFIG_COMBO_SVCD
                if(cd_type_loaded == CDSVCD)
                {
                    if(RingBufferSize_CD(abv_y, audio_parsing_barrier, AUDMOVE_ABV_H) <
                         ABV_LOW)
                        cd_start = 1;
                }
                else
                #endif
                {
                    if(RingBufferSize(abv_y, audio_parsing_barrier, ABV_H) < ABV_LOW)
                        cd_start = 1;
                }
#else
                if(RingBufferSize(abv_y, audio_parsing_barrier, ABV_H) < ABV_LOW)
                    cd_start = 1;
#endif
            }

            if(!cd_start && (vcd_state & VCD_MP3))
            {
                if(RingBufferSize(abv_y, audio_parsing_barrier, MP3_ABV_H) < ABV_LOW)
                    cd_start = 1;
            }

            if(!cd_start && (vcd_state & VCD_CDDA))
            {
                if(RingBufferSize(abv_y, audio_parsing_barrier, ABV_H) < ABV_LOW)
                    cd_start = 1;
            }

#if 0
            if(RingBufferSize(abv_y, audio_parsing_barrier, MP3_ABV_H) < 4)
                cd_start = 1;
#endif
            //psprintf(linebuf,"abv_y=%02x,barrier=%02x\n",abv_y,audio_parsing_barrier);
            //psprintf(linebuf,"vcd_state=%02x\n",vcd_state);
            //epp_write_wait(linebuf);
            //?cd_start =1;
        }

        if(cd_start)
        {
#ifdef SUPPORT_ESP
            if(shock_state & SHOCK_ENABLE)
            {
                return 0;
            }
            else
#endif
        #if CONFIG == CONFIG_COMBO_VCD
            if(!CheckUIState(VCD_STATE_PAUSE))//refer to 702
        #else
            if( /*!CheckUIState(VCD_STATE_PAUSE) */ !IsAVDPaused() && !CheckUIState(VCD_STATE_STOP))    //jjding 2002/9/18
        #endif    
#ifdef SUPPORT_MP3_BUFFER_FULL_STOP
            {
                if(cd_type_loaded == CDROM)
                {
                    int     free_mp3_buffer;

                    if(mp3_get_bitrate() > 250000)
                        free_mp3_buffer = 500000;
                    else
                        free_mp3_buffer = 250000;
                    if(pause_flag == CDDSP_NORMAL)
                        do_cd_pause_release();
                    else
                        if(pause_flag == ESP_CDDSP_SERVO_SLEEP && mp3_abv_bitstream_size() < free_mp3_buffer)
                    {
                        pause_flag = ESP_CDDSP_SERVO_WAKEUP;
                        MP3_ESP_LOW=C_TRUE;
                        do_cd_pause_release();
                        pause_flag = CDDSP_NORMAL;
                        
                        //if(mp3_abv_bitstream_size()==1024)//jhuang 2003/3/1 delete
                        ///epp_write("NO BITSTREAM WAKEUP\n");
                    }

                }
                else
                    do_cd_pause_release();
            }
#else
                do_cd_pause_release();
#endif
#ifdef  MONE_CD_OSD_PAUSE
            osd_print2(OS_PLAY OS_DISC);
#endif

#ifdef  MONE_CD_PAUSE

            {
/*      int vbv_size, abv_size;
        vbv_size=RingBufferSize(vbv_y, video_parsing_barrier, VBV_H);
        abv_size=RingBufferSize(abv_y, audio_parsing_barrier, ABV_H);
        psprintf(linebuf, "CR %x %x %x", GET_CDDSP_VY(), cbv_y, cbv_size);
        epp_write_slow(linebuf);
        psprintf(linebuf, "  V %x A %x\n", vbv_size, abv_size);
        epp_write_slow(linebuf);*/

                //epp_write_wait("release..");
                //epp_write_wait("release..\n");  // VICTOR TEST
                //psprintf(linebuf,"RR size=%d,VY=%d,ch=%d cy=%d,pause_msf=%06x\n",cbv_size,GET_CDDSP_VY(),ch,cy,pause_msf);
                //epp_write_wait(linebuf);
                //epp_write_wait(linebuf); // VICTOR TEST
            }
#endif /*MONE_CD_PAUSE */
        }
    }

    /*
     ** check CDDSP buffer
     */
#if   CONFIG==CONFIG_COMBO_SVCD
    cbv_free_pause_var = CBV_FREE_PAUSE;
#else

    if(video_slow == 0)
        cbv_free_pause_var = CBV_FREE_PAUSE;
    else
        cbv_free_pause_var = 6;
#endif

    if(cbv_free < cbv_free_pause_var /*CBV_FREE_PAUSE */ )
    {
        if(!CDPaused())
        {
#if   CONFIG==CONFIG_COMBO_SVCD
#ifdef SUPPORT_ESP
            if(shock_state & (SHOCK_ENABLE|SHOCK_ENABLE_VCD))
            {

                if(!(shock_state & SHOCK_PAUSE) && (!(shock_state & SHOCK_FOUND)))
                {
                    shock_state |= SHOCK_PAUSE;

                    esp.msf = (cd_qcode_mm << 16) | (cd_qcode_ss << 8) | cd_qcode_ff;
                    esp.lba = msf2l(esp.msf) - 2;
                    //epp_write_wait("esp_pause..");
                    //shock_state |= (SHOCK_FOUND|SHOCK_PROCESS);
                }
                regs0->cddsp_control = RF_CDDSP_PAUSE;
            }
            else
#endif
            {   /*磷

⌨️ 快捷键说明

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