www.pudn.com > OS.rar > A1800_Skip_Access.c, change:2007-01-16,size:9023b


#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_A1800_SUPPORT 
#ifdef C_SND_A1800_SKIPPLAY_SUPPORT 
//-------------------------------------------------------------------- 
 
extern int SndSACM_curSpeed; 
extern unsigned int SACM_A1800_ModeCode; 
 
#ifdef C_SND_A1600_SKIPPLAY_SUPPORT 
	extern unsigned long ulFrame_Count; 
#else 
	unsigned long ulFrame_Count; 
#endif 
//xiaolei modify 2006/08/30 
 
unsigned long SACM_Decode_Length_L; 
unsigned long SACM_Decode_Length_H; 
 
unsigned long Snd_A1800_ulDataLength;			//only one of the express in bytes!! 
 
//==============================Memory Part======================================= 
//-------------------------------------------------------------------- 
//Name: 		unsigned long Snd_A1800_GetTotalTime(unsigned int * DataPtr) 
//Author:		added by mgl 2005/09/03 Frame count ~= ms 
//Function: 
//						  length * 16bits(1word = 16bits) 
//				-------------------------------------------------  ms 
//					16bit(CompressRate Kbps) * pow(2, speed/12) 
//Description:	The return unit is "S" 
#ifdef FARRELEASE 
unsigned long Snd_A1800_GetTotalTime( unsigned int * DataPtr ) 
{ 
	int uiTempSpeed; 
	unsigned int uiBitRateId; 
	unsigned long ulTotalTime, ulDataLength; 
 
	//Get the length and the BitRate 
	ulDataLength = *(DataPtr + 1); 
	ulDataLength = (*DataPtr + (ulDataLength < 16)) >> 1; 
	uiBitRateId = *(DataPtr + 2); 
	uiBitRateId = uiBitRateId / 400;		//ByteNumber Per Frame 
 
	//The process before speed dispose 
	ulTotalTime = ( ulDataLength / (unsigned long)uiBitRateId ); 
	//The speed dispose 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTempSpeed = -SndSACM_curSpeed; 
		ulTotalTime = (unsigned long)( (double)(ulTotalTime * 20) * pow(2, uiTempSpeed/12) ); 
	} 
	else 
	{ 
		ulTotalTime = (unsigned long)( (double)(ulTotalTime * 20) / pow(2, SndSACM_curSpeed/12) ); 
	} 
 
	return ulTotalTime; 
} 
#else 
unsigned long Snd_A1800_GetTotalTime(unsigned long DataPtr) 
{ 
	int uiTempSpeed; 
	unsigned int uiBitRateId; 
	unsigned long ulTotalTime, ulTmp, ulDataLength; 
 
	//Get the lengthe and the BitRate 
	ulDataLength = RVUL( DataPtr ) >> 1; 
	uiBitRateId = RVUI( DataPtr + 2 ); 
	uiBitRateId = uiBitRateId / 400;		//ByteNumber Per Frame 
 
	//The process before speed dispose 
	ulTotalTime = ( ulDataLength / (unsigned long)uiBitRateId ); 
 
	//The speed dispose 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
		ulTotalTime = (unsigned long)( (float)(ulTotalTime<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
	} 
	else 
	{ 
		ulTotalTime = (unsigned long)( (float)(ulTotalTime<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
	} 
 
	return ulTotalTime; 
} 
#endif //end FARRELEASE defintion 
 
//======================================================================== 
//Name: 		unsigned long Snd_Skip_A1800_ReturnLength(unsigned long DataTime) 
//Author:		 
//Function:		get the datalength(the uint is byte) from the input time 
//Description:	The uint of the input time must be Second 
void Snd_Skip_A1800_ReturnLength(unsigned long DataTime) 
{ 
	unsigned long ulLength; 
	unsigned int uiBitRate; 
	int uiTmpSpeed; 
 
	uiBitRate = SACM_A1800_ModeCode; 
//Get the Frame Number: 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
#ifdef FARRELEASE 
		ulLength = (unsigned long)( (double)(DataTime / 20) / pow(2, uiTmpSpeed/12) ); 
#else 
		ulLength = (unsigned long)( (float)(DataTime / 20) / powf((float)2, (float)uiTmpSpeed/(float)12) ); 
#endif 
	} 
	else 
	{ 
#ifdef FARRELEASE 
		ulLength = (unsigned long)( (double)(DataTime / 20) * pow(2, SndSACM_curSpeed/12) ); 
#else 
		ulLength = (unsigned long)( (float)(DataTime / 20) * powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	} 
//Length in word: 
	ulLength = ulLength * (unsigned long)uiBitRate / 800; 
 
	SACM_Decode_Length_L = ulLength; 
	SACM_Decode_Length_H = ulLength >> 16; 
} 
 
//-------------------------------------------------------------------- 
//DataLen is in bytes		须保证输入长度为16个words的整数倍 
//Snd_A1600_ulDataLength is in bytes 
void Snd_A1800_SetTotalLen(unsigned long DataLen) 
{ 
	Snd_A1800_ulDataLength = DataLen; 
} 
 
//-------------------------------------------------------------------- 
//added by mgl 2005/10/25 Frame count ~= ms 
//Name: 		Snd_A1800_GetTotalTime_NoLen(unsigned long DataPtr) 
//Author: 
//Function: 
//Description:	The unit of the time return is "Second" 
//-------------------------------------------------------------------- 
#ifdef FARRELEASE 
unsigned long Snd_A1800_GetTotalTime_NoLen(unsigned int * DataPtr) 
{ 
	int uiTmpSpeed; 
	unsigned int uiBitRateId; 
	unsigned long ulTotalTime; 
 
	uiBitRateId = *DataPtr; 
	uiBitRateId = uiBitRateId / 400;	//PerFrame size in bytes. 
	ulTotalTime = ( (Snd_A1800_ulDataLength >> 1) / (unsigned long)uiBitRateId );//Frame Number 
 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
		ulTotalTime = (unsigned long)( (double)(ulTotalTime * 20) * pow(2, uiTmpSpeed/12) ); 
	} 
	else 
	{ 
		ulTotalTime = (unsigned long)( (double)(ulTotalTime * 20) / pow(2, SndSACM_curSpeed/12) ); 
	} 
 
	return ulTotalTime; 
} 
#else 
unsigned long Snd_A1800_GetTotalTime_NoLen(unsigned long DataPtr) 
{ 
	int uiTmpSpeed; 
	unsigned int uiBitRateId; 
	unsigned long ulTotalTime; 
 
	uiBitRateId = RVUI( DataPtr ); 
	uiBitRateId = uiBitRateId / 400;	//PerFrame size in bytes. 
	ulTotalTime = ( (Snd_A1800_ulDataLength >> 1) / (unsigned long)uiBitRateId ); 
 
	if(SndSACM_curSpeed  0) 
	{ 
		uiTmpSpeed = -SndSACM_curSpeed; 
		ulTotalTime = (unsigned long)( (float)(ulTotalTime * 20) * powf((float)2, (float)uiTmpSpeed/(float)12) ); 
	} 
	else if(SndSACM_curSpeed  0) 
	{ 
		ulTotalTime = (unsigned long)( (float)(ulTotalTime * 20) / powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
	} 
	return ulTotalTime; 
} 
#endif //end of FARRELEASE definition 
 
//==============================FAT Part================================== 
//-------------------------------------------------------------------- 
#ifdef FAT 
unsigned long Snd_A1800_GetTotalTime_NandFAT(int handle) 
{ 
	unsigned int ptrData[3]; 
	unsigned long itempptr; 
 
	itempptr = (unsigned long)ptrData < 1; 
	read( handle, itempptr, 3*2);		//guili 2005.10.22 
	return( Snd_A1800_GetTotalTime( (unsigned long)(unsigned int)ptrData ) ); 
} 
 
//-------------------------------------------------------------------- 
unsigned long Snd_A1800_GetTotalTime_FAT_NoLen(int handle) 
{ 
	unsigned int ptrData[3]; 
	unsigned long tempptr; 
 
	tempptr = (unsigned long)ptrData < 1; 
	read( handle, tempptr, 2);			//guili 2005.10.22 
	return( Snd_A1800_GetTotalTime_NoLen( (unsigned long)(unsigned int)ptrData ) ); 
} 
#endif 
 
//-------------------------------------------------------------------- 
#ifdef FARRELEASE 
unsigned int Snd_A1800_GetModeCode(unsigned int *DataPtr) 
{ 
	return *(DataPtr + 2); 
} 
#else 
unsigned int Snd_A1800_GetModeCode(LPTR DataPtr) 
{ 
	return( RVUI(DataPtr + 2) ); 
} 
#endif 
//---------------------------------------------------------------------- 
 
//-------------------------------------------------------------------- 
// Syntax:		unsigned long Snd_Get_A1600SkipOffset(unsigned long StartTime) 
// Parameter:	unsigned long StartTime 
// Return:		NONE 
// Description:	Must known _SACM_A1800_ModeCode first 
//-------------------------------------------------------------------- 
unsigned long Snd_Get_A1800SkipOffset(unsigned long StartTime) 
{ 
	unsigned int uiWordsPerFrame; 
	unsigned long ulFrameNumber; 
 
	uiWordsPerFrame = SACM_A1800_ModeCode / 800; 
	ulFrameNumber = StartTime * (unsigned long)uiWordsPerFrame; 
#ifdef FARRELEASE 
	ulFrameNumber = (unsigned long) ( (double)(ulFrameNumber / 20) * pow(2, SndSACM_curSpeed/12) ); 
#else 
	ulFrameNumber = (unsigned long) ( (float)(ulFrameNumber / 20) * powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
	if(ulFrameNumber % uiWordsPerFrame) 
	{ 
		ulFrameNumber = ulFrameNumber / uiWordsPerFrame; 
		ulFrameNumber = ulFrameNumber * uiWordsPerFrame; 
	} 
	return ulFrameNumber; 
} 
 
//------------------------------------------------- 
unsigned long Snd_A1800_GetCurrentTime() 
{ 
	unsigned long ulFrameNumber;//返回时表示时间 
	unsigned int FrameNum; 
 
	//A1800每一桢播放的时间是20ms: ulFrame_Count * 20 
#ifdef FARRELEASE 
	ulFrameNumber = (unsigned long)( (double)(ulFrame_Count * 20)/pow(2, SndSACM_curSpeed/12) ); 
#else 
	ulFrameNumber = (unsigned long)( (ulFrame_Count * 20)/powf((float)2, (float)SndSACM_curSpeed/(float)12) ); 
#endif 
 
	return ulFrameNumber; 
} 
 
//Function:得到当前播放的长度 in word 
unsigned long Snd_A1800_GetCurrentLength(void) 
{ 
	unsigned long ulTemplength; 
 
	ulTemplength = User_GetDecodeLength(); 
	return ulTemplength; 
} 
#endif	//end of C_SND_A1800_SKIPPLAY_SUPPORT 
#endif //end C_SND_A1800_SUPPORT defintion