OpenWavePCMData
来源:互联网 发布:java虚拟器 编辑:程序博客网 时间:2024/05/16 06:33
BOOL CAudioChannel::OpenWavePCMData()
{
if ("" == m_strFileName)
{
IVS_LOG(LOG_ERR, "Get broadcase file head info fail, the wav file is not exist.");
return FALSE;
}
//定位到wav的PCM数据处
WAVEFORMATEX waveFormatEx;
MMIOINFO mmioInfo;//多媒体的文件结构
memset(&mmioInfo, 0, sizeof(MMIOINFO)); //将新申请内存空间的mmioInfo的二进制流全部设置为空
m_hmmio = mmioOpenA((LPSTR)(m_strFileName.c_str()), &mmioInfo, MMIO_READ); //lint !e1773 //打开音频文件
if (m_hmmio == NULL)
{
IVS_LOG(LOG_ERR, "Open the WAVE file fail.");
return FALSE;
}
MMCKINFO mmckiOfParent;//定义作为父结点的RIFF块
memset(&mmckiOfParent,0,sizeof(MMCKINFO));
mmckiOfParent.fccType = mmioFOURCC('W','A','V','E');//标识mmckiOfParent.fccType字段为wave文件格式
if (mmioDescend(m_hmmio,&mmckiOfParent,NULL,MMIO_FINDRIFF))//用函数mmioDescend()沉入"WAVE"体
{
IVS_LOG(LOG_ERR, "Source file %s not wave file.", m_strFileName.c_str());
mmioClose(m_hmmio, 0); //关闭文件
return FALSE;
}
MMCKINFO mmcki;//申请子块
mmcki.ckid = mmioFOURCC('f','m','t',' ');//标记为fmt块
if (mmioDescend(m_hmmio,&mmcki,&mmckiOfParent,MMIO_FINDCHUNK) != MMSYSERR_NOERROR)//沉入到"fmt"体
{
//找不到fmt块,关闭文件并退出
IVS_LOG(LOG_ERR, "Source file %s has no FMT chunk.", m_strFileName.c_str());
mmioClose(m_hmmio, 0);
return FALSE;
}
if (mmioRead(m_hmmio,(HPSTR)&waveFormatEx,sizeof(WAVEFORMATEX)) != (long)sizeof(WAVEFORMATEX))
{
//读数据失败,关闭文件并退出
IVS_LOG(LOG_ERR, "The Source file Failed to read format chunk.");
mmioClose(m_hmmio, 0);
return FALSE;
}
mmioAscend(m_hmmio, &mmcki, 0); //离开'fmt'块
mmcki.ckid = mmioFOURCC('d','a','t','a');//标记为data块
if (mmioDescend(m_hmmio,&mmcki,&mmckiOfParent,MMIO_FINDCHUNK) != MMSYSERR_NOERROR) //沉入到data块
{
//不能找到data块, 关闭文件并退出
IVS_LOG(LOG_ERR, "Can not find the wave file data body.");
mmioClose(m_hmmio, 0);
return FALSE;
}
//获取'data'块的大小及偏移地址
DWORD dwDataSize = mmcki.cksize;//data块的大小
DWORD dwDataOffset = mmcki.dwDataOffset;//从音频文件的开始一直到data数据部分的偏移量
if (dwDataSize == 0L)
{
//如果data块中没有数据,关闭文件并退出
IVS_LOG(LOG_ERR, "The wave file has no data source.");
mmioClose(m_hmmio, 0);
return FALSE;
}
//将波形文件定位到声音数据处
if (mmioSeek(m_hmmio,dwDataOffset,SEEK_SET) < 0) //lint !e713
{
//定位失败,关闭文件并退出
IVS_LOG(LOG_ERR, "Go to the wave data start fail.");
mmioClose(m_hmmio, 0);
return FALSE;
}
return TRUE;
}