c个线程 - 为什么mmsystem(使用mciSendString)不播放声音文件?

时间:2013-07-21 08:44:02

标签: c++ multithreading winmm mcisendstring

我希望我的游戏可以玩一些sfx。一开始,我打开一些mp3文件mciSendString("open Muzle.mp3 alias Muzle");

我的问题是mciSendString("play Muzle from 0");仍然会造成一点滞后,游戏必须经常播放声音。

在另一个问题中,我读到使用线程将解决问题。我对使用线程完全不熟悉。现在的问题是声音没有播放:p。我通过最后给出一个cout来验证线程是否正常运行。

我现在有这个功能:

void Shout(string SoundName){
    string FNstr;
    wstring FNwstr;
    FNstr = "play " + SoundName + " from 0";
    FNwstr.assign(FNstr.begin(), FNstr.end());
    mciSendString(FNwstr.c_str(), NULL, 0, NULL);
    Sleep(2000);
    cout << "Test woi\n";
}

(我试过没有睡觉。我想知道我是否需要它,因为如果线程到达终点,它可能会被删除并且声音终止......我不确定线程​​或mmsystem是如何工作的)

如果我只是调用此Shout()函数,它将播放声音,执行Sleep(2000),然后cout。一切都很好。但我必须使用线程,所以我尝试:

thread(Shout, "Muzle");

我收到错误:abort()已被调用。我想我可能需要分离线程:

thread t(Shout, "Muzle");
t.detach();

有了这个,一切看起来都很好(2秒后,我看到控制台上印有“Test woi”),但没有播放声音。

嗯,谢谢你阅读所有内容^。^。你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

你应该有一个永久线程:  1.在继续之前等待声音完成(假设这是你希望它工作的方式)。您可以使用"wait"选项来执行此操作。  2.当没有播放声音时,等待命令播放下一个声音 - 使用pipe向线程发送消息将是一个这样的解决方案,但您可以使用其他方法。