【发布时间】:2012-09-29 14:24:45
【问题描述】:
我需要使用waveOutOpen 函数播放音频文件(.wav)。我为此找到了手册。 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=4422&lngWId=3 但我不知道如何更改 .wav 文件。请帮帮我...
【问题讨论】:
我需要使用waveOutOpen 函数播放音频文件(.wav)。我为此找到了手册。 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=4422&lngWId=3 但我不知道如何更改 .wav 文件。请帮帮我...
【问题讨论】:
我就是这样做的(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)); }
【讨论】:
您需要mmioOpen、mmioRead 函数才能从 .WAV 文件中读取有效负载数据,然后才能使用waveOut* API 对缓冲区进行排队。如果数据是 PCM 可以直接发送播放,否则可能需要使用 ACM API 解压。
你会发现很棒的代码 sn-ps 查找提到的 API 函数:
【讨论】: