📄 cddsp.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 + -