C++ 使用WaveOutOpen(C+;+;)播放.wav

C++ 使用WaveOutOpen(C+;+;)播放.wav,c++,c,winapi,waveout,C++,C,Winapi,Waveout,我需要用waveOutOpen功能播放音频文件(.wav)。我找到了这本手册。但是我不知道如何改变这个.wav文件。请帮助我…我就是这样做的(wav文件存储在资源中): 您需要mmiopen,mmioRead函数从.WAV文件中读取有效负载数据,然后您将能够使用waveOut*API对缓冲区进行排队。如果数据是PCM,则可以直接发送以进行播放,否则可能需要使用ACM API进行解压缩 您将找到查找上述API函数的优秀代码片段: (如果你读俄语,似乎是这样) 谢谢,但我知道如何使用sndPl

我需要用waveOutOpen功能播放音频文件(.wav)。我找到了这本手册。但是我不知道如何改变这个.wav文件。请帮助我…

我就是这样做的(wav文件存储在资源中):


您需要
mmiopen
mmioRead
函数从.WAV文件中读取有效负载数据,然后您将能够使用
waveOut*
API对缓冲区进行排队。如果数据是PCM,则可以直接发送以进行播放,否则可能需要使用ACM API进行解压缩

您将找到查找上述API函数的优秀代码片段:

  • (如果你读俄语,似乎是这样)

谢谢,但我知道如何使用sndPlaySound实现这一点。我需要waveOutOpen,因为我需要在特定的音频设备上播放声音文件,而不是在WAVE_MAPPER(默认设备)上播放。
static void PlaySound(LPCTSTR lpszSound)
{
   HRSRC hRes; // resource handle to wave file
   HGLOBAL hData;
   BOOL bOk = FALSE;
   if ((hRes = ::FindResource(AfxGetResourceHandle(), lpszSound,
     _T("WAVE"))) != NULL &&
     (hData = ::LoadResource(AfxGetResourceHandle(), hRes)) != NULL)
   {
      // found the resource, play it
    bOk = ::sndPlaySound((LPCTSTR)::LockResource(hData),
         SND_MEMORY|SND_ASYNC|SND_NODEFAULT);
    ::FreeResource(hData);
   }
   //if (!bOk)
   //{
   //   static BOOL bReported = FALSE;
   //   if (!bReported)
   //   {
   //      AfxMessageBox(IDS_CANNOT_PLAY_SOUND);
   //      bReported = TRUE;       // once please
   //   }
   //}
}

inline static void PlaySound(UINT nIDS)
{ ::PlaySound(MAKEINTRESOURCE(nIDS)); }