o_program.c

来自「ZORAN 962/966 SOURCE CODE,DVD chip」· C语言 代码 · 共 1,173 行 · 第 1/3 页

C
1,173
字号
/***************************************************************************************
* 	Operation functions
****************************************************************************************/

/***************************************************************************************
*	Function 	: 	_ProgramComponentOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	MSO_PROGRAM user operation function.
****************************************************************************************/
STATIC MS_OP _ProgramComponentOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
		case MS_OP_MENU:
		case MS_OP_TITLE:
		case MS_OP_RETURN:
		case MS_OP_PBC:
		case MS_OP_AUDIO:
		case MS_OP_SUBTITLE:
		case MS_OP_ANGLE:
		case MS_OP_JPEG_ROTATION:
		case MS_OP_PLAY_MODE:
		case MS_OP_MARKAB:
		case MS_OP_REPEAT:
		case MS_OP_SHUFFLE:
		case MS_OP_INTRO_PLAY:
		case MS_OP_SKIPB:
		case MS_OP_SKIPF:
		case MS_OP_FASTB:
		case MS_OP_FASTF:
		case MS_OP_SLOWF:
		case MS_OP_SLOWB:
		case MS_OP_STEPF:
		case MS_OP_CHAPTER_MARKER_SKIP:
		case MS_OP_BOOKMARK:
		case MS_OP_PREV_INDEX:
		case MS_OP_NEXT_INDEX:
		case MS_OP_PAUSE:
		case MS_OP_STOP:
		case MS_OP_RESUME_STOP:
		case MS_OP_KARAOKE:
		case MS_OP_3D:
		case MS_OP_LR:
		case MS_OP_SIX_CHANNEL:
		case MS_OP_MIC_ON_OFF:
		case MS_OP_EQUALIZER:
		case MS_OP_SPECTRUM:
		case MS_OP_PROLOGIC:
		case MS_OP_ZOOM:
		case MS_OP_TV_SYS:
		case MS_OP_VIDEO_OUTMODE:
		case MS_OP_VIDEO_ENHANCE:
		case MS_OP_PSO_MODE:
		case MS_OP_HD_RESOLUTION:
		case MS_OP_DISPLAY:
		case MS_OP_MAESTROLINK:
		case MS_OP_DIGEST:
		case MS_OP_SEARCH:
		case MS_OP_MPP:
		case MS_OP_DD_EX:
		case MS_OP_MUTE:
		case MS_OP_0: 
		case MS_OP_1: 
		case MS_OP_2: 
		case MS_OP_3: 
		case MS_OP_4: 
		case MS_OP_5: 
		case MS_OP_6: 
		case MS_OP_7: 
		case MS_OP_8: 
		case MS_OP_9:
#ifdef D_DIRECT_KEY_SMART_PICTURE
	case MS_OP_SMART_PICTURE:
#endif
		case MS_OP_VOLUME_DOWN:
		case MS_OP_VOLUME_UP:
			return MS_OP_NONE;

		case MS_OP_EJECT:
		case MS_OP_SETUP:
			{
				MSO_PROGRAM __NEAR* pProgram 	= (MSO_PROGRAM __NEAR*)pThis;

				pProgram->moParam.mbIsPlayBeforeOpened = FALSE;
				// Indicate that the menu is to be closed
				MS_SendOperation(pThis, MS_OP_CLOSE_PARENT, 0);
			}
			break;

		case MS_OP_CLEAR:
			{
				MSO_OBJECT __NEAR* pObject = (MSO_OBJECT __NEAR*)MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oClearButtonDescriptor);

				MS_SendOperation(pObject, MS_OP_ENTER, 0);
			}
			return MS_OP_NONE;

		case MS_OP_PLAY:
		case MS_OP_PLAY_PAUSE:
			{
				MSO_OBJECT __NEAR* pObject = (MSO_OBJECT __NEAR*)MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oPlayButtonDescriptor);

				MsOp = MS_SendOperation(pObject, MS_OP_ENTER, 0);
			}
			break;
			
		case MS_OP_INIT:
			MS_ComponentInitFocus((MSO_COMPONENT __NEAR*)pThis);
			_ProgramListInit((MSO_PROGRAM __NEAR*)pThis);
			break;
		
		case MS_OP_PROGRAM:
			MsOp = MS_OP_CLOSE_PARENT;
			break;
	}

	MsOp = MS_BasicContainerOperation(pThis, MsOp, lParam);

	switch (MsOp)
	{
		case MS_OP_CLOSE_PARENT:
#ifdef D_GUI_SINGLE_LINE_COMPONENT
			//switch to runtime layout
			OSDTurnOff();
			usleep(10000);
			LayoutRuntime();
			VPU_SetOSDStatus(VPU_OSD_STATUS_START_E);
			{
				MSO_OBJECT __NEAR* pPopupContainer = (MSO_OBJECT __NEAR*)pThis->mpParent;
				
				MS_ObjectResize(pPopupContainer, AREA_POPUP_W, AREA_POPUP_H);
				MS_ObjectMove(pPopupContainer, AREA_POPUP_X, AREA_POPUP_Y);
			}
#endif // D_GUI_SINGLE_LINE_COMPONENT
			MS_SetToBeRemoved(pThis);
			MS_DisplayAddObject(pThis);
			// Restore the focus to the object that was focus before component poped-up.
			// This object gaining focus will ask itself for display if required.
			if (MS_IsFocused(pThis))
				MS_ScreenSetFocusObject(MS_ScreenGetPrevFocusObjectInMenu(pThis));
			
			_ProgramPendingPlay((MSO_PROGRAM __NEAR*)pThis);
			
			return MS_OP_NONE;
	}
	return MsOp;
}

