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

📄 mass_wma.c

📁 TELECHIPS MP3解决方案UMS实现源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	if (CodecShared.InputBufFill != 1)
	{
		switch(g_ActiveDrive)
		{

			#ifdef MMC_INCLUDE
			case DRIVE_MMC :	TCC730_MMC_ReadFileSector(g_nCoderHandle, CodecShared.InputBufferWPointer);
								break;
			#else
			case DRIVE_SMC :
			#endif					

			case DRIVE_NFL :	SMC_FILE_ReadFile( g_nCoderHandle,CodecShared.InputBufferWPointer,512 );
								break;

			default :			return FALSE;
		}
	}
	else
	{
		_loc_SeekSectorForward(1);
	}

 	CodecShared.InputBufferWPointer += 512;
	CodecShared.InputBufferValidData += 512;

	if (CodecShared.InputBufferWPointer >= &CodecShared.InputBufferPointer[CodecShared.InputBufferLength])
	{
        CodecShared.InputBufferWPointer = &CodecShared.InputBufferPointer[0];
        // Wrap IN pointer
	}

	*g_lpdwCurPlayPos += 512;

	return TRUE;
}

void TCC730_WMADecoder(ubyte volume, ubyte EQ)
{
	CodecAudioDecodeFnct(&CodecShared);

	if (CodecShared.FrameErrorFlag != 0)	// frame error
	{
		CodecFrameErrCtr++;

		if(CodecFrameErrCtr > 20 || (CodecShared.MediaMode & 0xf0) != 0x20 )
		{	
			CodecShared.VolumeControl = 0;
			*g_lpdwCurPlayPos = FileInfo.Size.nLong;
			return;
		}
	}
	else 
	{
		CodecShared.VolumeControl = volume;		
		CodecShared.EqualizerModeControl = EQ;
		CodecFrameErrCtr = 0;
		Set_PLL1();
	}
}

void WMASeekHandler(uword drive, unsigned char flag)
{
	CONST_FAKE unsigned char* lpTemp;
	unsigned nTemp, nRemainPacket;

	int nSeekCount;

	UNREFERENCED_PARAMETER(drive);

	if (flag == WMA_PLAY)
	{
		unsigned nTempSave;

		nTempSave = CodecShared.InputBufferValidData;

		_loc_InitWMARingBuffer();

		CodecShared.InputBufferValidData = nTempSave;
		CodecShared.SeekFlag = 2;
		CodecShared.StartDecodingFlag = 0;

		CodecAudioDecodeFnct(&CodecShared);			// initial call

		while(RingReadFilePutStr(512))
			;
			
		CodecShared.CodecInvokeSyncFlag = CODEC_INVOKE;

		CodecAudioDecodeFnct(&CodecShared);

		CodecShared.Emphasis = 1;
		CodecShared.SeekFlag = 0;

		return;	
	}

	if (flag == WMA_REW)
		Play_Mode = WMA_REW;	
	else
		Play_Mode = WMA_FF;	

	CodecShared.CodecInvokeSyncFlag = CODEC_DONE;
	CodecShared.SeekFlag = 1;

	nRemainPacket = ((CodecShared.RemainedBitInPacketHi & 0x0007) << 13)
				  | ((CodecShared.RemainedBitInPacketLo >> 3) & 0x1ffe);


	if (flag == WMA_FF)		// Forward seek
	{
		if (nRemainPacket >= CodecShared.InputBufferValidData)
		{
			nRemainPacket -= CodecShared.InputBufferValidData;
		}
		else
		{
			_loc_SeekSectorBackward(1);
			nTemp = 512;

			if (CodecShared.InputBufferValidData > 512)
			{
				_loc_SeekSectorBackward(1);
				nTemp += 512;
			}

			nRemainPacket += (nTemp - CodecShared.InputBufferValidData);
		}

		// Seek forward it

		nSeekCount = nRemainPacket / 512;

		if (_loc_SeekSectorForward(nSeekCount) != 0)
			goto ON_SEEK_ERROR;

		*g_lpdwCurPlayPos += nSeekCount * 512;
		nRemainPacket -= nSeekCount * 512;
	}
	else if(flag == WMA_REW)	// Reverse
	{
		nRemainPacket += (512*2 - CodecShared.InputBufferValidData);

		if (_loc_SeekSectorBackward(2) != 0)
			goto ON_SEEK_ERROR;
		*g_lpdwCurPlayPos -= 2*512;				
		
		while ((CodecShared.PacketSize*2) > nRemainPacket)
		{
			nRemainPacket += 512;
			if (_loc_SeekSectorBackward(1) != 0)
				goto ON_SEEK_ERROR;
			
			*g_lpdwCurPlayPos -= 512;
			
		}
		
		nRemainPacket -= (CodecShared.PacketSize * 2);
	}

	//////////////////////////////////////

	if (nRemainPacket == 0)
		nRemainPacket = 1;

	CodecShared.InputBufferWPointer = CodecShared.InputBufferPointer;
	CodecShared.InputBufferValidData = 0;

	while(RingReadFilePutStr(512))
		;

	lpTemp = (CONST_FAKE unsigned char*) &CodecShared.InputBufferPointer[nRemainPacket-1];

	if (*g_lpdwCurPlayPos > 0)
	{
		if ((lpTemp[0] == 0x82) && (lpTemp[1] == 0x00))
		{
			nRemainPacket--;
		}
		else if ((lpTemp[2] == 0x82) && (lpTemp[3] == 0x00))
		{
			nRemainPacket++;
		}
		else if ((lpTemp[1] != 0x82) || (lpTemp[2] != 0x00))
		{
			CodecShared.FrameErrorFlag = 11;			//Seek_Err
			CodecShared.InputBufferValidData = FM_PAGE_SIZE*2;
			CodecShared.InputBufferWPointer = &CodecShared.InputBufferPointer[0];
			CodecShared.CodecInvokeSyncFlag = CODEC_INVOKE;
			return;
		}
	}

	CodecShared.InputBufferValidData -= nRemainPacket;

	CodecAudioDecodeFnct(&CodecShared);
	//Packet Header Parsing
	
	return;

	//////////////////////////////////////

	ON_SEEK_ERROR :

    CodecShared.FrameErrorFlag = 11;			//Seek_Err
	CodecShared.InputBufferValidData = FM_PAGE_SIZE*2;
	CodecShared.InputBufferWPointer = &CodecShared.InputBufferPointer[0];
	CodecShared.CodecInvokeSyncFlag = CODEC_INVOKE;
}

