📄 eq.c
字号:
/* Copyright 2001, ESS Technology, Inc. *//* SCCSID @(#)eq.c 4.8 06/16/03 *//* Based on VCD version 1.98 3/25/98 *//* * $Log$ */#ifdef EQUALIZER#include "common.h"#include "memmap.h"#include "display.h"#include "util.h"#include "mvd.h"#include "cg.h"#include "timedef.h"#include "vcxi.h"#include "dsa.h"#include "const.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 SBS_KARA /* enable side-by-side music/mic spectrum */#define REFRESH_RATE THIRTIETH_SECOND#define REFRESH_CHAR_MAX_NUMBER 4#define REFRESH_LOOP_MAX_TIMES 52#define EQ_DISP_BRING_BACK_TIME (3*ONE_SECOND)#define EQ_BACK_GROUND_COLOR 1#define EQ_BACK_FRAME_COLOR 7#define EQ_FREQ_NORMAL_COLOR 6#define EQ_FREQ_NORMAL1_COLOR 5 #define EQ_FREQ_NORMAL2_COLOR 12 #define EQ_FREQ_MAX_COLOR 3#define EQ_FREQ_SELECT_COLOR 8 #define EQ_FREQ_TEXT_SELECT_COLOR 8 #define EQ_DB_TEXT_COLOR 3 #define EQ_FREQ_TEXT_COLOR 13 #define EQ_TITLE_BORDER_COLOR 1 #define EQ_TITLE_TEXT_COLOR 3/* position definitions */#define OSD_NORMAL_MSG_X 0#define OSD_NORMAL_MSG_Y 0/************************************************************************ * Local variables ************************************************************************/#define EQ_DISP_INIT_X 5 /* char. position */#define EQ_DISP_INIT_Y 1 /* char. position */#ifdef SBS_KARA#define MIC_SPECTRUM_X 4 /* char. position */#define MIC_SPECTRUM_Y 1 /* char. position */#define MUSIC_SPECTRUM_X 14 /* char. position */#define MUSIC_SPECTRUM_Y 1 /* char. position */#else#define MIC_SPECTRUM_X 5 /* char. position */#define MIC_SPECTRUM_Y 5 /* char. position */#endifstatic int EQ_box_initx, EQ_box_inity; /* char position */static int initx_pixel, inity_pixel;static uint eq_timer;static unsigned char *eq_settings;#ifdef KARASCstatic uchar EQ_disc_icon = ICON_ADISC1;static SPECTRUM spectrum_data[2]; /* vocal & mic */#elsestatic SPECTRUM spectrum_data[1];#endif KARASC/************************************************************************ * Global variables declared in this module * ************************************************************************//* Begin EQ variables */char OSD_eq_mode = 0; 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 unsigned char EQ_db_line[4] = {FONT_EQ_PLUS, FONT_EQ_DB0, FONT_EQ_DB, 0};static uchar EQ_lines[4][14];static int freq_bar_color[3] = {EQ_FREQ_NORMAL2_COLOR, EQ_FREQ_NORMAL1_COLOR, EQ_FREQ_NORMAL_COLOR}; #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",#ifdef NO_BILINGUAL_OSD#ifdef MORE_ENV_TYPES {CN_HEADER,CN_KUAN1, CN_HEADER,CN_CHANG3,0}, /* game */ {CN_HEADER,CN_YE41, CN_HEADER,CN_QU3,0}, /* night */ {CN_HEADER,CN_CHEN2, CN_HEADER,CN_QU3,0}, /* morning */ {CN_HEADER,CN_YUAN2, CN_HEADER,CN_JU4, CN_HEADER,CN_CHANG3,0}, /* party */#endif MORE_ENV_TYPES {CN_HEADER,CN_YIN1, CN_HEADER,CN_YUE4, CN_HEADER,CN_TING1,0}, /* studio */ {CN_HEADER,CN_TI3, CN_HEADER,CN_YU4, CN_HEADER,CN_CHANG3,0}, /* stadium */ {CN_HEADER,CN_XIAN4, CN_HEADER,CN_CHANG3,0}, /* club */ {CN_HEADER,CN_DIAN4, CN_HEADER,CN_YING3, CN_HEADER,CN_YUAN4,0}, /* movie */ {CN_HEADER,CN_JIAO4, CN_HEADER,CN_TANG2,0}, /* church */ {CN_HEADER,CN_DA4, CN_HEADER,CN_TING1,0}, /* hall */ {CN_HEADER,CN_BIAO1, CN_HEADER,CN_ZHUN3,0}, /* standard */ {CN_HEADER,CN_GU3, CN_HEADER,CN_DIAN3,0}, /* classic */ {CN_HEADER,CN_JUE2, CN_HEADER,CN_SHI4,0}, /* jazz */ {CN_HEADER,CN_YAO2, CN_HEADER,CN_GUN3,0}, /* rock */ {CN_HEADER,CN_LIU21, CN_HEADER,CN_XING2,0}, /* pops */ {CN_HEADER,CN_MIN2, CN_HEADER,CN_GE1,0}, /* ballad */ {CN_HEADER,CN_WU3, CN_HEADER,CN_QU3,0}, /* dance */ {CN_HEADER,CN_GE4, CN_HEADER,CN_XING4,0}, /* personal */#endif BILINGUAL_OSD};static uchar EQ_level2dbfont[13] = { FONT_EQ_DB0,FONT_EQ_DB1,FONT_EQ_DB2,FONT_EQ_DB3,FONT_EQ_DB4, FONT_EQ_DB5,FONT_EQ_DB6,FONT_EQ_DB7,FONT_EQ_DB8,FONT_EQ_DB9, FONT_EQ_DB10,FONT_EQ_DB11,FONT_EQ_DB12};static uchar EQ_minus12_font[13] = { FONT_EQ_60,FONT_EQ__,FONT_EQ_150,FONT_EQ__,FONT_EQ_400,FONT_EQ_0, FONT_EQ_1K,FONT_EQ__,FONT_EQ_2K,FONT_EQ__,FONT_EQ_6K,FONT_EQ_1,FONT_EQ_5K};static uchar EQ_spectrum2font[8] = { FONT_EQ_S1,FONT_EQ_S2,FONT_EQ_S3,FONT_EQ_S4,FONT_EQ_S5,FONT_EQ_S6, FONT_EQ_S7,FONT_EQ_S8};uchar EQ_settings[] = { /* Music environment effects..."12" == 0dB */ 15, 12, 12, 15, 12, 10, 12, /* studio */ 18, 15, 13, 6, 9, 10, 15, /* stadium */ 12, 13, 15, 15, 12, 12, 12, /* club */ 18, 14, 12, 15, 15, 13, 6, /* movie */ 12, 12, 12, 15, 15, 14, 12, /* church */ 18, 15, 13, 9, 9, 10, 12, /* hall */ 12, 12, 12, 12, 12, 12, 12, /* standard */ /* Music type effects. */ 18, 13, 8, 3, 8, 13, 18, /* classic */ 0, 6, 14, 18, 14, 6, 0, /* jazz */ 18, 14, 4, 2, 4, 14, 18, /* rock */ 16, 18, 14, 7, 4, 7, 12, /* pops */ 8, 10, 14, 18, 10, 6, 4, /* ballad */ 18, 14, 12, 6, 8, 10, 12, /* dance */};/* * EQ decline and delay parameters: * * alpha : 32 > alpha[] > 0, larger value means lower decline. * * alpha[] * reverb alpha calculation: alpha = ----------- * 32 * * * DAE_delay: 19 * 384 > DAE_delay[] > 384, multiple of 384, larger value means longer delay. * * DAE_delay[] * Delay time calcuation: Delay = -------------------- (s) * 44100 * * * index 0 1 2 3 4 5 * mode studio hall church stadium movie x * */char alpha[6] = {15, 14, 12, 10, 8, 5};short DAE_delay[6] = {14*384, 15 * 384, 16 * 384, 17 * 384, 18* 384, 19 * 384};/* End EQ variables..begin EQ functions */int eq_block_mapping(int freq_level);void eq_refresh_cal(int);void EQ_set_spectrum(int);void EQ_prep_spectrum(int);void eq_pixel_mapping(int freq, int freq_level, int *x, int *y){ /* get pixel coordinate */ *x = (freq<<4) + (freq<<3)+initx_pixel; /*48 + 24*freq + 1*/ *y = ((23 - freq_level)<<2)+inity_pixel; /* (23-level)*4 */}int eq_block_mapping(int freq_level){ int y; if (freq_level == EQ_LEVEL_NEG12) y = 3; else if (freq_level<EQ_LEVEL_NEG3) y = 2; else if (freq_level<EQ_LEVEL_POS5) y = 1; else if (freq_level<=EQ_LEVEL_POS12) y = 0; else /* error */ y = -1; return y;}void EQ_set_spectrum(int spectrum_index){ int i, sp_level, spmax_level; SPECTRUM *sp_ptr; if (spectrum_index == 1) EQ_volume_interp(); 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]; } for (i=EQ_60HZ; i <= EQ_15KHZ; i+=2) { sp_level = sp_ptr->data[i>>1]; if (sp_level > EQ_LEVEL_POS12) sp_level = EQ_LEVEL_POS12; 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; } for (i=EQ_150HZ; i <= EQ_15KHZ; i+=2) { /* Calculate intermediate levels */ sp_ptr->sp[i-1] = (sp_ptr->sp[i] + sp_ptr->sp[i-2])/2; sp_level = sp_ptr->sp[i-1]; spmax_level = sp_ptr->sp_max[i-1]; sp_ptr->sp_max[i-1] = (sp_level >= spmax_level) ? sp_level : spmax_level-1; }}void EQ_disp_spectrum(void){ uchar osdmsg[CG_LINE_WIDTH+1]; EQ_prep_spectrum(0); /* only display "frequency" line (bottom) here */ ICON_charset_select(VWENGLISH_FONTS); ICON_set_bkcolor(EQ_BACK_GROUND_COLOR); CG_map_color_array(EQ_BACK_FRAME_COLOR, EQ_FREQ_TEXT_COLOR, 3); strcpy(osdmsg, EQ_lines[3]); CGI_text_show(osdmsg, EQ_box_initx, EQ_box_inity+3, -1, -1); ICON_charset_restore();}void EQ_prep_spectrum(int ksc_mode){ 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; sp_ptr1->sp_max[i] = EQ_LEVEL_NEG11;#ifdef KARASC sp_ptr2->sp[i] = EQ_LEVEL_NEG12; sp_ptr2->sp_max[i] = EQ_LEVEL_NEG11;#endif EQ_lines[0][i] = FONT_EQ_LEV0; EQ_lines[1][i] = FONT_EQ_LEV0; EQ_lines[2][i] = FONT_EQ_LEV0; /* Freq indicator level font */ EQ_lines[3][i] = EQ_minus12_font[i]; } #ifdef SBS_KARA if (ksc_mode) { /* insert zero-termination for side-by-side display */ EQ_lines[0][7] = 0; EQ_lines[1][7] = 0; EQ_lines[2][7] = 0; }#endif}void EQ_adj(int freq, int freq_level){ int i, x, x1, y, y1,y2,y3, level, font, extra_map; unsigned int color, color1; ICON_charset_select(VWENGLISH_FONTS); ICON_set_bkcolor(EQ_BACK_GROUND_COLOR); for (i = 0; i < 3; i++) { if (i == 1) { /* next intermediate freq */ if (freq != EQ_15KHZ) { freq_level = (int)(EQ_levels[freq]+EQ_levels[freq+2])/2; freq++; } else { freq++; continue; } } else if (i == 2) { freq--; /* center freq */ /* previous intermediate freq */ if (freq != EQ_60HZ) { freq_level = (int)(EQ_levels[freq]+EQ_levels[freq-2])/2; freq--; } else break; } else { /* (i==0) center freq */ eq_level[freq>>1] = freq_level; /* -1-23 -> 0-24 */ freq_level--; /* 0-24 -> -1-23 */ eq_change_gain = 1; } color = EQ_FREQ_TEXT_COLOR; /* green..for new level */ color1 = EQ_FREQ_NORMAL_COLOR; /* green..for new level */ if (freq == EQ_cur_freq) { color = EQ_FREQ_TEXT_SELECT_COLOR; /* yellow.. */ color1 = (EQ_music_type_effect == EQFX_PERSONAL) ? EQ_FREQ_SELECT_COLOR /* yellow..for personal settings */ : EQ_FREQ_NORMAL_COLOR; } else if ((freq+1==EQ_cur_freq&&EQ_cur_freq==EQ_15KHZ) || (freq-1==EQ_cur_freq&&EQ_cur_freq==EQ_400HZ)) { color = EQ_FREQ_TEXT_SELECT_COLOR; /* yellow.. */ } if (freq == EQ_400HZ) extra_map = 1; else if (freq == EQ_15KHZ) { extra_map = -1; } else extra_map = 0; /* get pixel coordinate and paint new level */ level = (int)EQ_levels[freq]; font = (level == EQ_LEVEL_NEG12) ? EQ_minus12_font[freq] : FONT_EQ_LEV0; y = eq_block_mapping(level); eq_pixel_mapping(freq, freq_level, &x1, &y1); y2 = inity_pixel + y*32; y3 = inity_pixel + 96; /* draw freq data */ CG_map_color_array(EQ_BACK_FRAME_COLOR, color, 3); GI_icon_show(EQ_minus12_font[freq], x1, y3); if (extra_map) GI_icon_show(EQ_minus12_font[freq+extra_map], x1+extra_map*24, y3); if (y!=3) /* erase background */ GI_icon_show(font, x1, y2); /* draw bar */ OSD_area_fill(x1+2, y1, x1+22, y1+2, color1); EQ_levels[freq] = freq_level; } ICON_charset_restore();}void EQ_show_db(int freq){ uchar osdmsg[CG_LINE_WIDTH+1]; int level, sign_ft, x, y; level = EQ_levels[freq]; if (level > EQ_LEVEL_ZERO) { /* level > 0 */ level = level-11; sign_ft = FONT_EQ_PLUS; } else { /* level <= 0 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -