read.c
来自「Sunplus 8202S source code.」· C语言 代码 · 共 884 行 · 第 1/2 页
C
884 行
*/
void ShowReadPage(void)
{
UINT32 i;
//initialization
uRecordMode = uReadSel[REC_MODE_ITEM];
uFudoMode = uReadSel[READ_MODE_ITEM];
uReadMenuLevel = 0;
uReadShowEq = 0;
setup_eq_display(0x0f);
index_y = MAX_READ_ITEM;
index_y2 = 0;
ClearReadMode();
RepReadSendCmd(FUDO_CMD_STOP);
SetRecordQuality(uRecordMode);
//draw outline
osd_init_rep_reading();
osd_draw_region_rect(0, 0, READ_REG_W*16, READ_REG_H, BG_CLR, READ_REGION);
osd_draw_button_outline(2, 2, READ_REG_W*16-2, READ_REG_H -2, BTN_UP, 0x0F, READ_REGION);
//draw main buttons
for(i = 0; i< MAX_READ_ITEM; i++)
{
DrawReadItem(i, MAIN_LEVEL, UNSEL_BTN_NORM);
}
//initialization for display eq
uReadShowEq = 1;
uReadEqType = ORI_EQ;
setup_eq_display(1);
for(i=0;i<13;i++)
bEqEnergyMax[i]=0;
unEqMaxRef=0;
//draw EQ background
//osd_draw_region_rect( READ_SUB_MENU_X * 16 , EQ_BG_START_Y, READ_BTN_WIDTH * 16, 55, FONT_CLR, READ_REGION);
}
/*
******************************************************************************
* Function: ReadSaveSetup(void)
* Description: save rep read setup
* Syntax: void ReadSaveSetup(void);
* Returns: none
******************************************************************************
*/
void ReadSaveSetup(void)
{
//Note: when do setup, we clear current read mode
if(index_y == REC_MODE_ITEM){
uReadSel[index_y] = index_y2;
uRecordMode = index_y2;
ClearReadMode();
AUDIF_Demute();//2004AUDDRV AudioDemute();
SetRecordQuality(uRecordMode);
}else if(index_y == READ_MODE_ITEM){
uReadSel[index_y] = index_y2;
uFudoMode = index_y2;
ClearReadMode();
AUDIF_Demute();//2004AUDDRV AudioDemute();
}else{
if(uPBTimesSetting){
uPlaybackTimes = uPBTimesSetting;
ClearReadMode();
AUDIF_Demute();//2004AUDDRV AudioDemute();
}
}
}
/*
******************************************************************************
* FUDO UI OPERATION FUNCTIONS
* Up/Down/Left/Right & Enter Operation process
******************************************************************************
*/
void read_func_up(void)
{
UINT8 uOldIndex;
if(uReadMenuLevel == 0){
uOldIndex = index_y;
if(index_y >= MAX_READ_ITEM){
index_y = MAX_READ_ITEM - 1;
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL );
}else{
//current button index
if(index_y == 0){
index_y = MAX_READ_ITEM - 1;
}else{
index_y--;
}
//change button status
DrawReadItem(uOldIndex, MAIN_LEVEL, UNSEL_BTN_NORM );
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL );
}
//refresh sub menu
index_y_start = index_y; //sub menu y start intilization
index_y2 = uReadSel[index_y];
uReadShowEq = 0;
if(index_y == EQ_ITEM){
//clear sub menu and draw EQ background
osd_draw_region_rect( (READ_SUB_MENU_X - 1) * 16 , 8, (READ_BTN_WIDTH + 1)*16 + 4, 32*4, BG_CLR, READ_REGION);
//osd_draw_region_rect( READ_SUB_MENU_X * 16 , EQ_BG_START_Y, READ_BTN_WIDTH * 16, 110, FONT_CLR, READ_REGION);
uReadShowEq = 1;
}else
DrawRead2ndMenu(1);
}else{ /*second level*/
uOldIndex = index_y2;
if(index_y2 > 0)
index_y2--;
//change sub button status
DrawReadItem(uOldIndex, SUB_LEVEL, GetReadBtnMode(uOldIndex) );
DrawReadItem(index_y2, SUB_LEVEL, GetReadBtnMode(index_y2) );
}
}
void read_func_down(void)
{
UINT8 uOldIndex;
if(uReadMenuLevel == 0){
uOldIndex = index_y;
if(index_y >= MAX_READ_ITEM){
index_y = 0;
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL );
}else{
//current button index
if(index_y == MAX_READ_ITEM - 1){
index_y = 0;
}else{
index_y++;
}
//change sub button status
DrawReadItem(uOldIndex, MAIN_LEVEL, UNSEL_BTN_NORM );
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL );
}
//refresh sub menu
index_y_start = index_y; //sub menu y start intilization
index_y2 = uReadSel[index_y];
uReadShowEq = 0;
if(index_y == EQ_ITEM){
//clear sub menu and draw EQ background
osd_draw_region_rect( (READ_SUB_MENU_X - 1) * 16 , 8, (READ_BTN_WIDTH + 1)*16 + 4, 32*4, BG_CLR, READ_REGION);
//osd_draw_region_rect( READ_SUB_MENU_X * 16 , EQ_BG_START_Y, READ_BTN_WIDTH * 16, 110, FONT_CLR, READ_REGION);
uReadShowEq = 1;
}else
DrawRead2ndMenu(1);
}else{ /*second level*/
uOldIndex = index_y2;
if(index_y2 < (uReadSelMaxIndex - 1) )
index_y2++;
//change button status
DrawReadItem(uOldIndex, SUB_LEVEL, GetReadBtnMode(uOldIndex) );
DrawReadItem(index_y2, SUB_LEVEL, GetReadBtnMode(index_y2) );
}
}
void read_func_left(void)
{
if(uReadMenuLevel){
uReadMenuLevel = 0;
DrawRead2ndMenu(1);
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL);
}
}
void read_func_right(void)
{
if( (uReadMenuLevel == 0) && (index_y != EQ_ITEM) )
read_func_select();
}
void read_func_select(void)
{
if(index_y >= MAX_READ_ITEM)
return;
if(uReadMenuLevel == 0){
if(index_y != EQ_ITEM){
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_NORM);
index_y_start = index_y; //sub menu y start intilization
index_y2 = uReadSel[index_y];
uPBTimesSetting = 0;
uReadMenuLevel = 1;
DrawRead2ndMenu(1);
uReadShowEq = 0;
}
}else{ //sub menu
uReadMenuLevel = 0;
ReadSaveSetup();
DrawReadItem(index_y, MAIN_LEVEL, SEL_BTN_HL);
//clear the sub menu and draw EQ background
osd_draw_region_rect( (READ_SUB_MENU_X - 1) * 16 , 8, (READ_BTN_WIDTH + 1)*16 + 4, 32*4, BG_CLR, READ_REGION);
//osd_draw_region_rect( READ_SUB_MENU_X * 16 , EQ_BG_START_Y, READ_BTN_WIDTH * 16, 110, FONT_CLR, READ_REGION);
uReadShowEq = 1;
}
}
void read_func_input(void)
{
int iDispVal;
iDispVal = uPBTimesSetting;
add_input_num(&iDispVal);
uPBTimesSetting = (iDispVal % 100);
if(uPBTimesSetting > 100)
uPBTimesSetting = 0;
if(uPBTimesSetting == 0){
strcpy(linebuf, "__");
}else{
psprintf(linebuf, "%02d", uPBTimesSetting);
}
osd_DrawRegionString(READ_SUB_MENU_X + 1, index_y*8 + 2, linebuf, WHITE_CLR, ANTI_BG_CLR, READ_REGION);
}
/*
******************************************************************************
* Function: DisplayReadEq(void)
* Description: save rep read setup
* Syntax: void DisplayReadEq(UINT8 type, BYTE r);
* Parameters: type --------- ORI_EQ/REC_EQ, Eq type
r --------- region to diplay read eq
* Returns: none
******************************************************************************
*/
void DisplayReadEq(UINT8 type, BYTE r)
{
BYTE i,j;
BYTE bEqValue[7];
BYTE *p;
if( (full_scrn & READ) && uReadShowEq ) {
if(bEqDisplay == 4){
if(type == ORI_EQ)
p = (BYTE *)(SDRAM_BASE_CACHED+MEM_PCMYA*1024);
else //Record voice's EQ
p = (BYTE *)(SDRAM_BASE_CACHED+MEM_PCMYA*1024 + 23 *3);
for (i=0, j=0;i<7;i++)
{
UINT32 eqSrc;
UINT32 eqTemp;
eqSrc = (((*p)<<8) | *(p+1));
p+=3;
if (eqSrc > unEqMaxRef)
unEqMaxRef = eqSrc;
//normalize value to 0 ~ 25
if (unEqMaxRef==0) //EQ value range check,
eqTemp = 0;
else{
eqTemp = eqSrc*25/unEqMaxRef;
bEqValue[i] = eqTemp;
if (bEqValue[i]<4) {
j++;
}
}
}
//adjust max refrence
if ( (j>=6) && (unEqMaxRef>400) )
unEqMaxRef=unEqMaxRef-(unEqMaxRef/8);
osd_print_read_eq(r, bEqValue);
setup_eq_display(1);
}else
bEqDisplay++;
}
}
/*
******************************************************************************
* FUDO FLOW CONTROL FUNCTIONS
******************************************************************************
*/
/*
******************************************************************************
* Function: PollingRecBufStatus()
* Description: polling the buffer's statuas
* Syntax: UINT32 PollingRecBufStatus(void);
* Returns: 1: buffer all used. 0: not used over
* Side effect: when buffer used over, send REPEAT AB cmd
******************************************************************************
*/
UINT32 PollingRecBufStatus(void)
{
UINT32 uRatio;
uRatio = get_dsp3_pcm_value(22);
if( (IsReadPlayback() && (uRatio <= 2)) ||
( IsReadRecording() && (uRatio >= 98 )) ){
if(IsReadRecording())
uRecBufRatio = uRatio;
return 1;
}else
return 0;
}
/*
******************************************************************************
* Function: ReadRecPlayback()
* Description: read flow control for record voice playback
* Syntax: void ReadDoRecPlayback(void);
******************************************************************************
*/
void ReadRecPlayback(void)
{
SetReadPlayback();
RepReadSendCmd(FUDO_CMD_PLAY);
uReadEqType = REC_EQ;
ReadShowPromptInfo(1);
}
/*
******************************************************************************
* Function: MainLoopCtrlReadMode()
* Description: check if need to do special control mode in MediaMainLoop
* Parameters: uFlag --------- befor/in/ou MediaMainLoop
* Syntax: void MainLoopCtrlReadMode(UINT32 uFlag);
* Returns: when in MainLoop, return 1 will break main loop
******************************************************************************
*/
UINT32 MainLoopCtrlReadMode(UINT32 uFlag)
{
UINT32 uRes = 0;
if( (full_scrn & READ) ){
switch(uFlag)
{
case PRE_MAIN_LOOP: //avoid audio stop cmd, we send fudo cmd just before mainloop
if( IsReadGendu() )
break;
if(uPlaybackFlag && uRealPBTimes){
set_dsp3_pcm_value(22, uRecBufRatio);
if( IsReadRepeat() ){
ReadRecPlayback();
uRealPBTimes--;
}else if( IsReadCompare() ){
if( IsReadPlayback() || IsReadRecording() ){
uReadStatus = READ_ST_NONE;
uReadEqType = ORI_EQ;
ReadShowPromptInfo(0);
}else{
ReadRecPlayback();
uRealPBTimes--;
}
}
}else if(uRealPBTimes == 0) { //playback repeat tiems over, clear read mode
ClearReadMode();
}else if( IsReadRecording() ){
RepReadSendCmd(FUDO_CMD_REC);
uReadEqType = REC_EQ;
ReadShowPromptInfo(1);
}
break;
case IN_MAIN_LOOP: //for read and flow control
if( IsReadGendu() ){ //for gendu, jsut mute the origianal music
if(uPlaybackFlag)
AUDIF_Set_Volume(0);//AudioSetVolume(0);
}else if( IsReadMode() ){
AUDIF_Set_Volume(0);//AudioSetVolume(0);
uReadEqType = REC_EQ;
if( PollingRecBufStatus() ){
if( IsReadRecording() ) //set flag for playback control
uPlaybackFlag = 1;
//if between AB, buffer used over, should do REPEAT AB
RepReadSendCmd(FUDO_CMD_STOP);
ircmd_post_func( CMD_FUNC | CMD_FUNC_REPAB );
uRes = 1;
}
}
break;
case POST_MAIN_LOOP: //for read and flow control
break;
}
}
return uRes;
}
/*
******************************************************************************
* Function: RepBCheckReadMode()
* Description: check if need to do fudo cmd and flow contrl
* Syntax: void RepBCheckReadMode(void);
* Returns: none
******************************************************************************
*/
void RepBCtrlReadMode(void)
{
if( (full_scrn & READ) ){
AUDIF_Set_Volume(0);//AudioSetVolume(0);
switch(uFudoMode)
{
case FUDO_GENDU:
//just toggle for EQ type and original/record voice
uPlaybackFlag ^= 0x01;
ReadShowPromptInfo(uPlaybackFlag);
uReadEqType = uPlaybackFlag;
break;
case FUDO_REPEAT: //just for record flag and when reach B, buffer not full, used the ratio for playback
case FUDO_COMPARE:
RepReadSendCmd(FUDO_CMD_STOP);
if( IsReadRecording() ){
uRecBufRatio = get_dsp3_pcm_value(0x22);
uPlaybackFlag = 1;
}
if( (uRealPBTimes == uPlaybackTimes) && (uPlaybackFlag == 0) ){ //when playback record over, send record cmd again
SetReadRecording();
set_dsp3_pcm_value(22, 0);
}
break;
default:
break;
}// end switch...
}// end if...
}
#endif //#ifdef SUPPORT_REP_READ
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?