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

📄 dvb_pvr.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
	enOsStatusCB = CT_OS_CreateTask ( &stCBTask,
										"PVRCallback",
										DVB_Callback_Task,
										&au8CBTaskStack[0],
										DVB_PVR_TASK_CB_STACK_SIZE,
										DVB_PVR_TASK_CB_PRIORITY,
										DVB_PVR_TASK_CB_TIMESLICE);

	if (EN_CTOS_SUCCESS != enOsStatusCB)
	{
		_enCBStatus = EN_PVR_STATUS_FAIL;
		DVBPVR_MSG(("Create Callback Task Fail\n"));
	}

	enOsStatusCB = CT_OS_CreateMsgQueue(&stCBQueue, "CallbackQ", &u32CBQueueMsg[0], PVR_QUEUE_SIZE, EN_CTOS_SUSPEND_FIFO);
	if (EN_CTOS_SUCCESS != enOsStatusCB)
	{
		enOsStatusCB = EN_PVR_STATUS_FAIL;
		DVBPVR_MSG(("Create Callback MessageQ Fail\n"));
	}

	if (EN_CTOS_SUCCESS != CT_OS_CreateSemaphore(&PVR_CB_Semaphore, "PVR_CBSem", 0, EN_CTOS_SUSPEND_FIFO))
	{
		DVBPVR_MSG(("\n\r PVR_CB_WARNING: CT_OS_CreateSemaphore Error"));
	}
	else
	{
		DVBPVR_MSG(("\n\r CREATE SEM OK FOR PVR CB\n\r"));
	}

	b8CBInitFlag = TRUE;
	if(_enCBStatus == EN_PVR_STATUS_SUCCESS)
	{
		CT_OS_ResumeTask(&stCBTask);
	}
	return _enCBStatus;
}

