Files
LayaNative2.0/Conch/source/common/resource/Audio/JCWaveInfo.cpp
T
2020-11-11 16:17:13 +08:00

209 lines
5.3 KiB
C++

/**
@file JCWaveInfo.cpp
@brief
@author James
@version 1.0
@date 2012_11_17
*/
#include "JCWaveInfo.h"
#include "../../util/Log.h"
#pragma warning (disable: 4996)
namespace laya
{
//------------------------------------------------------------------------------
JCWaveInfo::JCWaveInfo( void )
{
m_nTouchTime = 0;
m_pExternalMark = NULL;
m_pData = NULL;
m_nCurPos = 0;
}
//------------------------------------------------------------------------------
JCWaveInfo::~JCWaveInfo( void )
{
//赋值为NULL,就可以了,不需要删除
if( m_pExternalMark != NULL )
{
m_pExternalMark = NULL;
}
if( m_pData != NULL )
{
delete[] m_pData;
m_pData = NULL;
}
}
//------------------------------------------------------------------------------
bool JCWaveInfo::LoadData( const char* p_sFileName )
{
FILE *fp = fopen( p_sFileName,"rb" );
if( fp == NULL )
{
LOGE("JCWaveInfo::LoadData Can't open file %s",p_sFileName );
return false;
}
fseek( fp,0,SEEK_END );
int nSize=ftell(fp);
fseek(fp,0L,SEEK_SET);
unsigned char* sBuffer = new unsigned char[nSize];
fread( sBuffer,1,nSize,fp );
fclose(fp);
m_nCurPos = 0;
LoadData( sBuffer,nSize );
if (sBuffer)
{
delete[] sBuffer;
sBuffer = NULL;
}
return true;
}
//------------------------------------------------------------------------------
bool JCWaveInfo::LoadData( unsigned char* p_sBuffer,int p_nBufferSize )
{
if( p_sBuffer == NULL )
{
LOGE("JCWaveInfo::LoadData buffer == null" );
return false;
}
//读取 RIFF 头
{
read( &m_kRiff, sizeof(RIFF_HEADER), p_sBuffer );
if( memcmp( m_kRiff.szRiffID, "RIFF", 4 ) != 0 || memcmp( m_kRiff.szRiffFormat, "WAVE", 4 ) != 0 )
{
LOGE("JCWaveInfo::LoadData No a vaild wave file!\n");
return false;
}
m_nCurPos += sizeof(RIFF_HEADER);
}
//读取格式
{
read( &m_kFmtBlock.szFmtID, 4, p_sBuffer );
m_nCurPos += 4;
read( &m_kFmtBlock.dwFmtSize, 4, p_sBuffer );
m_nCurPos += 4;
if( memcmp(m_kFmtBlock.szFmtID, "fmt ", 4) !=0 )
{
LOGE("JCWaveInfo::LoadData we only support follow format" );
return false;
}
if( m_kFmtBlock.dwFmtSize != 18 && m_kFmtBlock.dwFmtSize != 16 )
{
LOGE("JCWaveInfo::LoadData we only support Format: linear PCM size = %d",m_kFmtBlock.dwFmtSize );
return false;
}
if( m_kFmtBlock.dwFmtSize == 16 )
{
read(&m_kFmtBlock.wavFormat, 16, p_sBuffer );
m_nCurPos += 16;
}
else if( m_kFmtBlock.dwFmtSize == 18 )
{
read(&m_kFmtBlock.wavFormat, 18, p_sBuffer );
m_nCurPos += 18;
}
/*
if( m_kFmtBlock.wavFormat.dwSamplesPerSec != 22050 )
{
LOGE("we only support Samples Rate: 22050 KHz" );
return false;
}
if( m_kFmtBlock.wavFormat.wChannels != 0x1 )
{
LOGE("we only support one channel" );
return false;
}
if( m_kFmtBlock.wavFormat.wBitsPerSample != 16 )
{
LOGE("we only support BitsPerSample: 16" );
return false;
}
if( m_kFmtBlock.wavFormat.wFormatTag != 0x1 )
{
LOGE("we only support wFormatTag != 0x1" );
return false;
}
*/
}
/*
//读取无用信息 改到下面循环查找了
{
//试图读取fact
read(&m_kFact, sizeof(FACT_BLOCK), p_sBuffer);
if (memcmp(m_kFact.szFactID, "fact", 4) == 0)
{
m_nCurPos += sizeof(FACT_BLOCK);
read(&m_vFackBlockBuffer, m_kFact.dwFactSize, p_sBuffer);
m_nCurPos += m_kFact.dwFactSize;
}
//试图读取JUNK
read(&m_kJunkBlock, sizeof(_JUNK_BLOCK), p_sBuffer);
if (memcmp(m_kJunkBlock.szJUNK, "JUNK", 4) == 0)
{
m_nCurPos += sizeof(_JUNK_BLOCK) + m_kJunkBlock.dwJunkSize;
}
//试图读取FLLR
read(&m_kJunkBlock, sizeof(_JUNK_BLOCK), p_sBuffer);
if (memcmp(m_kJunkBlock.szJUNK, "FLLR", 4) == 0)
{
m_nCurPos += sizeof(_JUNK_BLOCK) + m_kJunkBlock.dwJunkSize;
}
}
*/
bool bResult = false;
int nSize = p_nBufferSize - sizeof(DATA_BLOCK);
while( m_nCurPos < nSize )
{
read( &m_kDataBlock, sizeof(DATA_BLOCK), p_sBuffer );
if ( memcmp( m_kDataBlock.szDataID, "data", 4 ) == 0 )
{
m_kDataBlock.dwDataSize /= 2;
m_nCurPos += sizeof(DATA_BLOCK);
bResult = true;
break;
}
else
{
m_nCurPos += sizeof(DATA_BLOCK) + m_kDataBlock.dwDataSize;
}
}
if (bResult == false)
{
LOGE("JCWaveInfo::LoadData parse wav error");
return false;
}
//拿出data数据
m_nRealDataSize = m_kDataBlock.dwDataSize * 2;
m_pData = new U8[m_nRealDataSize];
for( unsigned int i =0; i< m_kDataBlock.dwDataSize; i++ )
{
U8 n1 = (U8) getC( p_sBuffer );
m_nCurPos ++;
U8 n2 = (U8) getC( p_sBuffer );
m_nCurPos ++;
m_pData[i*2+0] = n1;
m_pData[i*2+1] = n2;
}
return true;
}
//------------------------------------------------------------------------------
void JCWaveInfo::read( void* pRet, int p_nSize,unsigned char* p_sBuffer )
{
unsigned char* p = p_sBuffer + m_nCurPos;
memcpy( pRet,(void*)(p),p_nSize );
}
//------------------------------------------------------------------------------
unsigned char JCWaveInfo::getC( unsigned char* p_sBuffer )
{
return p_sBuffer[m_nCurPos];
}
//------------------------------------------------------------------------------
}
//-----------------------------END FILE--------------------------------