【问题标题】:c threads - why does mmsystem (using mciSendString) not play the sound file?c线程-为什么mmsystem(使用mciSendString)不播放声音文件?
【发布时间】:2013-07-20 04:24:14
【问题描述】:

我想让我的游戏播放一些音效。一开始,我打开了一些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";
}

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

如果我简单地调用这个Shout() 函数,它会播放声音,执行睡眠(2000),然后cout。一切正常。但是我必须使用线程,所以我尝试:

thread(Shout, "Muzle");

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

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

这样,一切看起来都正常(2 秒后,我看到控制台上打印了“Test woi”),但没有播放任何声音。

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

【问题讨论】:

    标签: c++ multithreading winmm mcisendstring


    【解决方案1】:

    您可能应该拥有一个永久线程: 1. 在继续之前等待声音结束(假设这是您希望它工作的方式)。您可能只需使用"wait" 选项即可。 2. 不播放声音时,等待命令播放下一个声音 - 使用pipe 向线程发送消息就是这样一种解决方案,但您可以使用其他方法。

    【讨论】:

    • 我需要游戏能够同时播放多个声音,所以如果我理解正确的话,如果我只有一个线程,我不会使用等待。但问题是,当我用线程 xD 调用它时,声音根本不播放。我不知道为什么会这样。
    • 好的,我不知道你需要做什么。如果您在 Google 上搜索“使用 MCI 播放多个声音”,以及提出“MCIsendstring 多线程”的其他内容,就会出现很多事情,并且那里的一些建议似乎暗示要做到这一点并不容易辅助线程 - 我认为是因为事件处理的工作方式。如果你觉得我的回答没有用,我就删了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多