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

📄 ctvtuner.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	// Call CObject constructor with bAllocate = FALSE	CObject__New ((CObject**)ppCTvTuner, pName, FALSE, dwInstance);	// Call CI2C constructor	CI2C__New ( (CI2C**)(&this->m_pII2C), pName, TRUE, dwInstance );	if (this->m_pII2C == NULL)	{		if (bAllocate)			OSfree(*ppCTvTuner);		*ppCTvTuner = NULL;		return;	}	// Initialize virtual table	this->VTable.Delete					= CTvTuner__Delete;	this->VTable.Init					= CTvTuner__Init;	this->VTable.Write					= CTvTuner__Write;	this->VTable.Read					= CTvTuner__Read;	this->VTable.InitPropertySet		= CTvTuner__InitPropertySet;	this->VTable.SetProperty			= CTvTuner__SetProperty;	this->VTable.GetProperty			= CTvTuner__GetProperty;	this->VTable.Test					= CTvTuner__Test;	this->lpVtbl = &this->VTable;}/****f* HwLib/ITvTuner_Delete * USAGE *	ITvTuner_Delete(ITvTuner* pITvTuner, BOOL bDeleteObject) *	CTvTuner__Delete(ITvTuner* pITvTuner, BOOL bDeleteObject) * DESCRIPTION *	ITvTuner_Delete - frees memory for the specified TvTuner object. *	ITvTuner_Delete plays the role of the destructor in C++. * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the object created by a previous *		call to CTvTuner__CreateInstance or CTvTuner__New. *	BOOL bDeleteObject - usually called with TRUE to free memory for object. *		- if FALSE doesn't free any memory. * SEE ALSO *   CTvTuner__CreateInstance, CTvTuner__New/********************************************************************************************/void CTvTuner__Delete ( ITvTuner* pITvTuner, BOOL bDeleteObject ){	CTvTuner* this = (CTvTuner*) pITvTuner ;	if (this == NULL)		return;	// Release what we were using	// Call CI2C Destructor	II2C_Delete ( this->m_pII2C, bDeleteObject );	// Call CObject Destructor	CObject__Delete ((IObject*)this, FALSE);	if (bDeleteObject)	{		// Delete CTvTuner		OSfree(pITvTuner);	}}/****f* HwLib/ITvTuner_Init * USAGE *	void ITvTuner_Init(ITvTuner* pITvTuner) *	void CTvTuner__Init(ITvTuner* pITvTuner) * DESCRIPTION *	ITvTuner_Init - initialize the TvTuner object *	It is called by CreateInstance. * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/void CTvTuner__Init ( ITvTuner* pITvTuner ){	CTvTuner* this = (CTvTuner*) pITvTuner;	II2C_SetI2CAddress( this->m_pII2C, TVTUNER_WRITE_ADDR,  TVTUNER_READ_ADDR, 			    TVTUNER_I2C_BUS_SPEED);	II2C_Init( this->m_pII2C );}/****f* HwLib/ITvTuner_Write * USAGE *	QRESULT ITvTuner_Write(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) *	QRESULT CTvTuner__Write(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the TvTuner object *	IN BYTE Address - address of the I2C register to write *	IN BYTE* pData - pointer to the BYTE data to write/********************************************************************************************/QRESULT CTvTuner__Write( ITvTuner* pITvTuner, BYTE Address, BYTE* pData ){	// there is no subaddress for tv tuner: Address is ignored.	// write size is 4 bytes (div1 div2 ctrl1 ctrl2)	CTvTuner* this = (CTvTuner*) pITvTuner;	BOOL bRet = II2C_Write_NoSubAddr(this->m_pII2C, pData, 4);	QDbgLog((QLOG_TRACE, QDebugLevelWarning,		TEXT("   WriteTvTuner %02x %02x %02x %02x"),pData[0],pData[1],pData[2],pData[3]));	return bRet? Q_OK:Q_FAIL;}/****f* HwLib/ITvTuner_Read * USAGE *	QRESULT ITvTuner_Read(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) *	QRESULT CTvTuner__Read(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the TvTuner object *	IN BYTE Address - address of the I2C register to read *	IN BYTE* pData - pointer where the BYTE data is read/********************************************************************************************/QRESULT CTvTuner__Read( ITvTuner* pITvTuner, BYTE Address, BYTE* pData ){	// there is no subaddress for tv tuner: Address is ignored.	// read size is one byte (status byte)	CTvTuner* this = (CTvTuner*) pITvTuner;	BOOL bRet = II2C_Read_NoSubAddr(this->m_pII2C, pData, 1);	QDbgLog((QLOG_TRACE, QDebugLevelWarning,		TEXT("   ReadTvTuner %02x"), *pData));	return bRet? Q_OK:Q_FAIL;}void CTvTuner__InitPropertySet(ITvTuner* pITvTuner, void* pPropSet, DWORD dwSize){	CTvTuner* this = (CTvTuner*) pITvTuner;	if(dwSize != sizeof(PROPERTY_SET_ITEM))		return;	InitPropSet(pITvTuner, pPropSet, TVTUNER_SET, eTvTunerMax,\		this->TvTunerPropertyList, CTvTuner__SetProperty, CTvTuner__GetProperty)}/****f* HwLib/ITvTuner_SetProperty * USAGE *	QRESULT ITvTuner_SetProperty(ITvTuner* pITvTuner, *		DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) *	QRESULT CTvTuner__SetProperty(ITvTuner* pITvTuner, *		DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/QRESULT CTvTuner__SetProperty( ITvTuner* pITvTuner,	DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){	// TVTUNER use DWORD for changing information and size condition is already checked	DWORD Value = *(DWORD*)pData;	QDbgLog((QLOG_TRACE, QDebugLevelTrace,		TEXT("   --> CTvTuner__SetProperty: set=%x id=%x flags=%x sz=%x value=%x"),		PropSet, PropId, Flags, dwSizeIn, Value));	switch(PropId)		{		case eTvTunerChannel:						{				eTvTunerChannel_type* peTvTunerChannel_value = (eTvTunerChannel_type *)pData;				BYTE channel_data[4],status;								CHECK_SIZE(eTvTunerChannel)										switch(peTvTunerChannel_value->evTvTunerRange_value)						{							#define CHJUMP 4													case evTvTunerRange_NTSC_MNAIR:							if (peTvTunerChannel_value->eTvTunerChannelInRange >= sizeof(channel_NTSC_MN_AIR) / CHJUMP)								return E_INVALID_PROPERTY_BUFFER;							OSmemcpy(channel_data,&channel_NTSC_MN_AIR[peTvTunerChannel_value->eTvTunerChannelInRange*CHJUMP],4);							break;													case evTvTunerRange_NTSC_MNCABLE:							if (peTvTunerChannel_value->eTvTunerChannelInRange >= sizeof(channel_NTSC_MN_CABLE) / CHJUMP)								return E_INVALID_PROPERTY_BUFFER;							OSmemcpy(channel_data,&channel_NTSC_MN_CABLE[peTvTunerChannel_value->eTvTunerChannelInRange*CHJUMP],4);							break;							#undef CHJUMP													case evTvTunerRange_SECAM_AIR_France:							{								// for TEMIC 4046 FM5 (see linux kernel tuner.c)								// it seems div=8288 for France2 using L2								#define TEMIC_SET_PAL_L         0x0a // SECAM ?#define TEMIC_SET_PAL_L2        0x0b // change IF !																unsigned long div=peTvTunerChannel_value->eTvTunerChannelInRange;																/* 								   PAL L:  622.4=16*38.90 								   PAL L2: 543.2=16*33.95 								*/																channel_data[0]=(BYTE)(div/256);								channel_data[1]=(BYTE)(div%256);								channel_data[2]=/*tun->config=*/0x8e;								channel_data[3]=/*tun->UHF=*/0x30|TEMIC_SET_PAL_L2;																QDbgLog((QLOG_TRACE, QDebugLevelWarning,									 TEXT("CTvTuner__SetProperty want to set SECAM_AIR_France div=%d (norm=%02x uhf=%dMHz)"),									 div,									 (channel_data[3]&0x0f),									 (div-(((channel_data[3]&0x0f)==TEMIC_SET_PAL_L2)?543:622))*1000/16));							}							break;													default:							return E_INVALID_PROPERTY_BUFFER;						}				 				ITvTuner_Write(pITvTuner,0,channel_data);								ITvTuner_Read(pITvTuner,0,&status);				QDbgLog((QLOG_TRACE, QDebugLevelWarning,					 TEXT("CTvTuner__SetProperty status is POR=%d FL=%d A2=%d A1=%d A0=%d"),					 status&(1<<7),					 status&(1<<6),					 status&(1<<2),					 status&(1<<1),					 status&(1<<0) ));			}			break;					default:			return E_NOT_SUPPORTED;		}	return Q_OK;}/****f* HwLib/ITvTuner_GetProperty  * USAGE *	QRESULT ITvTuner_GetProperty(ITvTuner* pITvTuner, *		DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) *	QRESULT CTvTuner__GetProperty(ITvTuner* pITvTuner, *		DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS *	IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/QRESULT CTvTuner__GetProperty( ITvTuner* pITvTuner,	DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){	// TVTUNER use DWORD for changing information and size condition is already checked	DWORD Value;	switch(PropId)	{	default:		return E_NOT_SUPPORTED;	}	*(DWORD*)pData = Value;	QDbgLog((QLOG_TRACE, QDebugLevelTrace,		TEXT("   <-- CTvTuner__GetProperty: set=%x id=%x flags=%x sz=%x value=%x"),		PropSet, PropId, Flags, dwSizeIn, Value));	return Q_OK;}QRESULT CTvTuner__Test(ITvTuner* pITvTuner){	int Error = 0;	return Error ? E_TEST_TVTUNER_FAILED : Q_OK;}#else	// ! TVTUNER_OBJECTvoid CTvTuner__CreateInstance(void **ppv, DWORD dwInstance){	*ppv = NULL;}#endif	// TVTUNER_OBJECT

⌨️ 快捷键说明

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