209 lines
5.3 KiB
C++
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--------------------------------
|