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 + -
显示快捷键?