lc_eq.c

来自「ESS3890+SL原代码(1*16内存)」· C语言 代码 · 共 487 行

C
487
字号
/* Copyright 2003, ESS Technology, Inc. *//* SCCSID @(#)lc_eq.c	4.2 10/17/03 *//* Based on eq.c	1.14 02/17/03 *//* * $Log$   */#ifdef EQUALIZER#include "vcxi.h"#include "const.h"#include "memmap.h"#include "display.h"#include "util.h"#include "xport.h"#include "fsosd.h"#include "timedef.h"#include "dsa.h"#include "filesys.h"#include "panel.h"#include "eq.h"#include "play.h"#ifdef MP3#include "mp3.h"#endif#if 0int bpt;#define BREAKPOINT(x) {bpt=x;while(bpt) VCX_service();}#else#define BREAKPOINT(x)#endif/************************************************************************ * Local OSD definitions						* ************************************************************************/#define EPRINTF(a) #define assert(a)#define REFRESH_RATE			THIRTIETH_SECOND#define REFRESH_CHAR_MAX_NUMBER		3#define REFRESH_LOOP_MAX_TIMES		52#define EQ_DISP_BRING_BACK_TIME		(3*ONE_SECOND)/************************************************************************ * Local variables  ************************************************************************/static uint eq_timer;static unsigned char *eq_settings;#ifdef KARASCstatic SPECTRUM spectrum_data[2]; /* vocal & mic */#elsestatic SPECTRUM spectrum_data[1];#endif KARASC/************************************************************************ * Global variables declared in this module				* ************************************************************************//* Begin EQ variables */char EQ_levels[13] = {    EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,    EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,    EQ_LEVEL_ZERO,EQ_LEVEL_ZERO,EQ_LEVEL_ZERO};static uchar EQ_lines[4][14];#ifdef NO_BILINGUAL_OSD /* enable after we have the required Chinese fonts */ #define TOTAL_EQFX_MSG	(2*TOTAL_EQFX)#else#define TOTAL_EQFX_MSG	TOTAL_EQFX#endifunsigned char *OSD_eqfx_msg[TOTAL_EQFX_MSG] = {#ifdef MORE_ENV_TYPES    "GAME", "NIGHT", "MORNING", "PARTY",#endif    "STUDIO", "STADIUM", "CLUB", "MOVIE", "CHURCH", "HALL", "STANDARD",    "CLASSIC", "JAZZ", "ROCK", "POPS", "BALLAD", "DANCE", "PERSONAL",};/* End EQ variables..begin EQ functions */int eq_block_mapping(int freq_level);void EQ_set_spectrum(int);void EQ_prep_spectrum(void);int eq_refresh_disp(int, int);static void eq_adj(int, int);void eq_pixel_mapping(int freq, int freq_level, int *x, int *y){    /* get pixel coordinate */    *x = (49 + (freq<<4) + (freq<<3)); /*48 + 24*freq + 1*/    *y = ((23 - freq_level)<<1); /* (23-level)*2 */}int eq_block_mapping(int freq_level){    if (freq_level > EQ_LEVEL_POS12) return (-1);    return (2 - (freq_level >> 3));}void EQ_set_spectrum(int spectrum_index){    int i, sp_level, spmax_level;    SPECTRUM *sp_ptr;   #ifdef KARASC    if (spectrum_index == 1) EQ_volume_interp();#endif KARASC        sp_ptr = &(spectrum_data[spectrum_index]);    for (i = EQ_60HZ; i <= EQ_15KHZ; i++) {	sp_ptr->sp_shadow[i] = sp_ptr->sp[i];	sp_ptr->sp_max_shadow[i] = sp_ptr->sp_max[i];        if ((i & 0x1) == 0) {            sp_level = sp_ptr->data[i>>1];        } else {            sp_level += sp_ptr->data[(i+1)>>1];            sp_level >>= 1;        }        if (sp_level < 0) sp_level = 0;        sp_ptr->sp[i] = sp_level;        spmax_level = sp_ptr->sp_max[i];        /* new spectrum max */        sp_ptr->sp_max[i] = (sp_level >= spmax_level) ?            sp_level : (spmax_level - 1);    }}void EQ_prep_spectrum(void){    int i;    SPECTRUM *sp_ptr1;#ifdef KARASC    SPECTRUM *sp_ptr2;#endif        sp_ptr1 = &(spectrum_data[0]);#ifdef KARASC    sp_ptr2 = &(spectrum_data[1]);#endif    for (i=EQ_60HZ; i <= EQ_15KHZ; i++) {	sp_ptr1->sp[i] = EQ_LEVEL_NEG12;#ifdef KARASC	sp_ptr2->sp[i] = EQ_LEVEL_NEG12;#endif	EQ_lines[0][i] = FONT_SPACE; 	EQ_lines[1][i] = FONT_SPACE; 	EQ_lines[2][i] = FONT_SPACE;         /* Freq indicator level font */        EQ_lines[3][i] = T_EQ_minus12_font[i];    }}void EQ_adj(int freq, int freq_level){    /* update for eq processing */    eq_level[freq>>1] = freq_level--; /* -1-23 -> 0-24 */    eq_change_gain = 1;    eq_adj(freq, freq_level);    if (freq != EQ_15KHZ) {	freq_level = (int)((EQ_levels[freq] + EQ_levels[freq+2]) >> 1);        eq_adj((freq + 1), freq_level);    }    if (freq != EQ_60HZ) {	freq_level = (int)((EQ_levels[freq] + EQ_levels[freq-2]) >> 1);        eq_adj((freq - 1), freq_level);    }}static void eq_adj(int freq, int freq_level){    int x, y, level, font;    unsigned int color;    /* clear current level indicator */    level = (int)EQ_levels[freq];    x = freq;    y = eq_block_mapping(level);    font = (level == EQ_LEVEL_NEG12) ?     T_EQ_minus12_font[freq] : FONT_EQ_LEV0; /* "clear" font */    color = 0xaaaa;    if (freq == EQ_cur_freq) color = 0xffff;    if (y != 3) OSD_put_one_char(x+2, 3, T_EQ_minus12_font[freq]);    OSD_put_one_char(x+2, y, font);	    /* get pixel coordinate and paint new level */    eq_pixel_mapping(freq, freq_level, &x, &y);        OSD_paint_rect(x, y, 22, 1, color);    EQ_levels[freq] = freq_level; /* update */}void EQ_show_db(int freq){    int level;    uchar EQ_db_line[4] = {FONT_EQ_PLUS, FONT_EQ_DB0, FONT_EQ_DB, 0};    level = EQ_levels[freq] - 11;    if (level <= 0) {        level = -level;        EQ_db_line[0] = (level) ? FONT_EQ_MINUS : FONT_SPACE;    }    EQ_db_line[1] = T_EQ_level2dbfont[level];    OUTOSD(6, EQ_db_line, EQ_db_line, 0);}void EQ_display_setup(char turn_on, int dummy){    extern int mp3_menu_changed;    CLEARALLOSD();    OSD_dram_dy = OSD_DRAM_DY;    OSD_ntsc_vert_pos1 = OSD_NTSC_VERT_POS1;    OSD_pal_vert_pos1 = OSD_PAL_VERT_POS1;    if (turn_on) {        int tmp = (OSD_CHAR_HEIGHT << 1) - 1;        OSD_total_areas = 1;	/* Set up OSD positions/dimensions */	OSD_cfgline (OSD_LINE_1, OSD_AREA_1, 2, 11, 15);	OSD_cfgline (OSD_LINE_2, OSD_AREA_1, 2, 11, 15);	OSD_cfgline (OSD_LINE_3, OSD_AREA_1, 2, 11, 15);	OSD_cfgline (OSD_LINE_4, OSD_AREA_1, 2, 11, 15);	OSD_ntsc_vert_end1 = OSD_NTSC_VERT_POS1 + tmp;	OSD_pal_vert_end1 = OSD_PAL_VERT_POS1 + tmp;    } else {        /* Remove EQ display and put back previous OSD settings */        if (EQ_refresh_cnt) {	    EQ_refresh_cnt = 0;	}        OSD_eq_mode = 0;        OSD_init();        OSD_dram_dx = OSD_DRAM_DX;        OSD_total_areas = OSD_TOTAL_AREAS;	OSD_ntsc_vert_end1 = OSD_NTSC_VERT_END1;	OSD_pal_vert_end1 = OSD_PAL_VERT_END1;#if (defined(MP3) || defined(GAMEBOY))        if (STREAM_type == MP3_ID) {	    OSD_dram_dy = ((OSD_LINES_IN_AREA_1*OSD_CHAR_HEIGHT) >> 1);            mp3_menu_changed=1;	}#endif    }    OSD_set_vstart_end(vcx_scn_height);}void EQ_display(char mode){    int i;    uchar *msg, *c_msg;    if (!mode) {	/* set timer to bring back EQ later */	eq_timer = (OSD_eq_mode_previous) 	    ? glbTimer+EQ_DISP_BRING_BACK_TIME 	    : xINFINITY; /* ..a long, long time */		EQ_refresh_state = EQ_UPDATE_IDLE;	/* Remove EQ display and put back previous OSD settings */	EQ_display_setup(0, 0);    } else if (mode == OSD_EQ_CONTROL) { /* show bare panel */	for (i=EQ_60HZ; i <= EQ_15KHZ; i++) {	    EQ_lines[0][i] = FONT_EQ_LEV0;	    EQ_lines[1][i] = FONT_EQ_LEV0;	    EQ_lines[2][i] = FONT_EQ_LEV0;	    EQ_lines[3][i] = T_EQ_minus12_font[i];	}	eq_settings = (EQ_music_type_effect == EQFX_PERSONAL) ? 	    eq_person_level : &(EQ_SETTINGS[EQ_music_type_effect*7]);	EQ_refresh_cnt = 1;	EQ_refresh_state = EQ_UPDATE_BACKGROUND;	eq_timer = glbTimer;    } else if (mode == OSD_EQ_SPECTRUM) {	/* load some custom colors for spectrum*/	OSD_load_palette(0x3241); 	/* adjust OSD width..so that spectrum sits in the center */	OSD_dram_dx = 18*OSD_CHAR_WIDTH/16;	spectrum_data[0].data = eq_volume;#ifdef KARASC	/* just initialize it..prevent random address writes */	spectrum_data[1].data = eq_volume; #endif 	EQ_prep_spectrum();	/* only display "frequency" line (bottom) here */	OUTOSD(10, EQ_lines[3], EQ_lines[3], 0);        EQ_refresh_cnt = 3; 	EQ_refresh_state = EQ_UPDATE_BACKGROUND;	eq_timer = glbTimer+QUARTER_SECOND;    } #ifdef KARASC    else if (mode == OSD_KSC_SPECTRUM) {	/* load some custom colors for spectrum*/	OSD_load_palette(0x3241); 	/* adjust OSD width to fit side-by-side spectrum */	OSD_dram_dx = OSD_DRAM_DX;	spectrum_data[0].data = eq_volume;	spectrum_data[1].data = mic_eq_volume;        EQ_prep_spectrum();	/* Set to display "mic" background */	assign_osd_msg(msg, MSG_mic, c_msg, MSG_mic);	OUTOSD(10, msg, c_msg, 0);	/* Set to display "music" background */	assign_osd_msg(msg, MSG_music, c_msg, MSG_music);	OUTOSD(11, msg, c_msg, 0);		EQ_refresh_cnt = 1; /* for initial refresh */	EQ_refresh_state = EQ_UPDATE_SPECTRUM;	eq_timer = glbTimer+QUARTER_SECOND;    }#endif KARASC}/*  * Function: Equalizer OSD display update state-machine *  * input: *	EQ_refresh_state(global) - state of EQ_refresh(). *	EQ_refresh_cnt(global) - the intermediate states of EQ_refresh(). * * output:		       *	EQ_refresh_cnt(global) - the intermediate states of EQ_refresh(). *		when value is zero, indicates non-EQ OSD processes are allowed. */int EQ_refresh(void){    int i;    uchar *msg, *c_msg;    static uchar music_or_mic;    if (eq_timer > glbTimer) return (EQ_refresh_cnt);        switch (EQ_refresh_state) {    case EQ_UPDATE_SPECTRUM:	if (!EQ_refresh_cnt) {#ifdef KARASC	    music_or_mic ^= (OSD_eq_mode == OSD_KSC_SPECTRUM);#endif KARASC            EQ_set_spectrum(music_or_mic);            eq_show_volume = music_or_mic+1; /* 1 or 2 */        }        EQ_refresh_cnt = eq_refresh_disp(EQ_refresh_cnt, music_or_mic);        if (!EQ_refresh_cnt) {	    /* double refresh rate for KSC spectrum */            eq_timer = glbTimer+REFRESH_RATE-(OSD_eq_mode == OSD_KSC_SPECTRUM);        }	break;    case EQ_UPDATE_LEVELS:	if (EQ_refresh_cnt < 11) { /* current gain level and data note */	    i = (EQ_refresh_cnt << 1) - 8;	    EQ_adj(i, eq_settings[(i>>1)]);	    EQ_refresh_cnt++;    	    eq_timer = glbTimer + FIFTEENTH_SECOND;            break; 	} else {	    EQ_show_db(EQ_cur_freq);	    EQ_refresh_state = EQ_UPDATE_IDLE;	    EQ_refresh_cnt = 0;	    eq_timer = xINFINITY; /* ..a long, long time */	    break;	}    case EQ_UPDATE_BACKGROUND:        i = EQ_refresh_cnt - 1;	assign_osd_msg(msg, EQ_lines[i], c_msg, EQ_lines[i]);	OUTOSD(3*i+1, msg, c_msg, 0);	if (OSD_eq_mode == OSD_EQ_SPECTRUM) {	    /* Spectrum..from bottom to top */	    EQ_refresh_cnt--;	    	    if (!EQ_refresh_cnt) {		music_or_mic = 0;		EQ_refresh_cnt = 1; /* for initial refresh */		EQ_refresh_state = EQ_UPDATE_SPECTRUM;	    }	} else {	    /* EQ settings..from top to bottom */	    EQ_refresh_cnt++;	    	    if (EQ_refresh_cnt>3) EQ_refresh_state = EQ_UPDATE_LEVELS;	}	eq_timer = glbTimer+FIFTEENTH_SECOND;	break;    case EQ_UPDATE_IDLE:	/* Check if we need to bring back EQ OSD */	if (EQ_mode && OSD_eq_mode_previous && !OSD_eq_mode &&#ifdef PLAYONLY	    XPORT_active#else	    (play_state == PLAY_NORMAL_STATE)#endif	    ) {	    EQ_display_setup(1, 0);	    	    OSD_eq_mode = OSD_eq_mode_previous;	    OSD_eq_mode_previous = 0;	    EQ_display(OSD_eq_mode);	}	break;	    default:	EQ_refresh_cnt = 0;	eq_timer = xINFINITY; /* ..a long, long time */	break;    }    return (EQ_refresh_cnt);}/* refresh spectrum display */int eq_refresh_disp(int loop, int spectrum_index){    static char freq;    int i, x, y, max_y, max_j, count=1;    int factor, eq_box_offset;    SPECTRUM *sp_ptr;    loop++;#ifdef KARASC    factor = (OSD_eq_mode == OSD_KSC_SPECTRUM) ? 2 : 1;    /* eq_box_offset:      *		0 - for standalone spectrum and mic spectrum (side-by-side)     *		9 - music spectrum (side-by-side)     */    eq_box_offset = ((factor+spectrum_index)&1) ? 0 : 9;#else    factor = 1;    eq_box_offset = 0;#endif        sp_ptr = &(spectrum_data[spectrum_index]);    for (i=freq; i <= EQ_15KHZ; i+=factor, freq+=factor, count++) {	int k = (sp_ptr->sp[i] - sp_ptr->sp_shadow[i]) | 	    (sp_ptr->sp_max[i] - sp_ptr->sp_max_shadow[i]);		if (k) { /* update as needed */            int i_factor = (factor == 1) ? i : (i >> 1);	    /* spectrum levels */	    eq_pixel_mapping(eq_box_offset + i_factor, sp_ptr->sp[i], &x, &max_y);	    eq_pixel_mapping(eq_box_offset + i_factor, sp_ptr->sp_shadow[i], 			     &x, &y);	    OSD_paint_spectrum(x, max_y, y, sp_ptr->sp[i], 			       sp_ptr->sp_shadow[i]);		    /* spectrum max levels */	    eq_pixel_mapping(eq_box_offset + i_factor, sp_ptr->sp_max_shadow[i], 			     &x, &max_j);	    eq_pixel_mapping(eq_box_offset + i_factor, sp_ptr->sp_max[i], 			     &x, &y);	    if (y > max_j) {		OSD_paint_rect(x, max_j, 22, 1, 0); /* black */		OSD_paint_rect(x, y, 22, 1, 0xffff); /* white */	    } else if ((y < max_j) || (y == max_y)) {		OSD_paint_rect(x, y, 22, 1, 0xffff); /* white */	    }	}		if (count>=REFRESH_CHAR_MAX_NUMBER) return (loop);    }    freq = 0;    return 0;}#endif EQUALIZER

⌨️ 快捷键说明

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