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

📄 search.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 C
字号:
/*****************************************************\
Creater: Kenny
Date   : 2001/5/15 02:39PM
Description: Search menu using 
\*****************************************************/

#include "global.h"
#include "osd.h"
#include "func.h"
#include "cfont.h"
#include "util.h"
#include "ircmd.h"

extern  BYTE bin2asc(BYTE pp);

BYTE vcd_mode_select_num[VCD_MODE_NUM]={1,2};
BYTE dvd_mode_select_num[DVD_MODE_NUM]={3};

BYTE           vcd_track_input;
enum
{
OP_NE=0,
OP_UPDN=0x1,
OP_SEL=0x2,
OP_TT,
};


#define MAX_Y_ITEM 3
#define MAX_MODE 2
#define MAX_X_ITEM 4
#define SEL_POS 2



const UINT8 vcd_mode[MAX_MODE][MAX_Y_ITEM][MAX_X_ITEM]={
{ //mode 0	
	
 {OP_TT,   STR_OS_TRK_S,  STR_OS_SPACE,      STR_OS_SPACE},
 {OP_UPDN, STR_OS_TIME,   STR_OS_TIME_DASH,  STR_OS_DIR1},
 {OP_NE,0,0,0}

},

{ //mode 1
  
 {OP_TT,   STR_OS_DISC_S, STR_OS_SPACE,     STR_OS_SPACE},
 {OP_UPDN, STR_OS_TIME,   STR_OS_TIME_DASH, STR_OS_DIR1},
 {OP_UPDN, STR_OS_TRACK,  STR_OS_SPACE,     STR_OS_DIR5}
	

}
 
};








//********************************************
//*
//* Kenny add it 2001/5/8
//*
//********************************************/


void dvd_search(BYTE mode,BYTE base,BYTE num,BYTE init_osd)
{  
  
  switch(base)
  {
  	
   case 0:   
   
   if(num==0)
   {
   	PrintOsdMsg(STR_OS_GOTO,0x10,0,0,CH_N);   
   	PrintOsdMsg(STR_OS_T_C_T,0x20,0,0,CH_N);
   	PrintOsdMsg(STR_OS_TIME,0x11,0,13,CH_N);   
   	PrintOsdMsg(STR_OS_TIME_DASH,0x21,0,0x20,CH_N);  
   	
   	PrintOsdMsg(STR_OS_CHAPTER,0x12,0,13,CH_N);   
    PrintOsdMsg(dvd_chapter<<8,0x22,0,0x0e,CH_N);   
    PrintOsdMsg(STR_OS_TITLE,0x13,0,0x0d,CH_N);
    PrintOsdMsg(dvd_title<<8,0x23,0,0x0e,CH_N);	   
   	
   }
   else	   
   {
   PrintOsdMsg(STR_OS_SPACE,0x21,num,3,CH_N);      
   }
   
   
   break;
   
   case 1:
   
   if(num==0)
   {
	   PrintOsdMsg(STR_OS_TIME,0x11,0,13,CH_N);
	   PrintOsdMsg(STR_OS_TIME_DASH,0x21,0,0,CH_N);
	   PrintOsdMsg(STR_OS_CHAPTER,0x12,0,13,CH_N);  
	   PrintOsdMsg(dvd_chapter<<8,0x22,0,0x2e,CH_N);   
	   PrintOsdMsg(STR_OS_TITLE,0x13,0,13,CH_N);    
	   PrintOsdMsg(dvd_title<<8,0x23,0,0x0e,CH_N);  
   }	
   else
   {   	
   PrintOsdMsg(dvd_chapter<<8,0x22,num,0xf,CH_N);   
   }	
   break;
   
   case 2:
   
   if(num==0)
   {
   PrintOsdMsg(STR_OS_TIME,0x11,0,13,CH_N);
   PrintOsdMsg(STR_OS_TIME_DASH,0x21,0,0,CH_N);
   PrintOsdMsg(STR_OS_CHAPTER,0x12,0,0x0d,CH_N);    
   PrintOsdMsg(dvd_chapter<<8,0x22,0,0x0e,CH_N);      
   PrintOsdMsg(STR_OS_TITLE,0x13,0,0x0d,CH_N);
   PrintOsdMsg(dvd_title<<8,0x23,0,0x2e,CH_N);      	
   }	
    else
   {
   	PrintOsdMsg(dvd_title<<8,0x23,num,0xf,CH_N);   

   }	
   
   
   break;
  
  	
  }	
  
  	
	
}	