void KeyRepeatABHandler(void)
{
	if ((CodecShared.MediaMode & 0xf0) != 0x20 || Play_Mode != WMA_PLAY)
		return;

	switch(CodecShared.SeekFlag)
	{
	case 0x00:							//Normal
		CodecShared.SeekFlag = 0x10;	//Before set the value for RepeatA
		break;

	case 0x11:							//After set the value for RepeatA
		CodecShared.SeekFlag = 0x12;	//Before set the value for RepeatA
		break;

	// wma repeat error case 0x13:							//Start at the RepeatA
	case 0x14:							//During the block repeat
		CodecShared.SeekFlag = 0x0;	//Normal
		g_dwRepeatPosA = g_dwRepeatPosB = 0;
		break;
	 }
}

DEFINE_GUID(CLSID_ASF_HeaderObject,      0x75b22630, 0x668e, 0x11cf, 0xa6,0xd9,0x00,0xaa,0x00,0x62,0xce,0x6c);
DEFINE_GUID(CLSID_ASF_ContentDescObject, 0x75b22633, 0x668e, 0x11cf, 0xa6,0xd9,0x00,0xaa,0x00,0x62,0xce,0x6c);
DEFINE_GUID(CLSID_ASF_PropertiesObject,  0x8cabdca1, 0xa947, 0x11cf, 0x8e,0xe4,0x00,0xc0,0x0c,0x20,0x53,0x65); 

#define WMA_TIME_OFFSET		40		// when compute by float, you set 64

