?? gui.cpp
字號:
/***************************************** Copyright (c) 2001-2003 Sigma Designs, Inc. All Rights Reserved Proprietary and Confidential *****************************************/#ifndef ALLOW_OS_CODE#define ALLOW_OS_CODE 1#endif //ALLOW_OS_CODE#include <signal.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "gui.h"#include "guicommands.h"#include "guinavigation.h"#include "rmlibcw/include/rmthreads.h"#include "rmlibcw/include/rmcriticalsections.h"#include "../rmgfx_library/include/subreader.h"#if 1#define GUIDBG ENABLE#else#define GUIDBG DISABLE#endifstatic RMthread g_thread = NULL;static RMthread g_threadAnimate = NULL;RMcuracaoGui* g_gui = NULL;RMbool g_exitTimerThread = FALSE;RMuint8 g_timer[MAX_GUI_TIMERS];RMint16 animate;RMint16 loader = -1;RMcriticalsection cs;extern sub_context subs;typedef struct tagShortCut{ RMremoteKey key; RMuint16 command; RMascii* link; RMuint16 submenu;} ShortCut;ShortCut shortcuts[] ={{ RM_HW_SC1, LOAD_TV_LIST, "TV" },{ RM_HW_SC2, SHOW_LIST_COMMAND_SHORTCUT, "VOD", 0 },{ RM_HW_SC3, SHOW_LIST_COMMAND_SHORTCUT, "MOD", 0 },{ RM_HW_SC4, SHOW_LIST_COMMAND_SHORTCUT, "InfoAll", 0 },{ RM_HW_SC5, SHOW_PAGE_COMMAND, "", 0 },{ RM_HW_SC6, SHOW_PAGE_COMMAND, "", 0 },{ RM_HW_SC7, SHOW_LIST_COMMAND_SHORTCUT, "Status", 0 },{ RM_HW_SC8, SHOW_LIST_COMMAND_SHORTCUT, "ServicesList", 3 },};void* TimerThreadEntry(void* p){ RMMemset(g_timer, 0, sizeof(g_timer)); RMuint8 i; struct timespec usleep_req = { 0, 100000000 }; //struct timespec usleep_req = { 0, 20000000 }; while (g_exitTimerThread == FALSE) { nanosleep(&usleep_req, 0); for (i = 0; i < MAX_GUI_TIMERS; i++) { if (g_timer[i] != 0) { if (--g_timer[i] == 0) ((RMcuracaoGui*) g_gui)->HandleTimerTimeout((RMguiTimerType) i); } } } return NULL;}void* TimerThreadEntryAnimate(void* p){ animate = 0; //RMMemset(g_timer, 0, sizeof(g_timer)); //RMuint8 i; //struct timespec usleep_req = { 0, 100000000 }; //struct timespec usleep_req = { 0, 41666667 }; struct timespec usleep_req = { 0, 20000000 }; //struct timespec usleep_req = { 0, 5000000 }; while (g_exitTimerThread == FALSE) { nanosleep(&usleep_req, 0); //RMEnterCriticalSection(cs); //for(i = 0; i < MAX_GUI_TIMERS; i++) { RMEnterCriticalSection(cs); if (animate > 0) { //RMMicroSecondSleep(5000); --animate; if (animate <= 0) ((RMcuracaoGui*) g_gui)->HandleTimerTimeout((RMguiTimerType) TIMER_WAIT_ANIMATION); } if (loader >= 0) { // printf("animate\n"); //RMMicroSecondSleep(5000); // --loader; //if (loader == 0) ((RMcuracaoGui*) g_gui)->HandleTimerTimeout((RMguiTimerType) TIMER_LOAD_ANIMATION); } RMLeaveCriticalSection(cs); } //RMLeaveCriticalSection(cs); } return NULL;}RMcuracaoGui::RMcuracaoGui(typeCuracaoContext *context) : m_context(context), m_pRua(0), m_isDiscDetected(FALSE), // m_discType(RM_NO_DISC), m_videoOut(SET_TV_NTSC_CSVIDEO_COMMAND), m_blocked(FALSE){ m_initialized = 0; //, RMCopyAscii(m_repeatModeStr, REPEAT_OFF_STR); RMMemset(&m_settings, 0, sizeof(guiPlayerSettingsType)); RMMemset(&m_loadsettings, 0, sizeof(guiPlayerSettingsType)); m_pRua = (struct RUA*) m_context->decoder->GetRUAInstance(); m_crc_table_computed = FALSE; InitRandomNumberGeneration(); m_gui.gui = this; m_gui.pRua = m_pRua; m_pnav = NULL; m_bTV = FALSE; m_bMissingChannel = FALSE; g_gui = this; g_thread = RMCreateThread("GuiTimerThread", TimerThreadEntry, this); cs = RMCreateCriticalSection(); m_csBlocked = RMCreateCriticalSection(); g_threadAnimate = RMCreateThread("GuiTimerThread", TimerThreadEntryAnimate, this);}RMcuracaoGui::~RMcuracaoGui(){ UnmountCDROM(); Close(); g_exitTimerThread = TRUE; RMWaitForThreadToFinish(g_thread); RMWaitForThreadToFinish(g_threadAnimate); RMDeleteCriticalSection(cs); RMDeleteCriticalSection(m_csBlocked);}struct DCC *RMcuracaoGui::GetDCCHandle(){ return (struct DCC*) m_context->decoder->GetDCCInstance();}void RMcuracaoGui::InitVars(){ m_muteOn = FALSE; m_infoOn = FALSE; m_zoomOn = FALSE; m_menuOn = FALSE; m_shuffleOn = FALSE; m_scrollOn = FALSE; m_zoomStep = 0; m_panStepX = 0; m_panStepY = 0; m_fipSpeed = 3; // 10/3 seconds m_fxTimer = 0; m_SSTimeOut = 0; m_SSIntervalTimeOut = 0; m_screenSaverSpeed = 5 * 60; //5 minutes m_playMode = STATE_CLOSE; // init should be close, not stop m_previousVideoOut = 0; m_previousTVStandard = 0; m_previousComponentOut = 0; m_protectType = RMUnprotected; m_drawingPicture = FALSE; m_resumeDvd = FALSE; m_userSkipped = FALSE; m_isNeroMP4 = FALSE; m_bTV = FALSE; m_bTVMenuOn = FALSE; RMMemset(&m_screenFormat, 0, sizeof(guiScreenFormatType)); RMMemset(&m_isoPlayList, 0, sizeof(typePlayList)); RMMemset(&m_MediaList, 0, sizeof(typeMediaList)); RMMemset(&m_MediaResumeInfo, 0, sizeof(typeMediaResumeInfo)); m_wmvHDDRMError = 0; m_DRMError = 0;#ifdef WITH_WMVHD_SUPPORT m_wmvHDStartUpSequenceOn = FALSE; m_wmvHDRegionError = FALSE;#endif // WITH_WMVHD_SUPPORT m_fxTimer = 0; m_fxPosition = 0; m_fipText = ""; m_fipScrollBuffer[FIP_DISPLAY_LENGTH] = '\0';#ifdef GUI_REFID_2 m_selectionMenuSource = ""; m_kmlOn = FALSE; m_popupOnHold = 0; m_objectOnHold = 0; m_videoConnector = 0; m_kmlPlayback = FALSE; m_osdFade = 0; m_activeKeyboard = KBD_NORMAL_LOWERCASE; m_parentPageId = 0; m_keyboardInput[0] = '\0'; m_capsLockOn = FALSE; m_keyboardListener = 0; pcLinkhostlist = 0; maxHostItems = 0; activeBitmap = 0; m_eventText = TRUE; m_playerMode = PLAYER_MODE_IDLE;#else m_eventText = FALSE;#endif#ifdef GUI_REFID_3 m_nbEnrolmentItems = 0; m_currentEnrolmentPage = 0;#endif ResetNumericInput(); // clear out secret code input for (RMuint8 i = 0; i < sizeof(m_secretcodeinput) / sizeof(m_secretcodeinput[0]); i++) m_secretcodeinput[i] = (RMremoteKey) 0; // Reset timers KillTimer(TIMER_NONE, TRUE);}RMstatus RMcuracaoGui::Initialize(RMnonAscii *xmlFile){ RMstatus status = RM_ERROR; if (m_initialized) return ReInitialize(xmlFile); InitVars(); m_pnav = new RMcuracaoGuiNavigation(&m_gui); if (m_pnav == NULL) return RM_ERROR; printf("Reading XML file\n"); status = m_pnav->Init(xmlFile); if (RMFAILED(status)) goto cleanup; m_pnav->GetScreenFormat(&m_screenFormat); if (RMSUCCEEDED(status)) { m_initialized = TRUE; RetrievePlayerSettings();#ifdef GUI_REFID_3 UpdateMenuState();#endif m_pnav->MakeVideoOutCommandList(); printf("Loading MAIN PAGE\n"); return ShowPage(m_pnav->MainPageId()); } cleanup: Close(); return status;}RMstatus RMcuracaoGui::ReInitialize(RMnonAscii *xmlFile){ RMstatus status = RM_ERROR; InitVars(); RMASSERT(m_pnav != NULL); status = m_pnav->ReInit(xmlFile); if (RMFAILED(status)) goto cleanup; status = m_pnav->GetScreenFormat(&m_screenFormat); if (RMSUCCEEDED(status)) { SetTVType(m_settings.tvType);#ifdef GUI_REFID_2 return ShowPage(m_pnav->MediaLibraryPageId());#else return ShowPage(m_pnav->MainPageId());#endif } cleanup: Close(); return status;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////RMstatus RMcuracaoGui::DiscState(){ m_isDiscDetected = m_context->isDiscDetected; // m_discType = m_context->discType; if ((m_playMode != STATE_STOP) && (m_playMode != STATE_CLOSE)) return RM_OK; if (m_isDiscDetected) {#ifdef WITH_WMVHD_SUPPORT MountCDROM(); if (IsWMVHD()) { RMstatus status; status = m_pnav->CheckWMVHDRequirements(m_settings.dvdRegion); if (RMFAILED(status)) { m_wmvHDRegionError = TRUE; return RM_OK; } // requirements checked out, wait to get media player // creation notification (thru Notify()) to release current // navigation and continue with WMVHD init //printf("requirements checked waiting for media player\n"); } else { if (m_pnav->WMVHDOn()) { ReInitialize((RMnonAscii *) GUI_XML); } ShowPage(m_pnav->MediaLibraryPageId()); }#else ShowPage(m_pnav->MediaLibraryPageId());#endif // WITH_WMVHD_SUPPORT } return RM_OK;}// remote control keysRMstatus RMcuracaoGui::InterpretCommand(RMremoteKey c){ RMstatus status = RM_ERROR; printf("RMcuracaoGui::InterpretCommand\n"); if(!BlockedKEY()) { m_SSTimeOut = 0; CheckNumericInput(c); if (c != RM_HW_OSD && m_infoOn) { HandleInfo(); } switch (c) { //case RM_HW_EJECT: // open/close command // if(m_context->disc != 0){ // status = HandleEject(); // } // break;#ifdef GUI_REFID_2#ifndef GUI_REFID_3 case RM_HW_OPTIONS: fprintf(stderr, "Option event received\n"); return HandleOptions(); case RM_HW_KISS_ONLINE: fprintf(stderr, "KiSS online triggered\n"); return StartKml(KML_KISS_PAGE);#endif#endif //ref2 case RM_HW_ON_OFF: // exit HandleWelcome(); break; case RM_HW_EJECT: RMDBGLOG((GUIDBG, "Received EXIT\n")); return HandlePower(); case RM_HW_OSD: status = HandleInfo(); break; case RM_HW_VOL_PLUS: case RM_HW_VOL_MINUS: status = HandleVolume(c); break; case RM_HW_MUTE: status = HandleMute(); break; case RM_HW_CLEAR: status = HandleClear(); break; case RM_HW_HELP: status = HandleHelp(); break; case RM_HW_L_R: //for pc rc case RM_HW_SEARCH: status = HandleTimeSearch(); break; case RM_HW_LEFT: case RM_HW_RIGHT: if (!m_bTV && (m_playMode != STATE_STOP) && (m_playMode != STATE_CLOSE)) { if (c == RM_HW_LEFT) status = HandleTrickMode(RM_HW_FAST_REWIND); else status = HandleTrickMode(RM_HW_FAST_FORWARD); break; } case RM_HW_UP: case RM_HW_DOWN: status = HandleSelection(c); break; case RM_HW_SELECT: if (!m_bTV && (m_playMode != STATE_STOP) && (m_playMode != STATE_CLOSE)) status = HandlePlay(); else status = HandleActivation(); break; case RM_HW_ENT:#if (EM86XX_MODE==EM86XX_MODEID_STANDALONE) status = HandleActivation();#else status = HandleRepeat(TRUE);#endif break; case RM_HW_PROGRAM: // for pc rc// case RM_HW_SETUP: status = HandleSetup(); break; case RM_HW_RETURN: status = HandleReturn(); break; case RM_HW_KEY_0: case RM_HW_KEY_1: case RM_HW_KEY_2: case RM_HW_KEY_3: case RM_HW_KEY_4: case RM_HW_KEY_5: case RM_HW_KEY_6: case RM_HW_KEY_7: case RM_HW_KEY_8: case RM_HW_KEY_9: status = HandleNumericInput(c); // gui forwards accumulated input to players via RM_HW_NUMERIC_INPUT if (status == RM_ERROR) status = RM_UNKNOWN_KEY; break; case RM_HW_PAUSE_PLAY: status = HandlePause(); break; case RM_HW_PLAY_PAUSE: status = HandlePlay(); break; case RM_HW_STOP: status = HandleStop(); break; case RM_HW_PREV_TRACK: status = HandlePrevious(); break; case RM_HW_NEXT_TRACK: status = HandleNext(); break; case RM_HW_REPEAT: status = HandleRepeat(TRUE); break; case RM_HW_ZOOM: status = HandleZoom(); break; case RM_HW_TVMODE: case RM_HW_VGA_TV: // for pc rc status = HandleVideoOut(); break; case RM_HW_FAST_REWIND: case RM_HW_FAST_FORWARD: case RM_HW_SLOW_REVERSE: case RM_HW_SLOW_FORWARD: if (!m_bTV)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -