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