我必须在我的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次时,UI就会冻结。我想,我不应该每次都叫Stop / Render / Run,但我不知道如何避免它。我该如何重写代码?
此致
答案 0 :(得分:0)
而不是DirectShow,我只是尝试了libzplay(http://libzplay.sourceforge.net/)。
让我引用它的自述文件:
如何将libZPlay与C ++一起使用
- 将libzplay.h包含在您的源代码中
包含libZPlay名称空间
使用命名空间libZPlay;
将您的项目与导入库链接。
libzplay.lib - 用于libzplay.dll的VC ++导入库
libzplay_borland.lib - 用于libzplay.dll的Borland C ++导入库
libzplay.a - libzplay.dll的MinGW / GCC导入库创建ZPlay类。
ZPlay * player = CreateZPlay();
打开文件。
if(player-> OpenFile(“mySong.mp3”,sfAutodetect)== 0){ //错误}
开始播放
播放器 - >播放();
- 醇>
最后破坏ZPlay类
播放器 - >推出();
工作顺利。我只需打开一次文件,每次需要时都可以调用Play()。在DirectShow中调用Run()不会以相同的方式工作。
正确的图书馆必须如此:30分钟从头开始嵌入坚固的岩石。