【问题标题】:Play .wav with WaveOutOpen(C++) [closed]使用 WaveOutOpen(C++)播放 .wav [关闭]
【发布时间】:2012-09-29 14:24:45
【问题描述】:

我需要使用waveOutOpen 函数播放音频文件(.wav)。我为此找到了手册。 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=4422&lngWId=3 但我不知道如何更改 .wav 文件。请帮帮我...

【问题讨论】:

    标签: c++ c winapi waveout


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但我知道如何使用 sndPlaySound 做到这一点。我需要waveOutOpen,因为我需要在特定的音频设备上播放我的声音文件,而不是在WAVE_MAPPER(默认设备)上。
    【解决方案2】:

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

    你会发现很棒的代码 sn-ps 查找提到的 API 函数:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多