www.pudn.com > OS.rar > A1600_Skip_Frame_Access.c, change:2006-12-11,size:7955b


#include "system_head.h" 
//#include "Snd_ArithmConfig.h" 
#include "Snd_ArithmConfig.h" 
#include "SndSACM.h" 
#include "math.h" 
//#include "unExtMem.h" 
//#include "vfs.h" 
 
//-------------------------------------------------------------------- 
 
#ifdef C_SND_A1600_SUPPORT 
#ifdef C_SND_A1600_SKIPPLAY_SUPPORT 
//-------------------------------------------------------------------- 
 
extern int SndSACM_curSpeed; 
extern unsigned int SACM_A1600_ModeCode; 
 
unsigned long ulFrame_Count; 
unsigned long Snd_A1600_ulDataLength;			//only one of the express in bytes!! 
unsigned int Snd_A1600_GetWordsPerFrame( void ); 
 
LPCONST unsigned int T_WordsPerFrame[6] = {10,12,14,16,20,24}; 
 
//-------------------------------------------------------------------- 
//added by mgl 2005/09/03 Frame count ~= ms 
//				  length * 16bits(1word = 16bits) 
//		-------------------------------------------------  ms 
//			16bit(CompressRate Kbps) * pow(2, speed/12) 
#ifdef FARRELEASE 
unsigned long Snd_A1600_GetTotalTime(unsigned int * DataPtr) 
#else 
unsigned long Snd_A1600_GetTotalTime(unsigned long DataPtr) 
#endif 
{ 
	#define ulDataLength ulFrameNumber_Total 
#ifdef FARRELEASE 
	unsigned long ulFrameNumber_Total; 
	unsigned char *ulTmp; 
#else 
	unsigned long ulFrameNumber_Total,ulTmp; 
#endif 
	unsigned int uiBitRateId; 
	int uiTmpSpeed; 
 
#ifdef FARRELEASE 
	ulDataLength = *(DataPtr + 1); 
	ulDataLength = (*DataPtr + (ulDataLength < 16)) >> 1; 
	uiBitRateId = *(DataPtr + 2); 
#else 
	ulDataLength = RVUL( DataPtr ) >> 1; 
	uiBitRateId = RVUI( DataPtr+2 ); 
#endif 
 
#ifdef FARRELEASE 
	ulTmp = &T_WordsPerFrame; 
#else 
	ulTmp = LB2LP(T_WordsPerFrame); 
#endif 
	ulTmp = uiBitRateId - 0x8004 + ulTmp; 
#ifdef FARRELEASE 
	ulFrameNumber_Total = ( ulDataLength/(unsigned long)(*ulTmp) ); 
#else 
	ulFrameNumber_Total = ( ulDataLength/(unsigned long)RVUI(ulTmp) ); 
#endif 
 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
#ifdef FARRELEASE 
		ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) * pow(2, uiTmpSpeed/12) ); 
#else 
		ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	} 
	else 
	{ 
#ifdef FARRELEASE 
		ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) / pow(2, SndSACM_curSpeed/12) ); 
#else 
		ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	} 
 
	return ulFrameNumber_Total; 
} 
 
//get the datalength(the uint is byte) from the input time 
unsigned long Snd_Skip_A1600_ReturnLength(unsigned long DataTime) 
{ 
	unsigned long ulLength; 
	unsigned int uiBitRate; 
	int uiTmpSpeed; 
 
	uiBitRate = Snd_A1600_GetWordsPerFrame(); 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
#ifdef FARRELEASE 
		ulLength = (unsigned long)( (double)(DataTime >> 4) / pow(2, uiTmpSpeed/12) ); 
#else 
		ulLength = (unsigned long)( (float)(DataTime >> 4) / powf((float)2, (float)uiTmpSpeed/(float)12) ); 
#endif 
	} 
	else 
	{ 
#ifdef FARRELEASE 
		ulLength = (unsigned long)( (double)(DataTime >> 4) * pow(2, SndSACM_curSpeed/12) ); 
#else 
		ulLength = (unsigned long)( (float)(DataTime >> 4) * powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	} 
	ulLength = ulLength * (unsigned long)uiBitRate; 
 
	return (ulLength < 1);					//the return uint is byte 
} 
 
//-------------------------------------------------------------------- 
//DataLen is in bytes		须保证输入长度为16个words的整数倍 
//Snd_A1600_ulDataLength is in bytes 
void Snd_A1600_SetTotalLen(unsigned long DataLen) 
{ 
	Snd_A1600_ulDataLength = DataLen; 
} 
 
//-------------------------------------------------------------------- 
//added by mgl 2005/10/25 Frame count ~= ms 
unsigned long Snd_A1600_GetTotalTime_NoLen(unsigned long DataPtr) 
{ 
	unsigned long ulFrameNumber_Total,ulTmp; 
	unsigned int uiBitRateId; 
	int uiTmpSpeed; 
 
	uiBitRateId = RVUI( DataPtr ); 
 
#ifdef FARRELEASE 
	ulTmp = &T_WordsPerFrame; 
#else 
	ulTmp = LB2LP(T_WordsPerFrame); 
#endif 
	ulTmp = uiBitRateId - 0x8004 + ulTmp; 
	ulFrameNumber_Total = ( (Snd_A1600_ulDataLength>>1) / (unsigned long)RVUI(ulTmp) );//get the bytes 
 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
#ifdef FARRELEASE 
		ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) * pow(2, uiTmpSpeed/12) ); 
#else 
		ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) * powf((float)2, (float)uiTmpSpeed/(float)12) ); 
#endif 
	} 
	else 
	{ 
#ifdef FARRELEASE 
		ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) / pow(2, SndSACM_curSpeed/12) ); 
#else 
		ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	} 
 
	return(ulFrameNumber_Total); 
} 
 
//-------------------------------------------------------------------- 
#ifdef FAT 
unsigned long Snd_A1600_GetTotalTime_NandFAT(int handle) 
{ 
	unsigned int ptrData[3]; 
	unsigned long itmpptr; 
 
	//SpFSread( handle, (unsigned long)(unsigned int)ptrData, 3);		//guili 2005.10.22 
	itmpptr = (unsigned long)ptrData<<1; 
	read( handle, /*(unsigned long)(unsigned int)*/itmpptr, 3*2);		//guili 2005.10.22 
	return( Snd_A1600_GetTotalTime( (unsigned long)(unsigned int)ptrData ) ); 
} 
 
//-------------------------------------------------------------------- 
unsigned long Snd_A1600_GetTotalTime_FAT_NoLen(int handle) 
{ 
	unsigned int ptrData[3]; 
	unsigned long tmpptr; 
 
	//SpFSread( handle, (unsigned long)(unsigned int)ptrData, 3);		//guili 2005.10.22 
	tmpptr = (unsigned long)ptrData<<1; 
	read( handle, /*(unsigned long)(unsigned int)*/tmpptr, 2);			//guili 2005.10.22 
	return( Snd_A1600_GetTotalTime_NoLen( (unsigned long)(unsigned int)ptrData ) ); 
} 
#endif 
 
//-------------------------------------------------------------------- 
#ifdef FARRELEASE 
unsigned int Snd_A1600_GetModeCode(unsigned char *DataPtr) 
{ 
	return *(DataPtr+2); 
} 
#else 
unsigned int Snd_A1600_GetModeCode(LPTR DataPtr) 
{ 
	return( RVUI(DataPtr+2) ); 
} 
#endif 
 
//-------------------------------------------------------------------- 
unsigned int Snd_A1600_GetWordsPerFrame( void ) 
{ 
#ifdef FARRELEASE 
	unsigned int *ulTmp; 
#else 
	unsigned long ulTmp; 
#endif 
 
#ifdef FARRELEASE 
	ulTmp = &T_WordsPerFrame; 
	ulTmp = ulTmp + SACM_A1600_ModeCode - 0x8004; 
	return (*ulTmp); 
#else 
	ulTmp = LB2LP(T_WordsPerFrame); 
	ulTmp = ulTmp + SACM_A1600_ModeCode - 0x8004; 
	return( RVUI(ulTmp) ); 
#endif 
} 
 
//-------------------------------------------------------------------- 
// Syntax:		unsigned long Snd_Get_A1600SkipOffset(unsigned long StartTime) 
// Parameter:	unsigned long StartTime 
// Return:		NONE 
// Description:	Must known _SACM_A1600_ModeCode first 
//-------------------------------------------------------------------- 
unsigned long Snd_Get_A1600SkipOffset(unsigned long StartTime) 
{ 
	unsigned int uiWordsPerFrame; 
	unsigned long ulFrameNumber; 
 
	uiWordsPerFrame = Snd_A1600_GetWordsPerFrame(); 
 
#ifdef FARRELEASE 
	ulFrameNumber = (unsigned long) ( (double)(StartTime>>4) * pow(2, SndSACM_curSpeed/12) ); 
#else 
	ulFrameNumber = (unsigned long) ( (float)(StartTime>>4) * powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
 
	return ( ulFrameNumber * (unsigned long)uiWordsPerFrame ); 
} 
 
//------------------------------------------------- 
unsigned long Snd_A1600_GetCurrentTime() 
{ 
	unsigned long ulFrameNumber; 
 
#ifdef FARRELEASE 
	ulFrameNumber = (unsigned long)( (double)(ulFrame_Count<<4)/pow(2, SndSACM_curSpeed/12) ); 
#else 
	ulFrameNumber = (unsigned long)( (ulFrame_Count<<4)/powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	return ulFrameNumber; 
} 
 
//---------------------------------------------------------- 
#endif	//C_SND_A1600_SKIPPLAY_SUPPORT 
#endif	//C_SND_A1600_SUPPORT