📄 cddsp.c
字号:
#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"
#include "ringbuf.h"
#include "sig.h"
#include "avd.h"
#include "cddsp.h"
#include "cdxa.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;
}
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);
}
#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
#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))
#endif
#else
#define CBV_SIZE_START ((cd_type_loaded==CDROM) ? 16 : 8)
#endif
#define CBV_SIZE_LOW 4
#define CBV_SIZE_SPEEDUP 5
#define CBV_SIZE_SPEEDDOWN 6
/*
#define CBV_FREE_PAUSE 860
*/
#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
#else
#define CBV_FREE_PAUSE 16
#endif
#else
#define CBV_FREE_PAUSE ((cd_type_loaded==CDROM) ? 16 : 4)
#endif
#define VBV_LOW 24
#define ABV_LOW 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)
#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
/*
* 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 ch;
int cbv_size;
int cbv_free;
int cbv_free_pause_var;
int vbv_low_var;
#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; // because used vcd cddsp buffer
#else
ch = SVCD_CDMOVE_CBV_H; // 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
#ifdef LINEAR_PLAYBACK
return 1;
#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;
#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 (cd_type_loaded == CDSVCD) {
if (RingBufferSize_CD(abv_y, audio_parsing_barrier, AUDMOVE_ABV_H) < ABV_LOW)
cd_start = 1;
}
else {
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
}
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))
#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;
do_cd_pause_release();
pause_flag = CDDSP_NORMAL;
}
}
else
do_cd_pause_release();
}
#else
do_cd_pause_release();
#endif
}
}
/*
* 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)) {
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;
}
regs0->cddsp_control = RF_CDDSP_PAUSE;
}
else
#endif
{
if (pause_flag == CDDSP_NORMAL) {
pause_flag = CDDSP_PAUSE;
}
do_cd_pause();
#ifdef SUPPORT_MP3_BUFFER_FULL_STOP
if (cd_type_loaded == CDROM) {
if (RingBufferFree(abv_y, audio_parsing_barrier, MP3_ABV_H) < 10)
pause_flag = ESP_CDDSP_BUFFER_FULL;
else
pause_flag = CDDSP_NORMAL;
}
#endif
}
#else
if ((cd_type_loaded == CDROM))
do_cd_pause();
else {
if ((video_slow) || CheckUIState(VCD_STATE_STEP) ||
CheckUIState(VCD_STATE_PAUSE))
do_cd_pause();
}
#endif
}
}
#if SUPPORT_SPEED_JUMP
else {
if (cbv_size > CBV_SIZE_HIGH_SPEEDDOWN) {
if (cd_speed == 2) {
do_cd_speed_down();
cd_speed = 1;
}
}
else if (cbv_size < CBV_SIZE_LOW_SPEEDUP) {
if (cd_speed == 1) {
do_cd_speed_up();
cd_speed = 2;
}
}
}
#endif
/*
* Check seeking too long and restart seeking again.
*
* *FIXME* we may have to timeout this loop due to DSA out of control.
*/
if (cd_msf_changed)
cd_msf_changed = 0;
#if (SUPPORT_VFD) && !defined(VFD_TIME_GOP)
if (cd_msf_changed) {
cd_msf_changed = 0;
}
#endif
return 0;
}
static const UINT16 cddsp_config_table[] = {
CDDSP_SONY_BASIC,
CDDSP_I2S_BASIC,
0,
};
#define SetCDDSPConfig(c) (regs0->cddsp_config = (c))
#define ResetCDDSP() (regs0->cddsp_control = RF_CDDSP_RESET | RF_CDDSP_STOP | RF_CDDSP_PAUSE)
#define StartCDDSP() (regs0->cddsp_control = 0)
#define SetCDDSPPointer(x, y) {SET_CDDSP_VX(x); SET_CDDSP_VY(y);}
#define CDDSP_DETECT_WAIT (4 * RTC_TICKS) /* 4-seconds */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -