【问题标题】:use PlaySound() in C++/OpenGL to play sound in background在 C++/OpenGL 中使用 PlaySound() 在后台播放声音
【发布时间】:2012-02-06 23:01:36
【问题描述】:

我正在尝试在使用 opengl 的 c++ 内置游戏的背景中播放 wav 文件。我正在使用以下行来播放 wav 文件:

 PlaySound("starwars.wav", NULL, SND_FILENAME|SND_LOOP);

问题是音乐开始时动画停止。我尝试按下键盘按钮开始播放音乐,但是当我这样做时,音乐开始播放并且所有动画都停止了。有没有办法避免这种情况?我只想在后台播放一些音乐,而 PlaySound 似乎是实现这一目标的最简单方法,因为它只需要一行代码。

【问题讨论】:

    标签: c++ c windows audio graphics


    【解决方案1】:

    你要传入

    SND_ASYNC

    这将使 PlaySound 立即返回,而不是等待声音完成播放,在您的情况下不会因为您正在循环播放。 IIRC PlaySound 只允许在任何时候播放一种声音,因此最好寻找声音库,尤其是在制作游戏时。

    总结你的样本工作:

    PlaySound("starwars.wav", NULL, SND_ASYNC|SND_FILENAME|SND_LOOP);

    Please see this

    【讨论】:

    • 没问题,别忘了把它标记为答案 :) 我也认为你应该研究一个健全的 API 看到这个 SO 问题stackoverflow.com/questions/3636715/…
    • 请问,这行代码放在哪里?在 Main() 中,还是在动画函数中?
    【解决方案2】:

    如果您使用 playSound("*.wav",NULL,SND_SYNC|SND_LOOP) 格式,您几乎无法控制游戏动画,该动画将被包含在 playSound() 函数中的循环冻结是 SND_LOOP,但如果您使用 SND_ASYNC 更改 SND_SYNC,它将完全按照您的命令工作,但不要忘记这适用于 windows,并且不要忘记在 project/opengl/visual c++/ 下包含 WINMM.LIB(窗口多媒体库)链接

    【讨论】:

      【解决方案3】:

      我不是 windows 声音 API 方面的专家,但函数 PlaySound 似乎是一个阻塞操作,这意味着您的应用程序会冻结,直到函数完成,即声音一直播放到结束。也许有一个标志可以规避这个?

      您可以为声音启动一个线程,该线程在声音停止后结束。或者您可能想研究一个简单的声音 API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多