📄 mass_wma.c
字号:
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 + -