void DVB_Callback_Task(u32 u32Argc, void* pArgv)
{
	EN_PVR_EVENT		enCBEvent = EN_PVR_EVENT_NONE;
	EN_CTOS_STATUS	    enOsStatusCB;
	u32				    u32CBRecvMsgLen;
	MSG_PARAMETER		stCBRecvMsg;

	while(1)
	{
		/* wait message to switch task status */
		enOsStatusCB = CT_OS_GetMsg(&stCBQueue, &stCBRecvMsg, &u32CBRecvMsgLen,CTOS_WAIT);

		//printf("\nGet msg!\n");

		if (enOsStatusCB == EN_CTOS_SUCCESS)
		{
			enCBEvent = stCBRecvMsg.u8Cmd;
			//DVBPVR_MSG(("\n\rCBTask Get Callback Event =  %d",enCBEvent));
		}

		switch(enCBEvent)
		{
			case EN_PVR_EVENT_NONE:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_NONE=====\n"));
				break;
			case EN_PVR_EVENT_WRITE_FAIL:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_WRITE_FAIL=====\n"));
				break;
			case EN_PVR_EVENT_READ_FAIL:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_READ_FAIL=====\n"));
				break;
			case EN_PVR_EVENT_RECORD_START:
				/*
				DVB_PVR_ResetRecordingTime();
				DVB_PVR_ResetStreamRateCalc();
				PVR_CleanRecBufferInputSize();
				*/
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_RECORD_START=====\n"));
				break;
			case EN_PVR_EVENT_RECORD_STOP:
				_b8DeviceRecordCheck = FALSE;
				_u32DeviceEventLastTick = 0;
				_u32DeviceRecordWriteErrorCount = 0;
				DVB_PVR_SaveLastRecordingDuration();
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_RECORD_STOP=====\n"));
				break;
			case EN_PVR_EVENT_RECORD_FINISH:
				_b8DeviceRecordCheck = FALSE;
				_u32DeviceEventLastTick = 0;
				_u32DeviceRecordWriteErrorCount = 0;
				DVB_PVR_SaveLastRecordingDuration();
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_RECORD_FINISH=====\n"));
				break;
			case EN_PVR_EVENT_RECORD_NEW_HANDLE:
				DVB_PVR_SaveLastRecordingDuration();
				DVB_PVR_ResetRecordingTime();
				DVB_PVR_ResetStreamRateCalc();
				//DVB_PVR_ResetFilterCallbackSpeedCalc(TRUE);
				PVR_CleanRecBufferInputSize();
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_RECORD_NEW_HANDLE=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_START:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_START=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_FINISH:
			case EN_PVR_EVENT_PLAYBACK_END_OF_RECORDING:
			case EN_PVR_EVENT_PLAYBACK_STOP:
				if(EN_PVR_EVENT_PLAYBACK_FINISH==enCBEvent)
				{
					DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_FINISH=====\n"));
				}
				else if(EN_PVR_EVENT_PLAYBACK_END_OF_RECORDING ==enCBEvent)
				{
					DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_END_OF_RECORDING=====\n"));
				}
				else
				{
					DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_STOP=====\n"));
				}
				#ifdef PVR_FILL_TASK_ENABLE
				DVB_PVR_Fill_Task_Active(FALSE);
				#endif
				break;
			case EN_PVR_EVENT_PLAYBACK_PAUSE:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_PAUSE=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_UNPAUSE:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_UNPAUSE=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_SKIP:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_SKIP=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_JUMP:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_JUMP=====\n"));
				break;
			case EN_PVR_EVENT_DISK_FULL:
				_b8DeviceRecordCheck = FALSE;
				_u32DeviceEventLastTick = 0;
				_u32DeviceRecordWriteErrorCount = 0;
				DVB_PVR_SaveLastRecordingDuration();
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_DISK_FULL=====\n"));
				break;
			case EN_PVR_EVENT_PLAYBACK_END_OF_BEGIN:
			case EN_PVR_EVENT_PLAYBACK_TO_NORMAL:
				if(EN_PVR_EVENT_PLAYBACK_END_OF_BEGIN == enCBEvent)
				{
					DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_END_OF_BEGIN=====\n"));
				}
				else
				{
					DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_PLAYBACK_TO_NORMAL=====\n"));
				}
				CT_MPG_ParserSetVideoPID(_u16ParserVid);
				CT_MPG_ParserSetAudioPID(_u16ParserAid);
				break;
			case EN_PVR_EVENT_TIME_SHIFT_HEAD:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_TIME_SHIFT_HEAD=====\n"));
				break;
			case EN_PVR_EVENT_TIME_SHIFT_START:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_TIME_SHIFT_START=====\n"));
				break;
			case EN_PVR_EVENT_TIME_SHIFT_STOP:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_TIME_SHIFT_STOP=====\n"));
				break;
			case EN_PVR_EVENT_SCAN_PREVIEW:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_SCAN_PREVIEW=====\n"));
				break;
			case EN_PVR_EVENT_SCAN_PREVIEW_STOP:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_SCAN_PREVIEW_STOP=====\n"));
				break;
			case EN_PVR_EVENT_GET_BITRATE:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_GET_BITRATE=====\n"));
				break;
			case EN_PVR_EVENT_GET_TIMESHIFT_REMOVE_HANDLE:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_GET_TIMESHIFT_REMOVE_HANDLE=====\n"));
				break;
			case EN_PVR_EVENT_DEVICE_WRITE_TOO_SLOW:
				CT_OS_MS_GetClock(&_u32DeviceEventLastTick);
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_DEVICE_WRITE_TOO_SLOW=====\n"));
				break;
			case EN_PVR_EVENT_DEVICE_READ_TOO_SLOW:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_DEVICE_READ_TOO_SLOW=====\n"));
				break;
			case EN_PVR_EVENT_DEVICE_READ_WRITE_TOO_SLOW:
				DVBPVR_MSG(("\n=====Callback Task:EN_PVR_EVENT_DEVICE_READ_WRITE_TOO_SLOW=====\n"));
				break;
			default:
				break;
		}

		//DVBPVR_MSG(("\n\r Callback Task call Notify!\n"));
		if(_fpNotify != NULL)
		{
			_fpNotify(stCBRecvMsg.u8Cmd);
		}
		CT_OS_FreeSemaphore(&PVR_CB_Semaphore);

	}
}


/***********************************************************************/
//Elaine-2007/12/04 "09:59:49"
/************************************************************************/

