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;
}

原创粉丝点击