avplay.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:30k
源码类别:

DVD

开发平台:

C/C++

  1. #include <string.h>
  2. #include "avplay.h"
  3. #include "db.h"
  4. #include "dmd.h"
  5. #include "db.h"
  6. #include "appltype.h"
  7. #include "av.h"
  8. #include "epg.h" 
  9. #include "timeclk.h"
  10. #include "ca_user.h"
  11. #include <string.h>
  12. #include "sipsi.h"
  13. #include "timer.h"
  14. #include "KB_MenuData.h"
  15. #include "kb_machblue_client_task.h"
  16. #define J_PLAY_USE_PID FALSE
  17. //#define J_PLAY_USE_PID TRUE
  18. typedef enum
  19. {
  20.     PLAY_START,
  21.     PLAY_STOP,
  22.     PLAY_PAUSE,
  23.     PLAY_RESUME,
  24.     PLAY_START_IFRAME,
  25.     PLAY_STOP_IFRAME
  26. }PlayRequest;
  27. typedef struct
  28. {
  29.     INT32 nTsId;
  30.     INT32 nPgmNum;
  31. INT32 nPmtPid;
  32. INT32 nVideoPid;
  33. INT32 nAudioPid;
  34. INT32 nPcrPid;
  35. INT32 nCaFlag;
  36. }DTV_AVINFO;
  37. static UINT32 gDtvTaskID;
  38. static UINT32 gDtvQueID;
  39. static KB_SIPatStruct   gDtvPat;
  40. static KB_SIPmtStruct   gDtvPmt;
  41. static KB_SICatStruct   gDtvCat;
  42. static KB_SIPmtStruct   gDtvPrePmt;
  43. static KB_SICatStruct   gDtvPreCat;
  44. static DTV_AVINFO gCurPrg;
  45. static KB_DTVRunCallback gDtvCallBack;
  46. static UINT32 gDtvPmtTimer = 0xffffffff;
  47. static UINT32 gDtvCatTimer = 0xffffffff;
  48. static KB_DTVPrgAVInfo gPrePrgInfo;
  49. static KB_DTVPrgAVInfo gCurPrgInfo;
  50. static KB_DTVStatus gPlayStatus;
  51. time_t  g_avTime;
  52. static KB_DBPrgNode gtPgmNode;
  53. static KB_DBPRGPID gPgmPid;
  54. static UINT8 gCurTrace;
  55. static UINT8 gCurVolume = 20;
  56. static INT32 gMuteFlag;
  57. static INT32 gPrgClass[2];
  58. static void DTV_HandleTuner(KB_OSPMsgNode *pInMsg);
  59. static void DTV_HandleSI_AV(KB_OSPMsgNode *pInMsg);
  60. static void DTV_HandleTuner_AV(KB_OSPMsgNode *pInMsg);
  61. static void DTV_HandleMsg_2(KB_OSPMsgNode *pInMsg);
  62. //static void DTV_ChangeType(INT32 nOldType, INT32 nNewType);
  63. static void DTV_AVCallbackHandle(int intype);
  64. static void  DTV_Task(void);
  65. static INT32 DTV_HandleMsg_1(KB_OSPMsgNode *pInMsg);
  66. static INT32 DTV_HandleSI(KB_OSPMsgNode *pInMsg);
  67. static INT32 DTV_HandlePmt(KB_OSPMsgNode *pInMsg);
  68. static INT32 DTV_GetPmtPid(INT32 nSvcNO);
  69. static void  DTV_CallbackHandle(INT32 nSuccess, 
  70.                                INT32 nHours, 
  71.                                INT32 nMinutes, 
  72.                                INT32 nSeconds);
  73. static void  DTV_PmtTimer(void);
  74. static void  DTV_CatTimer(void);
  75. static INT32 DTV_HandleCat(KB_OSPMsgNode *pInMsg);
  76. static KB_DTVSinglePrgInfo gPrePrg;
  77. static KB_DTVSinglePrgInfo gRetPrg;
  78. extern void KB_MENUTranslateMsg(KB_OSPMsgNode* pInMsg);
  79. extern void kb_mb_service_context_evaluation(int serviceIndex,int service_type);
  80. extern INT32 STB_StateSwitch(INT32 nApplet);
  81. extern void LED_ShowString(char *str);
  82. INT32 KB_DTVInit(void)
  83. {
  84.     memset(&gPrePrgInfo, 0, sizeof(KB_DTVPrgAVInfo));
  85.     memset(&gCurPrgInfo,0, sizeof(KB_DTVPrgAVInfo));
  86.     
  87.     gMuteFlag   = FALSE;
  88.     gPrePrg.prgType = 0xFFFFFFFF;
  89.     gPrePrg.ndtvNO    = 0xFFFFFFFF;
  90.     gPrePrg.nradNO = 0xFFFFFFFF;
  91.     
  92.     gRetPrg.prgType = 0xFFFFFFFF;
  93.     gRetPrg.ndtvNO    = 0xFFFFFFFF;
  94.     gRetPrg.nradNO = 0xFFFFFFFF;    
  95.     
  96.     KB_DTVMute(FALSE);
  97.     KB_OSPQueInit("PLAY", 64, &gDtvQueID);
  98.     KB_OSPTaskInit("PLAY",
  99.                      1024 * 32,
  100.                      (void (*)(void*))DTV_Task,
  101.                      PLAY_PRIORITY,
  102.                      NULL,
  103.                      &gDtvTaskID);
  104.     gDtvPmtTimer = KB_TimerCreate(KB_TIMER_REPEAT, 
  105.                                     (KB_TIMER_FUNC_POINTER)DTV_PmtTimer, 
  106.                                     NULL);
  107.     gDtvCatTimer = KB_TimerCreate(KB_TIMER_REPEAT, 
  108.                                     (KB_TIMER_FUNC_POINTER)DTV_CatTimer, 
  109.                                     NULL);
  110.     
  111.     memset(&gCurPrg, 0, sizeof(DTV_AVINFO));
  112.     gDtvCallBack = NULL;
  113.     KB_AVHandlePlayState(DTV_CallbackHandle);
  114.     return RETOK;
  115. }
  116. INT32 KB_DTVCreate(void)
  117. {        
  118.     KB_EpgCallBack(DTV_HandleTuner_AV);
  119.     KB_DTVCallBack(DTV_AVCallbackHandle);
  120.     
  121.     KB_SIGetTime(&g_avTime);
  122.     if (gCurPrgInfo.prgNO == 0xFFFFFFFF)
  123.     {
  124.         KB_DTVSetPreChnnl();
  125.     }
  126.     
  127.     KB_DTVRun();
  128.     KB_DTVGetEitPF();
  129.     
  130.     return RETOK;    
  131. }
  132. INT32 KB_DTVDestroy(void)
  133. {
  134.     KB_DTVStopAV();
  135.     return RETOK;    
  136. }
  137. INT32 KB_DTVAVHandleMsg(KB_OSPMsgNode *pInMsg)
  138. {
  139.     switch (pInMsg->Word1)
  140.     {
  141.     case MOD_TUNER:
  142.         DTV_HandleTuner(pInMsg);
  143.         break;
  144.     case MOD_SIPSI:
  145.         DTV_HandleSI_AV(pInMsg);
  146.         KB_DTVHandleMsg(pInMsg);
  147.         break;
  148.     case J_EPG_MODULE:
  149.         DTV_HandleTuner_AV(pInMsg);
  150.         break;
  151.     case J_AVAPPLET_MODULE:
  152.         DTV_HandleMsg_2(pInMsg);
  153.         break;
  154.         
  155.     default:
  156.         break;
  157.     }
  158.     return RETOK;    
  159. }
  160. INT32 KB_DTVSetPreChnnl(void)
  161. {
  162.     INT32 prgType, nProgram, nTotalProgram;
  163.     
  164.     prgType = KB_DTVGetPrePrgType();
  165.     switch (prgType)
  166.     {
  167.     case DTVPRG:
  168.         nProgram = KB_DTVGetPreDtvNO();
  169.         break;
  170.     case RADIOPRG:
  171.         nProgram = KB_DTVGetPreRadNO();
  172.         break;
  173.     default:
  174.         prgType = DTVPRG;
  175.         nProgram     = 1;
  176.         break;
  177.     }
  178.     
  179. nTotalProgram = KB_DBGetPrgTotal((UINT8)prgType);
  180. if (nProgram > nTotalProgram || nProgram <= 0)
  181. {
  182. nProgram = 1;
  183. }
  184.     KB_DTVSetPrg((int)prgType, (int)nProgram);
  185.     
  186.     return RETOK;    
  187. }
  188. static void KB_ProcDtvrunCheck(int PrgType, int PrgNO)
  189. {
  190.     INT32 nTotal = 0;
  191.     
  192.     if (PrgType != DTVPRG && PrgType != RADIOPRG)
  193.     {
  194.         printf("nKB_ProcDtvrunCheck::input prgType(%d) error!", PrgType);
  195.         
  196.         PrgType = DTVPRG;
  197.         PrgNO   = 1;
  198.         nTotal = KB_DBGetPrgTotal(PrgType);
  199.         if (nTotal > KB_DB_MAX_DTV || 0 == nTotal)
  200.         {
  201.             printf("nKB_ProcDtvrunCheck::There is no way now, dtv total(%d)!", nTotal);
  202.             return;
  203.         }
  204.         KB_DTVSetPrg(PrgType, PrgNO);
  205.         return;
  206.     }
  207.     nTotal = KB_DBGetPrgTotal(PrgType);
  208.     if (DTVPRG == PrgType)
  209.     {
  210.         if (nTotal > KB_DB_MAX_DTV || 0 == nTotal)
  211.         {
  212.             printf("nKB_ProcDtvrunCheck::dtv nTotal(%d) error!", nTotal);
  213.             return;
  214.         }
  215.     }
  216.     else if (RADIOPRG == PrgType)
  217.     {
  218.         if (nTotal > KB_DB_MAX_RAD || 0 == nTotal)
  219.         {
  220.             printf("nKB_ProcDtvrunCheck::rad nTotal(%d) error!", nTotal);
  221.             return;
  222.         }
  223.     }
  224.     else
  225.     {
  226.         printf("nKB_ProcDtvrunCheck::PrgType(%d) error", PrgType);
  227.         return;
  228.     }
  229.     if (PrgNO > nTotal)
  230.     {
  231.         PrgNO = 1;
  232.         KB_DTVSetPrg(PrgType, PrgNO);
  233.     }
  234.     return;
  235. }
  236. INT32 KB_DTVSetPrg(int prgType, int prgNO)
  237. {  
  238.     if (prgType != DTVPRG && prgType != RADIOPRG)
  239.     {
  240.         return RETFAIL3;
  241.     }
  242.     if (gPrePrgInfo.prgType == prgType
  243.         && gPrePrgInfo.prgNO == prgNO)
  244.     {
  245.         return RETOK;
  246.     }
  247.     
  248.     gPrePrgInfo.prgType = prgType;
  249.     gPrePrgInfo.prgNO = prgNO;
  250.     gRetPrg.prgType = gPrePrg.prgType;        
  251.     gPrePrg.prgType = prgType;
  252.     
  253.     if (prgType == DTVPRG)
  254.     {
  255.         if (gRetPrg.ndtvNO != gPrePrg.ndtvNO)
  256.         {
  257.             gRetPrg.ndtvNO = gPrePrg.ndtvNO;
  258.         }
  259.         gPrePrg.ndtvNO = prgNO;        
  260.     }
  261.     else
  262.     {
  263.         if (gRetPrg.nradNO != gPrePrg.nradNO)
  264.         {
  265.             gRetPrg.nradNO = gPrePrg.nradNO;
  266.         }
  267.         gPrePrg.nradNO = prgNO;        
  268.     }
  269.     return RETOK;    
  270. }
  271. INT32 KB_DTVGetPrg(int *pPrgType, int *pPrgNO)
  272. {
  273.     *pPrgType = gPrePrgInfo.prgType;
  274.     *pPrgNO  = gPrePrgInfo.prgNO;
  275.     return RETOK;    
  276. }
  277. INT32 KB_DTVGetPreDtvNO(void)
  278. {
  279.     return gPrePrg.ndtvNO;
  280. }
  281. INT32 KB_DTVGetPreRadNO(void)
  282. {
  283.     return gPrePrg.nradNO;
  284. }
  285. void PlayCurrectProgram(void)
  286. {
  287. KB_DTVStart(gtPgmNode.Video_Pid, gtPgmNode.Audio_Pid, gtPgmNode.PCR_Pid);
  288. }
  289. INT32 KB_DTVGetPrePrgType(void)
  290. {
  291.     return gPrePrg.prgType;
  292. }
  293. static void DTV_HandleTuner(KB_OSPMsgNode *pInMsg)
  294. {
  295.     switch (pInMsg->Word2)
  296.     {
  297.     case DMD_CALLBACK_SIGNAL_CONNECTED:
  298.         gPlayStatus = KB_DTVRUN;
  299.         #if (J_PLAY_USE_PID == TRUE)
  300.         {
  301.             KB_DTVStart(gPgmPid.Video_Pid, gPgmPid.Audio_Pid, gPgmPid.PCR_Pid);
  302.         }
  303.         #else
  304.         {
  305.            KB_DTVStartCA(0, gCurPrgInfo.nSvcID);
  306.         }
  307.         #endif
  308.         KB_MENUTranslateMsg(pInMsg);
  309.         break;
  310.     case DMD_CALLBACK_SIGNAL_LOST:
  311. {
  312.             KB_MENUTranslateMsg(pInMsg);
  313. }
  314.         break;
  315.         
  316.     default:
  317.         break;
  318.     }
  319.     return;
  320. }
  321. INT32 KB_DTVRun(void)
  322. {
  323.     KB_DMDTunerParameters tTs;
  324.     //INT32 nSvcID;
  325. UINT16 ndbTIMER_Mode;
  326. KB_OSPMsgNode msg;
  327. KB_ProcDtvrunCheck(gPrePrgInfo.prgType, gPrePrgInfo.prgNO);
  328.     ndbTIMER_Mode = KB_DBGetChnlInfoByPrgNO(gPrePrgInfo.prgType, gPrePrgInfo.prgNO, 
  329.                                       &gPrePrgInfo.nFrequency, &gPrePrgInfo.nSymbol, 
  330.                                       &gPrePrgInfo.nQamTyep);  
  331.     gPrePrgInfo.nSvcID = KB_DBGetSvcIDByNO(gPrePrgInfo.prgType, 
  332.                                         gPrePrgInfo.prgNO - 1);    
  333.     if (gPrePrgInfo.prgType == gCurPrgInfo.prgType 
  334.         && gPrePrgInfo.prgNO == gCurPrgInfo.prgNO
  335.         && gPrePrgInfo.nSvcID== gCurPrgInfo.nSvcID
  336.         && gPlayStatus == KB_DTVRUN)
  337.     {
  338.         return RETOK;
  339.     }
  340. KB_CAService(KB_CA_CLOSE,0);
  341. KB_DTVStop();
  342.     if ((KB_AVGetIFrameFlag() == FALSE) 
  343.         && gPrePrgInfo.prgType == RADIOPRG)
  344.     {
  345.      //KB_DTVStop();
  346.      KB_AVPlayIFrame((UINT8 *)IFrmae_Logo_Data, 
  347.                           IFrmae_Logo_Data_length);
  348.     }
  349. if ((KB_AVGetIFrameFlag() == TRUE)
  350. && gPrePrgInfo.prgType == DTVPRG)
  351. {
  352. //KB_DTVStop();
  353.         KB_AVStopIFrame();
  354. }
  355.     KB_DBSaveCurPrgInfo(gPrePrgInfo.prgNO, 
  356.                                  gPrePrgInfo.prgType);
  357.         
  358.     gCurPrgInfo.prgType = gPrePrgInfo.prgType;
  359.     gCurPrgInfo.prgNO  = gPrePrgInfo.prgNO;
  360.     gCurPrgInfo.nSvcID   = gPrePrgInfo.nSvcID;
  361.     //added by whale 07/06/03
  362.     //KB_DBGetVolumeByPrgNo(&gCurVolume, gPrePrgInfo.prgType,gPrePrgInfo.prgNO);
  363.     //added by yyj 2007.6.14
  364.     KB_DBGetPgmCurVol(&gCurVolume);
  365.     KB_DTVSetVolume(gCurVolume);   
  366.     //printf("n[KB_DTVRun]:gCurVolume=%dn",gCurVolume);
  367.     gCurTrace = KB_DTVGetTrack();
  368.     KB_AVSetPrgTrack(gCurTrace);
  369. KB_DBGetPrgAvInfoByPrgNo(gPrePrgInfo.prgType,gPrePrgInfo.prgNO,&gPgmPid);
  370.     gPlayStatus = KB_DTVSTOP;
  371.     //KB_DTVStop();
  372.     KB_EPGStopAllEITPF();
  373.     
  374.     if (gPrePrgInfo.nFrequency == gCurPrgInfo.nFrequency
  375.         && gPrePrgInfo.nSymbol == gCurPrgInfo.nSymbol
  376.         && gPrePrgInfo.nQamTyep == gCurPrgInfo.nQamTyep)
  377.     {           
  378.         KB_DMDGetSignalParameters(&tTs);
  379.         if (KB_DMDQuerySignalStatus() == TRUE
  380.             && tTs.frequency == gCurPrgInfo.nFrequency / 1000
  381.             && tTs.details.qam.symbolRatekSs == gCurPrgInfo.nSymbol / 1000
  382.             && tTs.details.qam.modulation    == gCurPrgInfo.nQamTyep)
  383.         {
  384.             gPlayStatus = KB_DTVRUN;
  385.             #if (J_PLAY_USE_PID == TRUE)
  386.             {
  387.                 KB_DTVStart(gPgmPid.Video_Pid, gPgmPid.Audio_Pid, gPgmPid.PCR_Pid);
  388.             }
  389.             #else
  390.             {
  391.                 KB_DTVStartCA(0, gCurPrgInfo.nSvcID);
  392.             }
  393.             #endif
  394.         }
  395.         else
  396.         {
  397.             tTs.type      = DMD_TYPE_QAM;
  398.             tTs.inversion = INVERSION_AUTO;
  399.             tTs.frequency = gCurPrgInfo.nFrequency / 1000;
  400.             tTs.details.qam.symbolRatekSs = gCurPrgInfo.nSymbol / 1000;
  401.             tTs.details.qam.modulation    = gCurPrgInfo.nQamTyep;
  402.             KB_DMDDropSignal();
  403.             KB_DMDConnectSignal(&tTs);
  404.      //msg to movie client
  405.      msg.Word1=KB_CLIENT_FRE_SWITCH;
  406.      msg.Word2=gCurPrgInfo.nFrequency;
  407.      msg.Word3=gCurPrgInfo.nSymbol;
  408.      msg.Word4=gCurPrgInfo.nQamTyep;
  409.      kb_machblue_task_post(&msg);
  410.         }
  411.     }
  412.     else
  413.     {
  414.         tTs.type      = DMD_TYPE_QAM;
  415.         tTs.inversion = INVERSION_AUTO;
  416.         tTs.frequency = gPrePrgInfo.nFrequency / 1000;
  417.         tTs.details.qam.symbolRatekSs = gPrePrgInfo.nSymbol / 1000;
  418.         tTs.details.qam.modulation    = gPrePrgInfo.nQamTyep;
  419.         gCurPrgInfo.nFrequency  = gPrePrgInfo.nFrequency;
  420.         gCurPrgInfo.nSymbol     = gPrePrgInfo.nSymbol;
  421.         gCurPrgInfo.nQamTyep = gPrePrgInfo.nQamTyep;
  422.         
  423.         KB_DMDDropSignal();
  424.    KB_DMDConnectSignal(&tTs);
  425.         //msg to movie client
  426.         msg.Word1=KB_CLIENT_FRE_SWITCH;
  427.  msg.Word2=gCurPrgInfo.nFrequency;
  428.  msg.Word3=gCurPrgInfo.nSymbol;
  429.  msg.Word4=gCurPrgInfo.nQamTyep;
  430.  kb_machblue_task_post(&msg);
  431.     }    
  432.     //add by steven
  433.     //led show
  434.     {
  435.      char pLED[4];  
  436. if((gCurPrgInfo.prgNO>0)&&(gCurPrgInfo.prgNO<10))
  437. sprintf(pLED,"%s%d","C00",gCurPrgInfo.prgNO);
  438. else if((gCurPrgInfo.prgNO>=10)&&(gCurPrgInfo.prgNO<100))
  439. sprintf(pLED,"%s%d","C0",gCurPrgInfo.prgNO);
  440. else if((gCurPrgInfo.prgNO>=100)&&(gCurPrgInfo.prgNO<1000))
  441. sprintf(pLED,"%s%d","C",gCurPrgInfo.prgNO);
  442. LED_ShowString(pLED);
  443.     }
  444.     //end add by steven
  445.     
  446. kb_mb_service_context_evaluation(gCurPrgInfo.prgNO,gCurPrgInfo.prgType);
  447.     
  448.     return RETOK;
  449. }
  450. INT32 KB_DTVStopAV(void)
  451. {
  452.     gPlayStatus = KB_DTVSTOP;
  453.     KB_DTVStop();
  454.     KB_EPGStopAllEITPF();
  455.     
  456.     if (gCurPrgInfo.prgType == RADIOPRG)
  457.     {
  458.         KB_DTVStopIFrame();
  459.     }
  460.     
  461.     gCurPrgInfo.prgNO = 0xFFFFFFFF;
  462.     return RETOK;
  463. }
  464. void KB_DTVPlayPrg(int  prgType, int prgNO)
  465. {
  466.       KB_DTVSetPrg(prgType, prgNO);
  467. KB_DTVRun();
  468. }
  469. INT32 KB_DTVRunNextPrg(KB_DBPRGType prgType)
  470. {
  471.     KB_DTVSetNextPrg(prgType);
  472.     KB_DTVRun();
  473.     return RETOK;
  474. }
  475. INT32 KB_DTVRunPrePrg(KB_DBPRGType prgType)
  476. {
  477.     KB_DTVSetPrePrg(prgType);
  478.     KB_DTVRun();
  479.     return RETOK;
  480. }
  481. KB_DTVStatus KB_DTVGetRunFlag(void)
  482. {
  483.     return gPlayStatus;
  484. }
  485. INT32 KB_DTVSetVolume(UINT8 nVolume)
  486.     if (nVolume < 0 || nVolume > KB_AV_MAX_VOLUME - 1)
  487.     {
  488.         return RETFAIL3;
  489.     }
  490.     
  491.     gCurVolume = nVolume;    
  492.     KB_AVSetVolume(nVolume);
  493.     //added by yyj 2007.6.14
  494.     KB_DBSavePgmCurVol(gCurVolume);
  495.     return RETOK;
  496. }
  497. INT32 KB_DTVGetVolume(void)
  498. {
  499.     return gCurVolume;
  500. }
  501. INT32 KB_DTVMute(BOOL nMute)
  502. {    
  503.     if (nMute != TRUE && nMute != FALSE)
  504.     {
  505.         return RETFAIL3;
  506.     }
  507.     
  508.     if (gMuteFlag != nMute)
  509.     {
  510.         gMuteFlag = nMute;
  511. KB_AVSetMute(nMute);
  512.     }
  513.     return RETOK;
  514. }
  515. INT32 KB_DTVGetMuteFlag(void)
  516. {
  517.     return gMuteFlag;
  518. }
  519. INT32 KB_DTVGetEitPF(void)
  520. {    
  521.     KB_EPGStopAllEITPF();
  522.     KB_EPGGetEITPF(gCurPrgInfo.nSvcID);
  523.     return RETOK;
  524. }
  525. static void DTV_HandleSI_AV(KB_OSPMsgNode *pInMsg)
  526. {    
  527.     switch (pInMsg->Word2)
  528.     {
  529.     case KB_SI_MSG_TDT_DONE:
  530.         KB_TimeSetCurTime(*((time_t*)pInMsg->Word3));
  531.         KB_MENUTranslateMsg(pInMsg);
  532.         break;            
  533.     case KB_SI_MSG_NIT_CHANGE:
  534.         KB_MENUTranslateMsg(pInMsg);
  535.         break;            
  536.     case KB_SI_MSG_SDT_CHANGE:
  537.         KB_MENUTranslateMsg(pInMsg);
  538.         break;            
  539.         
  540.     default:
  541.         break;
  542.     }
  543.     return;
  544. }
  545. static void DTV_HandleTuner_AV(KB_OSPMsgNode *pInMsg)
  546. {
  547.     KB_SIEitPF *ptEitPf;
  548.     
  549.     switch (pInMsg->Word2)
  550.     {       
  551.     case EPG_MSG_PF_DONE:
  552.         ptEitPf = (KB_SIEitPF*)pInMsg->Word3;
  553.         if (ptEitPf != NULL)
  554.         {
  555.             if (gCurPrgInfo.nSvcID == ptEitPf->service_id)
  556.             {
  557.                 KB_MENUTranslateMsg(pInMsg);
  558.             }
  559.         }
  560.         
  561.         break;
  562.     case EPG_MSG_PF_TIMEOUT:
  563.         break;
  564.         
  565.     default:
  566.         break;
  567.     }
  568.     return;
  569. }
  570. static void DTV_HandleMsg_2(KB_OSPMsgNode *pInMsg)
  571. {
  572.     switch (pInMsg->Word2)
  573.     {       
  574.     case KB_DTVOK:
  575.             KB_MENUTranslateMsg(pInMsg);
  576.         break;
  577.     case KB_DTVFAIL:
  578.             KB_MENUTranslateMsg(pInMsg);
  579.         break;
  580.         
  581.     default:
  582.         break;
  583.     }
  584.     return;
  585. }
  586. INT32 KB_DTVGetClass(INT32 nPrgType)
  587. {
  588. return gPrgClass[nPrgType];
  589. }
  590. void KB_DTVSetClass(INT32 nPrgType, INT32 iPlayClass)
  591. {
  592.     
  593.     gPrgClass[nPrgType] = iPlayClass;
  594. }
  595. #if 0
  596. static void DTV_ChangeType(INT32 nOldType, INT32 nNewType)
  597. {
  598.     if (nOldType == DTVPRG)
  599.     {
  600.         KB_DTVStop();
  601.         //DTV_StartIFrame(gatPlayIframeData, J_PLAY_IFRAME_DATA_SIZE);
  602.     }
  603.     else
  604.     {
  605.         //DTV_StopIFrame();
  606.     }
  607. }
  608. #endif
  609. INT32 KB_DTVSetTrack(KB_DBTRACK nTrackType)
  610. {
  611. //UINT8 bTrackAndVol = 0;
  612.     if (nTrackType != gCurTrace)
  613.     {
  614. gCurTrace = nTrackType;
  615.         KB_AVSetPrgTrack(gCurTrace);
  616. //modified by yyj 2007.6.27
  617.         KB_DBSavePgmCurTrack(gCurTrace);
  618.  //bTrackAndVol = ((gCurTrace & 0x03) << 5) | (gCurVolume & 0x1F);
  619.         //KB_DBSaveTrace(gCurPrgInfo.prgType, gCurPrgInfo.prgNO, 
  620.  //                     bTrackAndVol);
  621.     }
  622.     return RETOK;
  623. }
  624. INT32 KB_DTVSetPrePrg(KB_DBPRGType prgType)
  625. {
  626.     int channelNo, totalChannels;
  627.     
  628.     channelNo = gPrePrgInfo.prgNO;
  629. totalChannels = KB_DBGetPrgTotal(prgType);
  630.     if((channelNo <= 1) || (channelNo > totalChannels))
  631. {
  632. channelNo = (totalChannels + 1);
  633. }
  634. channelNo --;
  635. if(channelNo == 0) 
  636. {
  637. channelNo = 1;
  638. }
  639.     KB_DTVSetPrg(prgType, channelNo);
  640.     return RETOK;
  641. }
  642. KB_DBTRACK KB_DTVGetTrack(void)
  643. {
  644.    // UINT8 bTrack;
  645.     
  646.    //KB_DBGetPgmCurTrack(&bTrack);
  647.    // bTrack = KB_DBGetPrgTrace(gCurPrgInfo.prgType, 
  648.    //                               gCurPrgInfo.prgNO);
  649.    //return bTrack;
  650.    //modified by yyj 2007.6.27
  651.    return gCurTrace;
  652. }
  653. INT32 KB_DTVSaveCurVolume(void)
  654. {
  655. UINT8 bTrackAndVol = 0;
  656. bTrackAndVol = ((gCurTrace & 0x03) << 5) | (gCurVolume & 0x1F);
  657.     KB_DBSaveTrace(gCurPrgInfo.prgType, gCurPrgInfo.prgNO, 
  658.                     bTrackAndVol);
  659.     return RETOK;
  660. }
  661. INT32 KB_DTVSetNextPrg(KB_DBPRGType prgType)
  662. {
  663.     int channelNo, totalChannels;
  664.     
  665.     channelNo = gPrePrgInfo.prgNO;
  666.     totalChannels = KB_DBGetPrgTotal(prgType);
  667.     channelNo ++;
  668. if(channelNo > totalChannels)
  669. channelNo = 1;
  670.     KB_DTVSetPrg(prgType, channelNo);
  671.     return RETOK;
  672. }
  673. INT32 KB_DTVSetRetPrg(KB_DBPRGType nCurPrg)
  674. {
  675.     INT32 prgType, nProgram, nTotalProgram;
  676.     
  677.     prgType = KB_DTVGetPrePrgType();
  678.     if (prgType == 0xFFFFFFFF)
  679.     {
  680.         nProgram = 0xFFFFFFFF;
  681.     }
  682.     else
  683.     {
  684.         if (nCurPrg == prgType)
  685.         {
  686.             switch (prgType)
  687.             {
  688.             case DTVPRG:
  689.                 nProgram = KB_DTVGetPreDtvNO();
  690.                 break;
  691.             case RADIOPRG:
  692.                 nProgram = KB_DTVGetPreRadNO();
  693.                 break;
  694.             default:
  695.                 prgType = DTVPRG;
  696.                 nProgram     = 1;
  697.                 break;
  698.             }
  699.         }
  700.         else
  701.         {
  702.             switch (prgType)
  703.             {
  704.             case DTVPRG:
  705.                 nProgram = KB_DTVGetPreDtvNO();
  706.                 break;
  707.             case RADIOPRG:
  708.                 nProgram = KB_DTVGetPreRadNO();
  709.                 break;
  710.             default:
  711.                 prgType = DTVPRG;
  712.                 nProgram     = 1;
  713.                 break;
  714.             }
  715.         }
  716.     }
  717.     
  718. nTotalProgram = KB_DBGetPrgTotal((UINT8)prgType);
  719. if (nProgram < nTotalProgram && nProgram > 0)
  720.     {
  721.         KB_DTVSetPrg((int)prgType, (int)nProgram);
  722.     }
  723.     
  724.     return RETOK;    
  725. }
  726. INT32 DTV_GetRetChnnl(KB_DBPRGType nCurPrg)
  727. {
  728.     INT32 prgType, nProgram, nTotalProgram;
  729.     
  730.     prgType = KB_DTVGetPrePrgType();
  731.     if (nCurPrg == prgType)
  732.     {
  733.         switch (prgType)
  734.         {
  735.         case DTVPRG:
  736.             nProgram = KB_DTVGetPreDtvNO();
  737.             break;
  738.         case RADIOPRG:
  739.             nProgram = KB_DTVGetPreRadNO();
  740.             break;
  741.         default:
  742.             prgType = DTVPRG;
  743.             nProgram     = 1;
  744.             break;
  745.         }
  746.     }
  747.     else
  748.     {
  749.         switch (prgType)
  750.         {
  751.         case DTVPRG:
  752.             nProgram = KB_DTVGetPreDtvNO();
  753.             break;
  754.         case RADIOPRG:
  755.             nProgram = KB_DTVGetPreRadNO();
  756.             break;
  757.         default:
  758.             prgType = DTVPRG;
  759.             nProgram     = 1;
  760.             break;
  761.         }
  762.     }
  763.     
  764. nTotalProgram = KB_DBGetPrgTotal((UINT8)prgType);
  765. if (nProgram > nTotalProgram || nProgram <= 0)
  766. {
  767. nProgram = 1;
  768. }
  769.     KB_DTVSetPrg((int)prgType, (int)nProgram);
  770.     
  771.     return RETOK;    
  772. }
  773. INT32 KB_DTVGetRetDtvNO(void)
  774. {
  775.     return gRetPrg.ndtvNO;
  776. }
  777. INT32 KB_DTVGetRetRadNO(void)
  778. {
  779.     return gRetPrg.nradNO;
  780. }
  781. INT32 KB_DTVGetRetPrgType(void)
  782. {
  783.     return gRetPrg.prgType;
  784. }
  785. INT32 KB_DTVStart(UINT32 nVideoPid, UINT32 nAudioPid, UINT32 nPcrPid)
  786. {
  787.     KB_OSPMsgNode msgNode;
  788.     msgNode.Word1 = PLAY_START;
  789.     msgNode.Word2 = nVideoPid;
  790.     msgNode.Word3 = nAudioPid;
  791.     msgNode.Word4 = nPcrPid;
  792.     KB_OSPMsgSend(gDtvQueID, &msgNode);
  793.     return RETOK;
  794. }
  795. INT32 KB_DTVStop(void)
  796. {
  797.     KB_OSPMsgNode msgNode;
  798.     msgNode.Word1 = PLAY_STOP;
  799.     
  800.     KB_OSPMsgSend(gDtvQueID, &msgNode);
  801.     KB_TimerDisable(gDtvPmtTimer);
  802.     
  803.     return RETOK;
  804. }
  805. INT32 KB_DTVStartIFrame(UINT8 *pInData, INT32 nDataSize)
  806. {
  807.     KB_OSPMsgNode msgNode;
  808.     msgNode.Word1 = PLAY_START_IFRAME;
  809.     msgNode.Word2 = (UINT32)pInData;
  810.     msgNode.Word3 = (UINT32)nDataSize;
  811.     KB_OSPMsgSend(gDtvQueID, &msgNode);
  812.     
  813.     return RETOK;
  814. }
  815. INT32 KB_DTVStopIFrame(void)
  816. {
  817.     KB_OSPMsgNode msgNode;
  818.     msgNode.Word1 = PLAY_STOP_IFRAME;
  819.     
  820.     KB_OSPMsgSend(gDtvQueID, &msgNode);
  821.     return RETOK;
  822. }
  823. static void DTV_Task(void)
  824. {
  825.     int i, nReturn;
  826.     KB_OSPMsgNode msgNode;
  827.     
  828.     i = 1;
  829.     while (i)
  830.     {
  831.         nReturn = KB_OSPMsgGet(gDtvQueID, KB_Wait, 0, &msgNode);
  832.         if (nReturn != Ret_OK)
  833.         {
  834.             continue;
  835.         }        
  836.         DTV_HandleMsg_1(&msgNode);
  837.     }
  838.     
  839.     return;
  840. }
  841. INT32 KB_DTVHandleMsg(KB_OSPMsgNode *pInMsg)
  842. {
  843.     switch (pInMsg->Word1)
  844.     {
  845.     case MOD_SIPSI:
  846.         DTV_HandleSI(pInMsg);
  847.         break;
  848.     default:
  849.         break;
  850.     }
  851.     return RETOK;
  852. }
  853. static INT32 DTV_HandleMsg_1(KB_OSPMsgNode *pInMsg)
  854. {
  855.     switch (pInMsg->Word1)
  856.     {
  857.     case PLAY_START:
  858.         KB_AVPlay(pInMsg->Word2, pInMsg->Word3, pInMsg->Word4);
  859.         break;
  860.     case PLAY_STOP:
  861.         KB_AVStop();
  862.         break;
  863.     case PLAY_START_IFRAME:
  864.         KB_AVPlayIFrame((UINT8*)pInMsg->Word2, pInMsg->Word3);
  865.         break;
  866.     case PLAY_STOP_IFRAME:
  867.         KB_AVStopIFrame();
  868.         
  869.     default:
  870.         break;
  871.     }
  872.     return RETOK;
  873. }
  874. INT32 KB_DTVStartCA(INT32 nTsId, INT32 nSvcID)
  875. {
  876.     gCurPrg.nPgmNum    = nSvcID;
  877.     gCurPrg.nVideoPid = 0;
  878.     gCurPrg.nAudioPid = 0;
  879.     gCurPrg.nPcrPid   = 0;
  880.     memset(&gDtvPrePmt, 0, sizeof(KB_SIPmtStruct));
  881.     KB_SIStopPat();
  882.     KB_SIGetPat(&gDtvPat, KB_SI_RECEIVE_ONCE, -1);
  883.     KB_SIStopCat();
  884.     KB_SIGetCat(&gDtvCat, KB_SI_RECEIVE_ONCE, -1);
  885.     
  886.    KB_TimerEnable(gDtvPmtTimer, 5000);
  887.     memset(&gDtvPreCat, 0, sizeof(KB_SICatStruct));
  888.    KB_TimerEnable(gDtvCatTimer, 5000);
  889.     
  890.     return RETOK;
  891. }
  892. static INT32 DTV_HandleSI(KB_OSPMsgNode *pInMsg)
  893. {    
  894.     switch (pInMsg->Word2)
  895.     {
  896.     case KB_SI_MSG_PAT_DONE:
  897.         gCurPrg.nPmtPid = DTV_GetPmtPid(gCurPrg.nPgmNum);
  898.         if (gCurPrg.nPmtPid)
  899.         {
  900.             KB_SIStopPmt(-1);
  901.             KB_SIGetPmt(gCurPrg.nPmtPid, gCurPrg.nPgmNum, &gDtvPmt, KB_SI_RECEIVE_ONCE, -1);
  902.             KB_TimerEnable(gDtvPmtTimer, 5000);
  903.         }
  904.         break;
  905.     case KB_SI_MSG_PAT_TIMEOUT:
  906.         break;
  907.     case KB_SI_MSG_PMT_DONE:    
  908.         DTV_HandlePmt(pInMsg);
  909.         break;
  910.     case KB_SI_MSG_PMT_TIMEOUT:
  911.         break;
  912.     case KB_SI_MSG_CAT_DONE:
  913.         DTV_HandleCat(pInMsg);
  914.         break;
  915.     case KB_SI_MSG_CAT_TIMEOUT:
  916.         break;
  917.     case KB_SI_MSG_NIT_DONE:
  918.         break;
  919.     case KB_SI_MSG_NIT_TIMEOUT:
  920.         break;
  921.         
  922.     default:
  923.         break;
  924.     }
  925.     return RETOK;
  926. }
  927. static INT32 DTV_GetPmtPid(INT32 nSvcNO)
  928. {
  929. int  i;
  930. int num;
  931. num = gDtvPat.num;
  932. for(i = 0; i < num; i ++)
  933. {
  934. if( gDtvPat.program[i].program_number == nSvcNO)
  935. {
  936. return (INT32)gDtvPat.program[i].program_map_PID;
  937. }
  938. }
  939.     
  940. return 0;
  941. }
  942. static INT32 DTV_HandlePmt(KB_OSPMsgNode *pInMsg)
  943. {
  944.     INT32 i;
  945.     KB_SIPmtStruct *ptPmt;
  946.     //static  KB_SIPmtStruct thePre_pmt;
  947.     INT32 nVideoPid, nAudioPid, nPcrPid;
  948.     
  949.     ptPmt = (KB_SIPmtStruct*)pInMsg->Word3;
  950.     nVideoPid = nAudioPid = nPcrPid = 0;
  951.     if (memcmp(&gDtvPrePmt, ptPmt, sizeof(KB_SIPmtStruct)) != 0)
  952.     {        
  953.         for(i = 0;i< ptPmt->num;i++)
  954.         {
  955.             if ((ptPmt->stream[i].stream_type == 0x01) 
  956.                || (ptPmt->stream[i].stream_type == 0x02))
  957.             {
  958.                 nVideoPid = ptPmt->stream[i].elementary_PID;
  959.             }
  960.             if ((ptPmt->stream[i].stream_type == 0x03) 
  961.                || (ptPmt->stream[i].stream_type == 0x04)) 
  962.             {
  963.                 nAudioPid = ptPmt->stream[i].elementary_PID;
  964.             }
  965.             if (nVideoPid != 0 && nAudioPid != 0)
  966.             {
  967.                 break;
  968.             }
  969.         }
  970.         nPcrPid = ptPmt->PCR_PID;        
  971. //printf("nChannel switch gCurPrg.nVideoPid[%d]nVideoPid[%d]  gCurPrg.nAudioPid[%d]nAudioPid[%d]  gCurPrg.nPcrPid [%d]nPcrPid[%d]",gCurPrg.nVideoPid,nVideoPid,gCurPrg.nAudioPid,nAudioPid,gCurPrg.nPcrPid,nPcrPid);
  972.         if (   gCurPrg.nVideoPid != nVideoPid
  973.             || gCurPrg.nAudioPid != nAudioPid
  974.             || gCurPrg.nPcrPid   != nPcrPid)
  975.         {
  976.             gCurPrg.nVideoPid = nVideoPid;
  977.             gCurPrg.nAudioPid = nAudioPid;
  978.             gCurPrg.nPcrPid   = nPcrPid;
  979.             KB_TimerDisable(gDtvPmtTimer);
  980.             KB_TimerDisable(gDtvCatTimer);
  981.             
  982.             KB_DTVStart(nVideoPid, nAudioPid, nPcrPid);
  983.         }
  984.                 
  985.         memcpy(&gDtvPrePmt, ptPmt, sizeof(KB_SIPmtStruct));
  986. KB_CAService(KB_CA_PMTUPDATE, (void *)ptPmt);
  987.         
  988.         
  989.     }   
  990.     return RETOK;
  991. }
  992. static void DTV_CallbackHandle(INT32 nSuccess, 
  993.                               INT32 nHours, 
  994.                               INT32 nMinutes, 
  995.                               INT32 nSeconds)
  996. {
  997.     INT32 nPlay;
  998.     
  999. if(nSuccess)
  1000. {
  1001. nPlay = 0;
  1002. }
  1003. else
  1004. {
  1005. nPlay = 1;
  1006. }
  1007.     if (gDtvCallBack)
  1008.     {
  1009.         gDtvCallBack((int)nPlay);
  1010.     }
  1011. }
  1012. KB_DTVRunCallback KB_DTVCallBack(KB_DTVRunCallback ptCallback)
  1013. {
  1014.     KB_DTVRunCallback ptPreCallback;
  1015.     ptPreCallback = gDtvCallBack;
  1016.     gDtvCallBack = ptCallback;
  1017.     return ptPreCallback;
  1018. }
  1019. static void DTV_PmtTimer(void)
  1020. {
  1021.     KB_SIStopPat();
  1022. KB_SIGetPat(&gDtvPat, KB_SI_RECEIVE_ONCE, -1);
  1023. }
  1024. static void DTV_CatTimer(void)
  1025. {
  1026.     KB_SIStopCat();
  1027.     KB_SIGetCat(&gDtvCat, KB_SI_RECEIVE_ONCE, -1);
  1028. }
  1029. static INT32 DTV_HandleCat(KB_OSPMsgNode *pInMsg)
  1030. {
  1031.     KB_SICatStruct *ptCat;
  1032.     ptCat = (KB_SICatStruct*)pInMsg->Word3;
  1033.     if (memcmp(&gDtvPreCat, ptCat, sizeof(KB_SICatStruct)) != 0)
  1034.     {
  1035.         memcpy(&gDtvPreCat, ptCat, sizeof(KB_SICatStruct));
  1036. KB_CAService(KB_CA_CATUPDATE, (void *)ptCat);//播放第一个加密节目时,调用这个函数有问题。
  1037.     }
  1038.     return RETOK;
  1039. }
  1040. static void DTV_AVCallbackHandle(int intype)
  1041. {
  1042. KB_OSPMsgNode pInMsg;
  1043. pInMsg.Word1 = J_AVAPPLET_MODULE;
  1044.     pInMsg.Word2 = 0;
  1045. pInMsg.Word3 = 0;
  1046. pInMsg.Word4 = 0;
  1047.     switch (intype)
  1048.     {
  1049.     case 0:
  1050.         pInMsg.Word2 = KB_DTVOK;
  1051.         break;
  1052.     case 1:
  1053.         pInMsg.Word2 = KB_DTVFAIL;
  1054.         break;
  1055.     default:
  1056.         break;
  1057.     }
  1058.     DTV_HandleMsg_2(&pInMsg);
  1059.         
  1060. }
  1061. //播放当前节目
  1062. void KB_DTVPlayCurPrg(void)
  1063. {
  1064. UINT8  prgType;
  1065.      unsigned short prgNO;
  1066. KB_DBGetCurPrgInfo(&prgNO,&prgType);
  1067. KB_DTVSetPrg(prgType, prgNO);
  1068. KB_DTVRun();
  1069.     KB_DTVGetEitPF();
  1070. }
  1071. //播放上一节目
  1072. void KB_DTVPlayPrePrg(void)
  1073. {
  1074. KB_DTVSetPrePrg(KB_DTVGetPrePrgType());
  1075. KB_OSPTaskDelay(500);        
  1076. STB_StateSwitch(State_AV); 
  1077. }
  1078. //播放下一节目
  1079. void KB_DTVPlayNexPrg(void)
  1080. {
  1081. KB_DTVSetNextPrg(KB_DTVGetPrePrgType());
  1082. KB_OSPTaskDelay(500);        
  1083. STB_StateSwitch(State_AV);
  1084. }
  1085. int KB_DTVGetCurrentProgramNo(void)
  1086. {
  1087. return gCurPrgInfo.prgNO;
  1088. }
  1089. //切换节目类型
  1090. INT32 KB_DTVPrgSwitch(KB_DBPRGType type)
  1091. {
  1092. if(KB_DBGetPrgTotal(type)==0)
  1093. {
  1094. return RETFIAL1;
  1095. }
  1096.       KB_DTVSetPrg(type,1);
  1097. KB_OSPTaskDelay(500);
  1098.        STB_StateSwitch(State_AV);     
  1099. return RETOK;
  1100. }
  1101. void KB_DTVVolumeAdd(void)
  1102. {
  1103. UINT8 vol;
  1104. vol=(UINT8)KB_DTVGetVolume();
  1105. printf("n[Han]:Volume add [%d]",vol);
  1106. if(vol<KB_AV_MAX_VOLUME)
  1107. {
  1108. vol+=1;
  1109. KB_DTVSetVolume(vol);
  1110. }
  1111. }
  1112. void KB_DTVVolumeReduce(void)
  1113. {
  1114. UINT8 vol;
  1115. vol=(UINT8)KB_DTVGetVolume();
  1116. printf("n[Han]:Volume reduce [%d]",vol);
  1117. if(vol>0)
  1118. {
  1119. vol-=1;
  1120. KB_DTVSetVolume(vol);
  1121. }
  1122. }
  1123. void KB_DTVDisplayCurPrgInfo(void)
  1124. {
  1125.     printf("nn--------KB_DTVDisplayCurPrgInfo---------");
  1126.     printf("nprgType:     %d", gCurPrgInfo.prgType);
  1127.     printf("nprgNO:       %d", gCurPrgInfo.prgNO);
  1128.     printf("nnSvcID:      %d", gCurPrgInfo.nSvcID);
  1129.     printf("nnFrequency:  %d", gCurPrgInfo.nFrequency);
  1130.     printf("nnSymbol:     %d", gCurPrgInfo.nSymbol);
  1131.     printf("nnQamTyep:    %d", gCurPrgInfo.nQamTyep);
  1132.     return;
  1133. }
  1134. BOOL KB_DTVGetCurPrgInfo(unsigned short *pTsID, unsigned short *pServID)
  1135. {
  1136.     BOOL ret;
  1137. unsigned long fre=gCurPrgInfo.nFrequency/100000;
  1138.     if (!KB_DBGetTsIDByFre(pTsID,fre))
  1139.     {
  1140.         *pServID = gCurPrgInfo.nSvcID;
  1141.    ret = TRUE;
  1142.     }
  1143.     else
  1144.     {
  1145.    ret = FALSE;
  1146.     }
  1147.     return ret;
  1148. }
  1149. //将VEDIO的编码状态设置为VIDEO_STATUS_STOPPED
  1150. void KB_DTVRunForNvod(void)
  1151. {
  1152.     KB_CAService(KB_CA_CLOSE, 0);
  1153.     KB_DTVSetVolume(gCurVolume);   
  1154.     gCurTrace = KB_DTVGetTrack();
  1155.     KB_AVSetPrgTrack(gCurTrace);
  1156.     gPlayStatus = KB_DTVSTOP;
  1157.     KB_DTVStop();
  1158.     KB_DTVStopIFrame();
  1159. }
  1160.  void KB_DTVStartCurCAProg(void)
  1161.  {
  1162.    KB_DTVStartCA(0, gCurPrgInfo.nSvcID);
  1163.  }
  1164. /* EOF */