//===================NEW PVR API=========================
bool8 DVB_PVR_SetParserAVPid(u16 u16Vid,u16 u16Aid)
{
	_u16ParserAid = u16Aid;
	_u16ParserVid = u16Vid;
	PVR_SetParserAVPid(u16Vid,u16Aid);
	return TRUE;
}

bool8 DVB_PVR_SetRecordTime(u32 u32Second)
{
	if(u32Second ==0)
	{
		return FALSE;
	}
	else
	{
		PVR_SetRecordTime(u32Second);
		return TRUE;
	}
}

EN_PVR_STATUS DVB_PVR_CBStatus(void)
{
	DVBPVR_MSG(("\n\r WaitPVR S CallbackStatus %d",_enCBStatus));
	CT_OS_WaitOnSemaphore(&PVR_CB_Semaphore, CTOS_WAIT);
	return _enCBStatus;
}

EN_PVR_STATUS DVB_PVR_CmdStatus(void)
{ 
	DVBPVR_MSG(("\n\r WaitPVR S PVRStatus %d",_enPVRStatus));
    CT_OS_WaitOnSemaphore(&PVR_API_Semaphore, CTOS_WAIT);
    return _enPVRStatus;
} 

u16 DVB_PVR_GetPlayPercent(void)
{
	u16 u16Percent;
	u16Percent = PVR_GetPlayPercent();
//	printf("\n\r u16Percent %ld",u16Percent);
	return u16Percent;
}

bool8 DVB_PVR_NormalPlay(void)
{
	if((PVR_Play_GetStatus()==EN_PVR_PLAY_NONE)||
	   (PVR_Play_GetStatus()==EN_PVR_ERROR_PLAY))
	{
		DVBPVR_MSG(("\n\r DVB_PVR_NormalPlay FAIL"));
		return FALSE;
	}

	stPvrSendMsg.u8Cmd = EN_PVR_TASK_PLAY_NORMAL;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r UI DVB_PVR_NormalPlay FAIL"));
	}
	else
	{
		CT_MPG_ParserSetAudioPID(_u16ParserAid);
	}
	return TRUE;
}

bool8 DVB_PVR_FastForwardPlay(EN_PVR_PLAYBACK_SPEED enSpeed)
{
	if((PVR_Play_GetStatus()==EN_PVR_PLAY_NONE)||
	   (PVR_Play_GetStatus()==EN_PVR_ERROR_PLAY))
	{
		DVBPVR_MSG(("\n\r DVB_PVR_FastForwardPlay FAIL"));
		return FALSE;
	}
	
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FAST_FORWARD;
	stPvrSendMsg.u8Reserve = enSpeed;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r UI DVB_PVR_FastForwardPlay FAIL"));
	}
	else
	{
		// It should finish before free semaphore in PVR Task
		//CT_MPG_ParserSetAudioPID(0);
	}	
	return TRUE;
}

bool8 DVB_PVR_SlowForwardPlay(EN_PVR_PLAYBACK_SPEED enSpeed)
{
	if((PVR_Play_GetStatus()==EN_PVR_PLAY_NONE)||
	   (PVR_Play_GetStatus()==EN_PVR_ERROR_PLAY))
	{
		DVBPVR_MSG(("\n\r DVB_PVR_SlowForwardPlay FAIL"));
		return FALSE;
	}
	
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_SLOW_FORWARD;
	stPvrSendMsg.u8Reserve = enSpeed;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_SlowForwardPlay FAIL"));
	}
	else
	{
		// It should finish before free semaphore in PVR Task
		//CT_MPG_ParserSetAudioPID(0);
	}
	return TRUE;
}

bool8 DVB_PVR_FastBackwardPlay(EN_PVR_PLAYBACK_SPEED enSpeed)
{
	if((PVR_Play_GetStatus()==EN_PVR_PLAY_NONE)||
	   (PVR_Play_GetStatus()==EN_PVR_ERROR_PLAY))
	{
		DVBPVR_MSG(("\n\r DVB_PVR_FastBackwardPlay FAIL"));
		return FALSE;
	}
	
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FAST_BACKWARD;
	stPvrSendMsg.u8Reserve = enSpeed;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_FastBackwardPlay FAIL"));
	}
	else
	{
		// It should finish before free semaphore in PVR Task
		//CT_MPG_ParserSetAudioPID(0);
	}

	return TRUE;
}