void vcd_mode_search(BYTE mode,BYTE select_index,BYTE input_op)
{
	
  BYTE i,j;
  	
 if(!input_op)//not input 
 {
   if(select_index==0xff)
   {	
     psprintf(RegionValStr[REGION0],""); 
     PrintOsdMsg(vcd_mode[mode][REGION0][1],0x10|REGION0,0,1,CH_N);
      psprintf(RegionValStr[REGION0],""); 
     PrintOsdMsg(vcd_mode[mode][REGION0][2],0x20|REGION0,0,1,CH_N);
      
      return;	
     	
   }		
 	
 
   
     psprintf(RegionValStr[REGION0],""); 
     PrintOsdMsg(vcd_mode[mode][REGION0][1],0x10|REGION0,0,1,CH_N);
      
     
    
    for(i=0;i<MAX_Y_ITEM;i++)
    {
     if(vcd_mode[mode][i][0]==OP_UPDN)
     {
         for(j=1;j<MAX_X_ITEM;j++)
         {
     	
     	
              if(j==1)
              {		
                  psprintf(RegionValStr[i],":"); 
                  PrintOsdMsg(vcd_mode[mode][i][j],(j<<4)|i,0,1,CH_N);	        
                  
                  
               }
              else if(j==SEL_POS)
              {
              	 
              	 if(vcd_mode[mode][i][j]==STR_OS_SPACE)
              	 {
              	 
              	 	PrintOsdMsg(disp_trk_now<<8,0x20|i,0,0xe,CH_N);      	
              	 	
              	 }	
              	 
              	 else 
              	 {
              	  //psprintf(RegionValStr[i],""); 
                  PrintOsdMsg(vcd_mode[mode][i][j],0x20|i,0,0,CH_N);	        
                 } 
              }	
              
              else if(j==3)
              {
                  PrintOsdMsg(STR_OS_SPACE,0x30|i,0,0,CH_N);	        
              }	
     }//for(j=1
     	
     }//if(vcd_mode	
     	
     	
    	
    }//for(i=1	
     
     
     //psprintf(RegionValStr[select_index+1],"D"); 
     PrintOsdMsg(vcd_mode[mode][select_index+1][3],0x30|(select_index+1),0,0,CH_N);
     
     
     
     if(vcd_mode[mode][select_index+1][2]==STR_OS_SPACE)
     {
     	PrintOsdMsg(disp_trk_now<<8,0x20|(select_index+1),0,0x2e,CH_N);      	
     }
     else
     {	
     psprintf(RegionValStr[select_index+1],"\n"); 
     PrintOsdMsg(vcd_mode[mode][select_index+1][2],0x20|(select_index+1),0,0x21,CH_N);
     }
 }
 else
 {
   if(select_index==0)   
   	PrintOsdMsg(STR_OS_SPACE,0x20|(index_y+1),input_op,3,CH_N);      
   else if(select_index==1)      
    PrintOsdMsg(vcd_track_input<<8,0x20|(index_y+1),input_op,0xf,CH_N); 

 }	
}	


void show_search(BYTE mode,BYTE select,BYTE input_op,BYTE init_osd)
{

  if(init_osd)
   {
   
    ClearOsdMsg(0);
    
   } 
	

  if(cd_type_loaded==CDDVD)
    dvd_search(mode,select,input_op,init_osd);
  else      
    vcd_mode_search(mode,select,input_op);
    
}	


void search_func_select(void)
{
   UINT32 goto_ff,fail=0;		

 

  switch(index_y)
    {
    	
      case 0:
      
      
            if(goto_hour!=0xff)
            {
            
	            goto_time=(goto_hour*3600+goto_min*60+goto_sec);
	            goto_hour=goto_time/3600;
	            goto_min=(goto_time%3600)/60;
	            goto_sec=(goto_time%3600)%60; 
	            
	           if(cd_type_loaded==CDDVD)
	           {
	           		
	           }else if(cd_type_loaded!=CDROM)
	           {
	
	
	            //printf("1.GOTO hh=%d, mm=%d, ss=%d, ff=%d,lin=%d, lout=%d\n",goto_hour,goto_min,goto_sec,goto_ff,leadin_ff,leadout_ff);
	
	 
	            if(IsPBCOn()||((search_mode==0)&&(!IsPBCOn())))
	            {
	              	UINT32 st=0,end=0,user_input;
	              
	               	
	               	user_input=M2I(MSF(((UINT32)goto_hour*60+(UINT32)goto_min),goto_sec,0x0));
	               	
	               	st=M2I(st_msf);
	               	end=M2I(e_msf);
	      	   
	             	if(user_input >=(end-st))
	                	fail=1;	             
	             	else	             
	            		goto_time=MSF(((UINT32)goto_hour*60+(UINT32)goto_min),goto_sec,0x0)+st_msf;	            	
	             	
	            }
	            else	
	            { 
	              
	                UINT16 leadin_ff  = msf_mm(gettrkmsf(1))*60 \
	                    +msf_ss(gettrkmsf(1));
	               UINT16 leadout_ff = msf_mm(gettrkmsf_leadout())*60 \
	                    +msf_ss(gettrkmsf_leadout());   
	
	           
	
	            goto_time=MSF(((UINT32)goto_hour*60+(UINT32)goto_min),goto_sec,0x0)+(gettrkmsf(cd_trk_lo_now)&0x00ffffff);
	            
	            goto_ff = ((goto_time>>16)&0xffff)*60+msf_ss(goto_time);  
	              
	            
	            
	            	if(  goto_ff > leadout_ff ||goto_ff <leadin_ff   )       // leadout area
	            	{
	              // printf("2.GOTO hh=%d, mm=%d, ss=%d, ff=%d, lin=%d, lout=%d\n",goto_hour,goto_min,goto_sec,goto_ff,leadin_ff,leadout_ff);	 
	         	 
	                 fail=1;	                 
	            	}
	            	else 
	            	{	                
	              
	              
	                	flag3S_digit_10=100;
	              	}
	              
	              
	              
	            }
	             
	             
	             
	             
	      
	            }
      
      			if(!fail)
      				ircmd_post_func(CMD_FUNC | CMD_FUNC_GOTO);                
      		}     
      break;
    
      case 1:
      case 2:
      
       if(cd_type_loaded==CDDVD)
       {
       		ircmd_post_func(CMD_FUNC|CMD_PTT_PLAY);
       }
       else
       {
       	       if( (vcd_track_input<=cd_total_trk()) && (vcd_track_input>=cd_trk_lo) )  
       	       {
       		ircmd_post_func(CMD_IR_SELECT | (vcd_track_input)); 
       		
       		}	
       	      else
       	      {
       	       
       	       
       	       
       	       fail=1;
       	      } 
       		                 
       }
      break;
      
    }	//switch
	
	
	
	if(t_disp) //kenny add it 2001/5/8 to recover display information
       t_disp=t_disp+10; 
                 
    ClearOsdMsg(0);
                
    full_scrn=0;        
    digit_cnt=0;
    
    if(fail||(!sys_cmd))
		invalid_key();
}	