/***************************************************************************************
*	Function 	: 	_ProgramListDisplayOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oProgramListDisplayDescriptor.
****************************************************************************************/
#pragma argsused
STATIC MS_OP _ProgramListDisplayOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	return MsOp;
}

/***************************************************************************************
*	Function 	: 	_TrackVScrollListOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oTrackVScrollListDescriptor.
****************************************************************************************/
STATIC MS_OP _TrackVScrollListOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{		
		case MS_OP_RIGHT:
			{
				MSO_CONTAINER __NEAR* pParent = (MSO_CONTAINER __NEAR*)pThis->mpParent;
				MSO_OBJECT __NEAR* pObject = (MSO_OBJECT __NEAR*)MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pParent, (MS_DESCRIPTOR*)&oPlayButtonDescriptor);

				MS_ScreenSetFocusObject(pObject);
				return MS_OP_NONE;
			}
	}

	MsOp = VScrollListOperation(pThis, MsOp, lParam);

	// Post-processing
	switch(MsOp)
	{		
	case MS_OP_REFRESH:
		{			
			MSO_VLIST __NEAR* pList = (MSO_VLIST __NEAR*)MS_GetObjectListPtr(pThis);				
			MS_ASSERT(NULL != pList);

			if(pList->moParam.mwTotalItems > pList->moParam.mcNumVisibleItems)
			{
				// Remove all items.
				MS_SendOperation((MSO_OBJECT __NEAR*)pList, MS_OP_EMPTY, 0);

				switch(CoreAPI_GetCurrentMediaType())
				{
					case MEDIA_TYPE_SVCD:
					case MEDIA_TYPE_VCD:
						_AddItemsToVCDTrackList((MSO_VLIST __NEAR*)pList);
						break;

					case MEDIA_TYPE_DVD_VIDEO:
						if (0 == pList->moParam.mdwData)
							_AddItemsToTitleList((MSO_VLIST __NEAR*)pList);
						else
							_AddItemsToChapterList((MSO_VLIST __NEAR*)pList);
						break;
				}
				MS_DisplayAddObject(pThis);	

				// Set focus to the appropriate list item.
				if(MS_IsFocused(pList))
				{
					MSO_OBJECT __NEAR* pObject = MS_GetObjectListPtr(pList);
						
					if(!MS_IS_FOCUS_ON_LASTITEM(pList))	
						MS_ScreenSetFocusObject(pObject);
					else
					{						
						// Make sure we do not set focus on the Value VScroll list.					
						while(NULL != pObject->mpNext)
							pObject = pObject->mpNext;						
						MS_ScreenSetFocusObject(pObject);
					}
				}
			}			
		}
		return MS_OP_NONE;
		
	default:
		break;
	}	
	return MsOp;
}