bool8 DVB_PVR_RecordStart(ST_PVR_RECORD_PARAMETER *pstRecordParam)
{
	if(PVR_Record_GetStatus() == EN_PVR_RECORD_FILE)
	{
		DVBPVR_MSG(("\n\r DVB_PVR_RecordStart FAIL"));
		return FALSE;
	}
	if(PVR_Record_GetStatus() == EN_PVR_RECORD_NONE)
	{
		PVR_ResetRecInfo();
	}
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FILE_RECORD_START;
	stPvrSendMsg.unData.pMsgData = pstRecordParam;

	DVBPVR_MSG(("\n\r DVB Handle %ld",pstRecordParam->u32FileHandle));
	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_RecordStart FAIL"));
	}
	_b8SetCacheBitRate = FALSE;
	return TRUE;
}

bool8 DVB_PVR_RecordStop(void)
{
	if(PVR_Record_GetStatus()!=EN_PVR_RECORD_FILE)
	{
		DVBPVR_MSG(("\n\r DVB_PVR_RecordStop FAIL"));
		return FALSE;
	}
	
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FILE_RECORD_STOP;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_RecordStop FAIL"));
	}
	return TRUE;
}

bool8 DVB_PVR_PlaybackStart(ST_PVR_PLAY_PARAMETER *pstPlaybackParam, u16 u16LiveVid, u16 u16LiveAid)
{
	//bool8 b8Mute;
	
	if(PVR_Play_GetStatus()!=EN_PVR_PLAY_NONE)
	{
		DVBPVR_MSG(("\n\r DVB_PVR_PlaybackStart FAIL"));
		return FALSE;
	}
	
	DVBPVR_MSG(("\n\r File Handle Num %ld",pstPlaybackParam->u32FileHandleNum));
	
	_u16LiveVid = u16LiveVid;
	_u16LiveAid = u16LiveAid;
	/*
	DVB_AVDemuxDisable();	
	DVB_AudioVideoStop();
	DVB_VideoScreenEnable(FALSE);
	DVB_VideoScreenShow(FALSE);

	DVB_VideoSetPID(0);
	DVB_AudioSetPID(0);
	*/	

	CT_MPG_ParserSetVideoPID(_u16ParserVid);
	CT_MPG_ParserSetAudioPID(_u16ParserAid);	

	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FILE_PLAY_START;
	stPvrSendMsg.unData.pMsgData = pstPlaybackParam;

//	pstPlaybackParam->u32OffsetFileIndex = 3;
//	pstPlaybackParam->u32Offset = 104857600;
	
	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_PlaybackStart FAIL"));
	}
	/*
	DVB_VideoScreenEnable(TRUE);
	DVB_VideoScreenShow(TRUE);
	DVB_AudioVideoPlay();
	
	bool8 b8Mute = DVB_AudioGetMute();
	DVB_AudioSetMute(b8Mute);
	
	CT_MPG_ParserDemuxEnable(); 	
	*/

	#ifdef PVR_FILL_TASK_ENABLE
	DVB_PVR_Fill_Task_Active(TRUE);
	#endif

	return TRUE;
}

bool8 DVB_PVR_PlaybackStop(void)
{
	if(PVR_Play_GetStatus()==EN_PVR_PLAY_NONE)
	{
		return FALSE;
	}
	
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_FILE_PLAY_STOP;

	CT_OS_PutMsg(&stPvrQueue, &stPvrSendMsg, CTOS_NO_WAIT);
	if(DVB_PVR_CmdStatus()!= EN_PVR_STATUS_SUCCESS)
	{
		DVBPVR_DBG(("\n\r DVB_PVR_PlaybackStop FAIL"));
	}

	#ifdef PVR_FILL_TASK_ENABLE
	DVB_PVR_Fill_Task_Active(FALSE);
	#endif

	return TRUE;
}

bool8 DVB_PVR_PlaybackPause(void)
{
	stPvrSendMsg.u8Cmd = EN_PVR_TASK_PLAY_PAUSE;

⌨️ 快捷键说明

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