我必须在我的 UI 中播放多种声音,例如按钮点击、错误、通知等。为此,我编写了以下代码(以前从未在 Windows 中播放过 mp3):
bool ClientHandler::InitSoundAndMusic()
{
m_pSoundGraph = NULL;
m_pSoundControl = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
(void**) &m_pSoundGraph);
if (!SUCCEEDED(hr) || !m_pSoundGraph)
return false;
hr = m_pSoundGraph->QueryInterface(IID_IMediaControl, (void**) &m_pSoundControl);
if (!SUCCEEDED(hr) || !m_pSoundControl)
return false;
return true;
}
void ClientHandler::PlayFile(LPCTSTR file)
{
if (!m_pSoundGraph)
return;
m_pSoundControl->Stop();
HRESULT hr = m_pSoundGraph->RenderFile(file, NULL);
if (SUCCEEDED(hr))
m_pSoundControl->Run();
}
bool ClientHandler::OnEvent(const String& message)
{
if (message == _T("button"))
{
PlayFile(_T(".\\sound\\button.mp3"));
return true;
}
return false;
}
它似乎很慢。当我每秒单击一个按钮约 5 次时,用户界面就会冻结。我想,我不应该每次都调用 Stop/Render/Run,但我不知道如何避免它。我应该如何重写代码?
问候,