uword TCC730_WMA_Read_Info(uword drive, ubyte f_index, TypeFileInfo* file_info, unsigned long* play_time)
{
	unsigned char* lpBuffer;
	int nError, nHandle;

	unsigned nHeaderSize;

	unsigned nSizeTitle;
	unsigned nSizeAuthor;
	unsigned nSizeCopyright;
	unsigned nSizeDescription;
//	unsigned nSizeRating;
	unsigned nSizeTemp;

	unsigned long dwSizeTotal;
	unsigned long dwMaxBitrate;

	unsigned i;
	int bFileInfo, bPlayTime;

	switch(drive)
	{
		#if defined(MMC_INCLUDE)
		case DRIVE_MMC :
							nError = TCC730_MMC_OpenFileByIndex(f_index,
																MMC_FILE_FLAG_READ,
																&nHandle,
																gTempBuf);
							if (nError != 0)
								return TCC730_MMC_ConvertErrorCode(nError);
							break;
		#else
		case DRIVE_SMC :
		#endif
		case DRIVE_NFL :
							nError = SMC_MPX_OpenFileByIndex( drive,f_index,OPEN_R,(unsigned int*)&nHandle,gTempBuf );
							if (nError != 0)
								return TCC730_SMC_ConvertErrorCode(nError);
							break;

		default :			return ERR_CARD_NOT_DETECTED;
	}

	// BUFFER_ADDRESS is defined in "filesystem.h"
	lpBuffer = (unsigned char*)BUFFER_ADDRESS;

	// BLOCK_SIZE is defined in "filesystem.h"
	switch(drive)
	{
		#if defined(MMC_INCLUDE)
		case DRIVE_MMC :
							for (i = 0; i < BLOCK_SIZE; i += 512)
							{
								if (TCC730_MMC_ReadFileSector(nHandle, lpBuffer + i) != 0)
									break;
							}

							TCC730_MMC_CloseFile(nHandle, gTempBuf2);
							break;

		#else
		case DRIVE_SMC :
		#endif
		case DRIVE_NFL :
							for (i = 0; i < BLOCK_SIZE; i += 512)
							{
								if (SMC_FILE_ReadFile(nHandle, lpBuffer + i, 512) != 512 )
									break;
							}

							SMC_FILE_CloseFile(nHandle,gTempBuf2);
							break;

		default :			i = 0;
	}

	if (i < BLOCK_SIZE)
		TCC730_ZeroMemory(lpBuffer + i, BLOCK_SIZE - i);

	//////////////////////////////////////
	// Initialize

	file_info->IDTAG_Flag = 0;	
	*play_time = 0;

	bFileInfo = bPlayTime = FALSE;
	
	//////////////////////////////////////
	// Compare Header

	if(TCC730_CompareCodeMemory(lpBuffer, CLSID_ASF_HeaderObject, GUID_SIZE) != 0)
		return 0;

	nHeaderSize = (((unsigned)lpBuffer[GUID_SIZE+1]) << 8)
				+ ((unsigned)lpBuffer[GUID_SIZE+0])
				+ 50;

	//////////////////////////////////////
	// Compare WMA Information & Play Time

	for (i = GUID_SIZE + 2; i < BLOCK_SIZE && (!bFileInfo || !bPlayTime); )
	{
		// Find Content Description Object

		if (TCC730_CompareCodeMemory(lpBuffer + i, CLSID_ASF_ContentDescObject, GUID_SIZE) == 0)
		{
			file_info->IDTAG_Flag = 1;	
			i += GUID_SIZE;
				
			i += 8;

			// extract sizes

			nSizeTitle       = (((unsigned)lpBuffer[i+1]) << 8) + lpBuffer[i+0];
			nSizeAuthor      = (((unsigned)lpBuffer[i+3]) << 8) + lpBuffer[i+2];
			nSizeCopyright   = (((unsigned)lpBuffer[i+5]) << 8) + lpBuffer[i+4];
			nSizeDescription = (((unsigned)lpBuffer[i+7]) << 8) + lpBuffer[i+6];
			//nSizeRating      = (((unsigned)lpBuffer[i+9]) << 8) + lpBuffer[i+8];
			i+=10;
			
			// extract the Title data from file
			if (nSizeTitle > 0)
			{
				nSizeTemp = nSizeTitle;

				if (nSizeTemp > 30 )
					nSizeTemp = 30;

				TCC730_CopyMemory(file_info->Title, lpBuffer+i, nSizeTemp);	
				i += nSizeTitle;
			}

			// extract the Author data from file
			if (nSizeAuthor > 0)
			{
				nSizeTemp = nSizeAuthor;

				if (nSizeTemp > 30)
					nSizeTemp = 30;

				TCC730_CopyMemory(file_info->Artist, lpBuffer+i, nSizeTemp);						
				i += nSizeAuthor;
			}
				
			// extract the Copyright data from file
			if (nSizeCopyright > 0)
			{
				nSizeTemp = nSizeCopyright;

				if (nSizeCopyright > 30 )
					nSizeTemp = 30;
	
				TCC730_CopyMemory(file_info->Album, lpBuffer+i, nSizeTemp);						
				i += nSizeCopyright;
			}
			
			// extract the Description data from file
			if (nSizeDescription > 0)
			{
				nSizeTemp = nSizeDescription;

				if (nSizeDescription > 30 )
					nSizeTemp =30;

				TCC730_CopyMemory(file_info->Comment, lpBuffer+i, nSizeTemp);						
				i += nSizeDescription;
			}

#if 0
			if (nSizeRating > 0)
			{
				nSizeTemp = WMA_GetData(nSizeRating);

				if(nSizeTemp != nSizeRating)
					return WMAERR_BUFFERTOOSMALL;

				cbObjectOffset += nSizeTemp;
			}
#endif

			bFileInfo = TRUE;
		}
		else if (TCC730_CompareCodeMemory(lpBuffer + i, CLSID_ASF_PropertiesObject, GUID_SIZE) == 0)
		{
			dwSizeTotal = (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+3]) << 24)
						+ (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+2]) << 16)
						+ (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+1]) <<  8)
						+ (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+0]) <<  0);

			// extract bitrate information)
			dwMaxBitrate = (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+63]) << 24)
						 + (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+62]) << 16)
						 + (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+61]) <<  8)
						 + (((unsigned long)lpBuffer[i+WMA_TIME_OFFSET+60]) >>  3);
			
			*play_time = (unsigned long)((dwSizeTotal - nHeaderSize) * 10 / dwMaxBitrate);

			i += WMA_TIME_OFFSET + 64;

			bPlayTime = TRUE;
		}
		else
		{
			i++;
		}
	}	// end of for(i)

	return 0;
}

#endif

⌨️ 快捷键说明

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