播放声音文件

来源:互联网 发布:英雄无敌 mac 10.12 编辑:程序博客网 时间:2024/06/02 18:47

// PlaySound.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include  "mmsystem.h"

int _tmain(int argc, _TCHAR* argv[])
{
 char    szFileName[] = "1.wav";//声音文件名  
 MMCKINFO   mmckinfoParent;  
 MMCKINFO   mmckinfoSubChunk;  
 DWORD   dwFmtSize;  
 HMMIO   m_hmmio;//音频文件句柄  
 DWORD   m_WaveLong;  
 HPSTR   lpData;//音频数据  
 HANDLE   m_hData;  
 HANDLE   m_hFormat;  
 WAVEFORMATEX   *   lpFormat;  
 DWORD   m_dwDataOffset;  
 DWORD   m_dwDataSize;  
 WAVEHDR   pWaveOutHdr;  
 WAVEOUTCAPS   pwoc;  
 HWAVEOUT   hWaveOut;  
 //打开波形文件  
 if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))  
 {  
  //File   open   Error  
  printf("Failed   to   open   the   file.");//错误处理函数  
  return   false;  
 }  
 //检查打开文件是否是声音文件  
 mmckinfoParent.fccType   =mmioFOURCC('W','A','V','E');  
 if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))  
 {  
  //NOT   WAVE   FILE   AND   QUIT  
 }  
 //寻找   'fmt'   块  
 mmckinfoSubChunk.ckid   =mmioFOURCC('f','m','t','   ');  
 if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))  
 {  
  //Can't   find   'fmt'   chunk  
 }  
 //获得   'fmt   '块的大小,申请内存  
 dwFmtSize=mmckinfoSubChunk.cksize   ;  
 m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));  
 if(!m_hFormat)  
 {  
  //failed   alloc   memory  
 }  
 lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);  
 if(!lpFormat)  
 {  
  //failed   to   lock   the   memory  
 }  
 if((unsigned   long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)  
 {  
  //failed   to   read   format   chunk  
 }  
 //离开   fmt   块  
 mmioAscend(m_hmmio,&mmckinfoSubChunk,0);  
 //寻找   'data'   块  
 mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a');  
 if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))  
 {  
  //Can't   find   'data'   chunk  
 }  
 //获得   'data'块的大小  
 m_dwDataSize=mmckinfoSubChunk.cksize   ;  
 m_dwDataOffset   =mmckinfoSubChunk.dwDataOffset   ;  
 if(m_dwDataSize==0L)  
 {  
  //no   data   in   the   'data'   chunk  
 }  
 //为音频数据分配内存  
 lpData=new   char[m_dwDataSize];  
 if(!lpData)  
 {  
  //faile  
 }

 long SoundOffset = 0;
 long SoundLong= m_dwDataSize;
 if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)  
 {  
  //Failed   to   read   the   data   chunk  
 }  
 m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);  
 if(m_WaveLong<0)  
 {  
  //Failed   to   read   the   data   chunk  
 }  
 //检查音频设备,返回音频输出设备的性能  
 if(waveOutGetDevCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)  
 {  
  //Unable   to   allocate   or   lock   memory  
 }  
 //检查音频输出设备是否能播放指定的音频文件 
 UINT DevsNum = 0;
 if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)  
 {  
  //Failed   to   OPEN   the   wave   out   devices  
 }  
 //准备待播放的数据  
 pWaveOutHdr.lpData   =(HPSTR)lpData;  
 pWaveOutHdr.dwBufferLength   =m_WaveLong;  
 pWaveOutHdr.dwFlags   =0;  
 if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)  
 {  
  //Failed   to   prepare   the   wave   data   buffer  
 }  
 //播放音频数据文件  
 if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)  
 {  
  //Failed   to   write   the   wave   data   buffer  
 }  
 //关闭音频输出设备,释放内存  
 waveOutReset(hWaveOut);  
 waveOutClose(hWaveOut);  
 LocalUnlock(m_hFormat);  
 LocalFree(m_hFormat);  
 delete   []   lpData;  

 return 0;
}

 加入lib文件  winmm.lib

原创粉丝点击