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

📄 cddsp.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 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 + -