void search_func_clear(void)
{
	
    digit_cnt=0;
        
        show_search(search_mode,index_y,0,0);
        
        switch(index_y)
        {
        
         case 0:
         
         goto_hour=0xff;//special value to imply that the goto status which is not yet done 
         goto_min  =0xff;
         goto_sec  =0xff;
         
         break;
         
         case 1:
         
         dvd_chapter=0;
         
         
         break;
         
         case 2:
         
         dvd_title=0;
         
         break;
         
        
        
        	
        	
        	
        }	
        





	
	
	
}	




void search_func_down(void)
{
    BYTE mode_select_num;
      
      
      digit_cnt=0;
      
      goto_hour=0xff;//special value to imply that the goto status which is not yet done 
      goto_min  =0xff;
      goto_sec  =0xff;
      
       
        
     if(cd_type_loaded==CDDVD)
       mode_select_num=dvd_mode_select_num[search_mode];
     else  
       mode_select_num=vcd_mode_select_num[search_mode]; 

      index_y++;
       index_y=index_y%mode_select_num;

      
      
      
      show_search(search_mode,index_y,0,0);
 



	
	
}	




void search_func_up(void)
{



BYTE mode_select_num;

     digit_cnt=0;
     
      goto_hour=0xff;//special value to imply that the goto status which is not yet done 
      goto_min  =0xff;
      goto_sec  =0xff;
     
     
     if(cd_type_loaded==CDDVD)
       mode_select_num=dvd_mode_select_num[search_mode];
     else  
       mode_select_num=vcd_mode_select_num[search_mode];
       
     
     if(!index_y)
     {
          index_y=mode_select_num-1; 
        } 
        else
        {
          index_y--;
          index_y=index_y%mode_select_num;
        }  
      
      
      show_search(search_mode,index_y,0,0);	
	
	
}	


void time_search_input(void)
{

        digit_cnt++;
        switch (digit_cnt) 
        {
        	
        case 1:
          
        
         goto_hour=0;
          goto_min=0;
       	  goto_hour=0;
               
                     
          goto_sec=ir_select_number;
           
                            
           show_search(search_mode,index_y,digit_cnt,0);
         
           
            break;
        	
        case 2:
        
          
         
            
           goto_sec = (goto_sec)*10+ ir_select_number;
           
       
           
           
           show_search(search_mode,index_y,digit_cnt,0);
            break;
        	
        	
        	
        case 3:
           
           
           goto_min=goto_sec/10;
           goto_sec=(goto_sec%10)*10+ir_select_number;
           
       
           
           show_search(search_mode,index_y,digit_cnt,0);
            break;
        case 4:
           
        
          
           
           goto_min=goto_min*10+(goto_sec/10);
           goto_sec=(goto_sec%10)*10+ir_select_number;
           
       
           
           show_search(search_mode,index_y,digit_cnt,0);
            break;
        case 5:
	  
		
	    goto_hour=(goto_min/10);
	    goto_min=(goto_min%10)*10+(goto_sec/10);
	    goto_sec=(goto_sec%10)*10+ir_select_number;
	   
	
	   
           show_search(search_mode,index_y,digit_cnt,0);
            break;
        case 6:
            
            
            break;

        default: break;
            /* ignore other keys */
        }

	
	
	
}	
void search_func_input(void)
{

  
      if(ir_select_number==10)
          ir_select_number = 0;
  
  
       if(index_y==0)
       { 
       	
       	
       	time_search_input();
       
      
       }//if(index_y
       else if(index_y==1)
       {
       	
       	if(cd_type_loaded==CDDVD)
        chapter_search_input();
        else 
        track_search_input();
        
       	 
       	
       	}
        else if(index_y==2)
       {
       	
       	
       	 title_search_input();
       	
       	
       	}
	
}	
	

⌨️ 快捷键说明

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