用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

基于Visual C++6.0工具下的声音文件操作

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:37:13


  二、编程步骤

  1、 启动Visual C++6.0生成一个单文档视图结构的应用程序,将该程序命名为"playsound";

  2、 在程序的主菜单中添加"MCI Play"、"PlaySound"菜单,并使用Class Wizard添加相应的消息响应函说,分别用不同的方法来处理声音文件;

  3、 在程序的"Link"设置中添加"dsound.lib、dxguid.lib、winmm.lib"库,程序的视图类中包含"mmsystem.h"文件,程序的Debug目录下添加待播放的声音文件"chimes.wav和sound.wav";

  4、 添加代码,编译运行程序;

   三、程序代码

////////////////////////////////////////////////////
void CPlaysoundView::OnMciplay()//下面的代码实现了WAVE声音文件的播放:
{
 // TODO: Add your command handler code here
 MCI_OPEN_PARMS mciOpenParms;
 MCI_PLAY_PARMS PlayParms;
 mciOpenParms.dwCallback=0;
 mciOpenParms.lpstrElementName="d:\chimes.wav";
 mciOpenParms.wDeviceID=0;
 mciOpenParms.lpstrDeviceType="waveaudio";
 mciOpenParms.lpstrAlias=" ";
 PlayParms.dwCallback=0;
 PlayParms.dwTo=0;
 PlayParms.dwFrom=0;
 mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPEMCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);//打开音频设备;
 mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LPVOID)&PlayParms);//播放WAVE声音文件;
 mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,NULL,NULL);//关闭音频设备;
}
//////////////////////////////////////////////////////////////////////////////
/*下面的函数利用DirectSound技术实现了一个WAVE声音文件的播放(注意项目设置中要包含"dsound.lib、dxguid.lib"的内容),代码和注释如下:*/
void CPlaysoundView::OnPlaySound()
{
 // TODO: Add your command handler code here
 LPVOID lpPtr1;//指针1;
 LPVOID lpPtr2;//指针2;
 HRESULT hResult;
 DWORD dwLen1,dwLen2;
 LPVOID m_pMemory;//内存指针;
 LPWAVEFORMATEX m_pFormat;//LPWAVEFORMATEX变量;
 LPVOID m_pData;//指向语音数据块的指针;
 DWORD m_dwSize;//WAVE文件中语音数据块的长度;
 CFile File;//Cfile对象;
 DWORD dwSize;//存放WAV文件长度;
 //打开sound.wav文件;
 if (!File.Open ("d://sound.wav", CFile::modeRead CFile::shareDenyNone))
  return ;
 dwSize = File.Seek (0, CFile::end);//获取WAVE文件长度;
 File.Seek (0, CFile::begin);//定位到打开的WAVE文件头;
 //为m_pMemory分配内存,类型为LPVOID,用来存放WAVE文件中的数据;
 m_pMemory = GlobalAlloc (GMEM_FIXED, dwSize);
 if (File.ReadHuge (m_pMemory, dwSize) != dwSize)//读取文件中的数据;
 {
  File.Close ();
  return ;
 }
 File.Close ();
 LPDWORD pdw,pdwEnd;
 DWORD dwRiff,dwType, dwLength;
 if (m_pFormat) //格式块指针
  m_pFormat = NULL;
 if (m_pData) //数据块指针,类型:LPBYTE
  m_pData = NULL;
 if (m_dwSize) //数据长度,类型:DWORD
  m_dwSize = 0;
 pdw = (DWORD *) m_pMemory;
 dwRiff = *pdw++;
 dwLength = *pdw++;
 dwType = *pdw++;
 if (dwRiff != mmioFOURCC ('R', 'I', 'F', 'F'))
  return ;//判断文件头是否为"RIFF"字符;
 if (dwType != mmioFOURCC ('W', 'A', 'V', 'E'))
  return ;//判断文件格式是否为"WAVE";
  //寻找格式块,数据块位置及数据长度
 pdwEnd = (DWORD *)((BYTE *) m_pMemory+dwLength -4);
 bool m_bend=false;
 while ((pdw < pdwEnd)&&(!m_bend))
 //pdw文件没有指到文件末尾并且没有获取到声音数据时继续;
 {
  dwType = *pdw++;
  dwLength = *pdw++;
  switch (dwType)
  {
   case mmioFOURCC('f', 'm', 't', ' ')://如果为"fmt"标志;
    if (!m_pFormat)//获取LPWAVEFORMATEX结构数据;
    {
     if (dwLength < sizeof (WAVEFORMAT))
      return ;
     m_pFormat = (LPWAVEFORMATEX) pdw;
 
    }
    break;
   case mmioFOURCC('d', 'a', 't', 'a')://如果为"data"标志;
    if (!m_pData !m_dwSize)
    {
     m_pData = (LPBYTE) pdw;//得到指向声音数据块的指针;
     m_dwSize = dwLength;//获取声音数据块的长度;
     if (m_pFormat)
      m_bend=TRUE;
    }
    break;
   }
   pdw = (DWORD *)((BYTE *) pdw + ((dwLength + 1)&~1));//修改pdw指针,继续循环;
  }
  DSBUFFERDESC BufferDesc;//定义DSUBUFFERDESC结构对象;
  memset (&BufferDesc, 0, sizeof (BufferDesc));
  BufferDesc.lpwfxFormat = (LPWAVEFORMATEX)m_pFormat;
  BufferDesc.dwSize = sizeof (DSBUFFERDESC);
  BufferDesc.dwBufferBytes = m_dwSize;
  BufferDesc.dwFlags = 0;
  HRESULT hRes;
  LPDIRECTSOUND m_lpDirectSound;
  hRes = ::DirectSoundCreate(0, &m_lpDirectSound, 0);//创建DirectSound对象;
  if( hRes != DS_OK )
   return;
  m_lpDirectSound->SetCooperativeLevel(this->GetSafeHwnd(), DSSCL_NORMAL);
  //设置声音设备优先级别为"NORMAL";
  //创建声音数据缓冲;
  LPDIRECTSOUNDBUFFER m_pDSoundBuffer;
  if (m_lpDirectSound->CreateSoundBuffer (&BufferDesc, &m_pDSoundBuffer, 0) == DS_OK)
  //载入声音数据,这里使用两个指针lpPtr1,lpPtr2来指向DirectSoundBuffer缓冲区的数据,这是为了处理大型WAVE文件而设计的。dwLen1,dwLen2分别对应这两个指针所指向的缓冲区的长度。
   hResult=m_pDSoundBuffer->Lock(0,m_dwSize,&lpPtr1,&dwLen1,&lpPtr2,&dwLen2,0);
  if (hResult == DS_OK)
  {
   memcpy (lpPtr1, m_pData, dwLen1);
   if(dwLen2>0)
   {
    BYTE *m_pData1=(BYTE*)m_pData+dwLen1;
    m_pData=(void *)m_pData1;
    memcpy(lpPtr2,m_pData, dwLen2);
   }
   m_pDSoundBuffer->Unlock (lpPtr1, dwLen1, lpPtr2, dwLen2);
  }
  DWORD dwFlags = 0;
  m_pDSoundBuffer->Play (0, 0, dwFlags); //播放WAVE声音数据;
}

  
天极yesky

上一页  [1] [2] [3] [4] [5]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:7,390.62500 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号