open source
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
/**
|
||||
@file JCOggParser.cpp
|
||||
@brief
|
||||
@author James
|
||||
@version 1.0
|
||||
@date 2014_11_26
|
||||
*/
|
||||
|
||||
//包含头文件
|
||||
#include "JCOggParser.h"
|
||||
#include "../../util/Log.h"
|
||||
#include <vorbis/vorbisfile.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include <vector>
|
||||
#pragma warning (disable: 4996)
|
||||
|
||||
namespace laya
|
||||
{
|
||||
#define READ_OGG_BUFFER_TEMP_SIZE 44100 //读取ogg的时候,临时缓冲区大小
|
||||
//------------------------------------------------------------------------------
|
||||
JCOggParser* JCOggParser::ms_pOggParser = NULL;
|
||||
//------------------------------------------------------------------------------
|
||||
JCOggParser::JCOggParser()
|
||||
{
|
||||
m_nBufferSize = READ_OGG_BUFFER_TEMP_SIZE;
|
||||
m_nCurBufferPos = 0;
|
||||
m_pBuffer = new char[m_nBufferSize];
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
JCOggParser::~JCOggParser()
|
||||
{
|
||||
if( m_pBuffer != NULL )
|
||||
{
|
||||
delete[] m_pBuffer;
|
||||
m_pBuffer = NULL;
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
JCOggParser* JCOggParser::GetInstance( void )
|
||||
{
|
||||
if( ms_pOggParser == NULL )
|
||||
{
|
||||
ms_pOggParser = new JCOggParser();
|
||||
}
|
||||
return ms_pOggParser;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void JCOggParser::DelInstance( void )
|
||||
{
|
||||
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
bool JCOggParser::copyBuffer( char* p_pBuffer,int p_nSize )
|
||||
{
|
||||
if( p_pBuffer == NULL || p_nSize <=0 ) return false;
|
||||
if( m_nCurBufferPos + p_nSize > m_nBufferSize )
|
||||
{
|
||||
int nElargeSize = (p_nSize<=READ_OGG_BUFFER_TEMP_SIZE) ? READ_OGG_BUFFER_TEMP_SIZE : p_nSize;
|
||||
char* pNewBuffer = new char[m_nBufferSize + nElargeSize];
|
||||
memcpy( pNewBuffer,m_pBuffer,m_nBufferSize );
|
||||
m_nBufferSize += nElargeSize;
|
||||
delete m_pBuffer;
|
||||
m_pBuffer = pNewBuffer;
|
||||
}
|
||||
memcpy( m_pBuffer+m_nCurBufferPos,p_pBuffer,p_nSize );
|
||||
m_nCurBufferPos += p_nSize;
|
||||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
JCWaveInfo* JCOggParser::GetWaveInfo( const char* p_sFileName,unsigned char* p_sBuffer, int p_nBufferSize )
|
||||
{
|
||||
m_nCurBufferPos = 0;
|
||||
OggVorbis_File pOggStream;
|
||||
vorbis_info* pVorbisInfo = NULL;
|
||||
int nResult = -1;
|
||||
if( p_sBuffer != NULL && p_nBufferSize > 0 )
|
||||
{
|
||||
nResult = ov_open_callbacks( NULL, &pOggStream, (const char*)p_sBuffer, p_nBufferSize, OV_CALLBACKS_DEFAULT );
|
||||
}
|
||||
else if( p_sFileName != NULL )
|
||||
{
|
||||
FILE* fp = NULL;
|
||||
fp = fopen( p_sFileName, "rb" );
|
||||
if( fp )
|
||||
{
|
||||
nResult = ov_open_callbacks( (void*)fp, &pOggStream, NULL, 0, OV_CALLBACKS_DEFAULT );
|
||||
}
|
||||
fclose( fp );
|
||||
}
|
||||
if( nResult >= 0 )
|
||||
{
|
||||
pVorbisInfo = ov_info( &pOggStream, -1 );
|
||||
char pBufferData[ READ_OGG_BUFFER_TEMP_SIZE ];//解码时候的缓冲区
|
||||
int nSize = 0;
|
||||
int nPortion = 0;
|
||||
int nResult1 = 0;
|
||||
while( true )
|
||||
{
|
||||
nResult1 = ov_read( &pOggStream, pBufferData, sizeof(pBufferData), 0, 2, 1, &nPortion );
|
||||
if( nResult1 > 0 )
|
||||
{
|
||||
nSize += nResult1;
|
||||
copyBuffer( pBufferData,nResult1 );
|
||||
}
|
||||
else if( nResult1 == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("JCOggParser::GetWaveInfo error 1");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if( nSize == 0)
|
||||
{
|
||||
LOGE("JCOggParser::GetWaveInfo error 2");
|
||||
return NULL;
|
||||
}
|
||||
JCWaveInfo* pWaveInfo = new JCWaveInfo();
|
||||
pWaveInfo->m_nRealDataSize = nSize;
|
||||
pWaveInfo->m_pData = new unsigned char[nSize];
|
||||
if( nSize == m_nCurBufferPos )
|
||||
{
|
||||
memcpy( pWaveInfo->m_pData,m_pBuffer,nSize*sizeof(char));
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("JCOggParser::GetWaveInfo error 3");
|
||||
return NULL;
|
||||
}
|
||||
pWaveInfo->m_kFmtBlock.wavFormat.dwSamplesPerSec = pVorbisInfo->rate;
|
||||
pWaveInfo->m_kFmtBlock.wavFormat.wChannels = pVorbisInfo->channels;
|
||||
//TODO 没有找到ogg的这个参数,似乎目前只支持16bit
|
||||
pWaveInfo->m_kFmtBlock.wavFormat.wBitsPerSample = 16;
|
||||
ov_clear(&pOggStream);
|
||||
return pWaveInfo;
|
||||
}
|
||||
LOGE("JCOggParser::GetWaveInfo error 0");
|
||||
return NULL;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
}
|
||||
//-----------------------------END FILE--------------------------------
|
||||
Reference in New Issue
Block a user