/***************************************************************************************
*	Function 	: 	_TrackVListOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oTrackVListDescriptor.
****************************************************************************************/
STATIC MS_OP _TrackVListOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
	case MS_OP_INIT:
		{
			MSO_OBJECT __NEAR* pObject = MS_GetObjectListPtr(pThis);

			MS_ScreenSetFocusObject(pObject);
		}
		return MS_OP_NONE;
		
	case MS_OP_OPEN:
		{
			MSO_VLIST __NEAR* pList = (MSO_VLIST __NEAR*)pThis;
			
			switch(CoreAPI_GetCurrentMediaType())
			{
				case MEDIA_TYPE_SVCD:
				case MEDIA_TYPE_VCD:
					pList->moParam.mwTotalItems = CoreAPI_GetTotalChapterTrackNum(0);
					_AddItemsToVCDTrackList((MSO_VLIST __NEAR*)pThis);
					break;

				case MEDIA_TYPE_DVD_VIDEO:
					pList->moParam.mwTotalItems = CoreAPI_GetTotalTitleGroupNum();
					pList->moParam.mdwData = 0;
					_AddItemsToTitleList((MSO_VLIST __NEAR*)pThis);
					break;
			}
		}
		return MS_OP_NONE;
	}	
	return VListOperation(pThis, MsOp, lParam);
}

/***************************************************************************************
*	Function 	: 	_TrackOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oProgramTrackDescriptor.
****************************************************************************************/
#pragma argsused
STATIC MS_OP _TrackOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
		case MS_OP_FOCUS_CHANGE:
			MS_DisplayAddObject(pThis);
			break;
            
		case MS_OP_ENTER:
			{
				MSO_PROGRAM_TRACK __NEAR* pTrack = (MSO_PROGRAM_TRACK __NEAR*)pThis;
				UINT16 wTrackNum = pTrack->moParam.mwTrack;
				MSO_OBJECT __NEAR* pTrackList = (MSO_OBJECT __NEAR* )pThis->mpParent;
				MSO_OBJECT __NEAR* pTrackVScrollList = (MSO_OBJECT __NEAR*)pTrackList->mpParent;
				MSO_PROGRAM __NEAR* pProgram 	= (MSO_PROGRAM __NEAR*)pTrackVScrollList->mpParent;
				UINT16 wItemNum = pProgram->moParam.mwProgramListItemsNum;
				MSO_OBJECT __NEAR* pProgramListDisplay = (MSO_OBJECT __NEAR*)MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pProgram, (MS_DESCRIPTOR*)&oProgramListDisplayDescriptor);

				if (wItemNum < MAX_PROGRAM_NUM)
				{
					pProgram->moParam.mwProgramListItemsNum++;
					pProgram->moParam.mwTrack[wItemNum] = wTrackNum;

					MS_DisplayAddObject((MSO_OBJECT __NEAR*)pProgramListDisplay);
				}
			}
			return MS_OP_NONE;
	}
	return MsOp;
}

/***************************************************************************************
*	Function 	: 	_TitleOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oProgramTitleDescriptor.
****************************************************************************************/
#pragma argsused
STATIC MS_OP _TitleOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
		case MS_OP_FOCUS_CHANGE:
			MS_DisplayAddObject(pThis);
			break;
            
		case MS_OP_ENTER:
			{
				MSO_PROGRAM_TRACK __NEAR* pTitle = (MSO_PROGRAM_TRACK __NEAR*)pThis;
				MSO_VLIST __NEAR* pTrackList = (MSO_VLIST __NEAR* )pThis->mpParent;
				MSO_OBJECT __NEAR* pTrackVScrollList = (MSO_OBJECT __NEAR*)((MSO_OBJECT __NEAR*)pTrackList)->mpParent;
				UINT16 wTitleNum = pTitle->moParam.mwTrack;
				MSO_OBJECT __NEAR* pObject;
				
				// Remove all items.
				MS_SendOperation((MSO_OBJECT __NEAR*)pTrackList, MS_OP_EMPTY, 0);
				pTrackList->moParam.mwFirstDisplayItem = 0;
				pTrackList->moParam.mdwData = wTitleNum;
				pTrackList->moParam.mwTotalItems = CoreAPI_GetTotalChapterTrackNum(wTitleNum) + 1;
				_AddItemsToChapterList((MSO_VLIST __NEAR*)pTrackList);
				pObject = MS_GetObjectListPtr(pTrackList);
				pObject = pObject->mpNext;
				MS_ScreenSetFocusObject(pObject);
				MS_DisplayAddObject((MSO_OBJECT __NEAR*)pTrackVScrollList);
			}
			return MS_OP_NONE;
	}
	return MsOp;
}

/***************************************************************************************
*	Function 	: 	_ChapterOperation
*
*	In		:
*
*	Out		:
*
*	Desc 	:	 user operation function for oProgramChapterDescriptor.
****************************************************************************************/
#pragma argsused
STATIC MS_OP _ChapterOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
		case MS_OP_FOCUS_CHANGE:
			MS_DisplayAddObject(pThis);
			break;

⌨️ 快捷键说明

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