PlaySound在C ++控制台应用程序中?

时间:2012-04-01 04:37:01

标签: audio console

编辑所以该代码是正确的(感谢ta.speot.is) - 底部的新问题

所以我一直在玩控制台,因为我在那个级别,广告我们被要求制作我们的第一个“项目”进行评估。我已经完成了基本的应用程序..但是想稍微调整一下并添加一些声音。从控制台播放的声音。

这个测试工作..(有点),因为它会播放声音文件..但我有2个问题... 1当声音播放应用程序冻结时,直到声音100%完成...当我尝试编译为“发布”它错误与“链接错误” - 致命错误LNK1120:1未解析的外部。

#include <iostream>
#include <windows.h>
#include <mmsystem.h>
using namespace std;

int main(){
    //PlaySound(TEXT("mywavsound.wav"), NULL, SND_FILENAME); - My erroring code
    PlaySound(TEXT("mywavsound.wav"), NULL, SND_FILENAME | SND_ASYNC);// - the correct code

    int test = 0;
    cin>>test;
    return 0;
}

所以我的问题是......

  1. 如何在不冻结控制台的情况下播放声音,所以我可以 示例在项目的整个时间播放循环音乐文件 打开。如果我可以播放其他声音也会很棒 它...所以当你按下回车键时它会播放出声音 停止音乐。
  2. 如何添加wav文件以便将其编译为发布?
  3. 编辑

    我知道SND_ASYNC的事情,但我不知道如何使用它,我不能缝合使用它没有编译的东西..剂量任何人有一个代码使用SND_ASYNC的例子?

    编辑2

    所以我现在正在使用

    "PlaySound(TEXT("mysound.wav"), NULL, SND_FILENAME | SND_ASYNC);"
    

    现在我想知道我怎么能一次发出一个或多个声音,因为如果我用该标志两次调用playound它将停止第一个并播放2秒.. 有没有办法玩一次发出2声?

5 个答案:

答案 0 :(得分:3)

  

如何在不冻结控制台的情况下播放声音

如果你是Google PlaySound this is the first result

  

fdwSound

     

...

     

SND_ASYNC声音以异步方式播放,PlaySound在开始播放后立即返回。要终止异步播放的波形声音,请在PlaySound设为pszSound时致电NULL

您应该熟悉搜索引擎及其能力。

  

如何添加wav文件以便将其编译为发行版?

您需要在Release和Debug配置中链接winmm.lib。或者,添加

#pragma comment(lib, "winmm.lib")

到源代码的顶部。

答案 1 :(得分:0)

你的大多数问题都得到了回答。 但是,要立刻播放更多声音。 为此,您可以使用SDL_Mixer来完成此操作。到目前为止,我一直在寻找播放音频的好方法,并使其正常工作,我来到这里。

好处是,SDL_Mixer是多平台的(在win,linux上都经过测试)。如果你知道自己在做什么,就可以编写在两个操作系统上编译的代码。

另一个好处是,您可以一次播放多个声音(甚至可以达到30个,但可以在线查看)。该库适用于Windows(DLL和头文件)和Linux(通过控制台安装)。 我不会进一步详细介绍安装问题。 它支持wav和oog以及更多的文件类型。

然而,缺点如下: 一旦它工作,我花了很多时间,我发现音频爆裂和低质量,尽管原始文件在媒体播放器中播放良好。经过研究,我发现这是图书馆长期存在的一个错误,但仍然没有修复。有些人说他们通过将音量提高到100来修复它,但它对我不起作用。 第二个缺点是它需要比仅输入

更多的编码
 PlaySound(TEXT("mywavsound.wav"), NULL, SND_FILENAME | SND_ASYNC);// - the correct code

我想到了下一个缺点,并且wav文件没有加载,说格式不正确。虽然我使用了3个转换器,并通过互联网下载了很多文件,但它没有用。但是,在下载测试项目并在归档中使用其.wav文件时,它确实有效。 但是,我通过将所有音乐转换为.oog

解决了这个问题

像这样,我仍然不知道哪种音乐库最适合使用。取决于你的控制台应该是什么......?你在写游戏还是只是媒体播放器?或只是测试......?

答案 2 :(得分:0)

使用(mciSendstring)函数代替..用它你可以播放超过1个声音,并且你可以在彼此之上播放2个声音:)

的示例:

mciSendString("play wave1.wav", NULL, 0, NULL);

mciSendString("play wave2.wav", NULL, 0, NULL);

for more indepth info

答案 3 :(得分:0)

所有以前的答案都很好地解释了它。我只想举一个基本的例子:

#include<iostream>
#include<windows.h>
int main(){
    std::string name;
    std::string a1 = "happy.wav";
    std::string a2 = "apple.wav";

    PlaySound((a1.c_str()),NULL,SND_SYNC);
    PlaySound((a2.c_str()),NULL,SND_SYNC);
    return 0;
}

上面给出的是一个代码段,我在其中使用PlaySound()播放两个wav声音文件。

注意。当前,两个wav文件位于cpp代码文件所在的目录中。

答案 4 :(得分:0)

<块引用>

有没有办法同时播放 2 个声音?

您需要使用比 PlaySound() 更强大的多媒体 API。例如,您可以使用 XAudio2 代替:

<块引用>

XAudio2 是一个低级音频 API。它为类似于其前身 DirectSound 和 XAudio 的游戏提供了信号处理和混合基础。

...

以下是 XAudio2 特性和新功能的列表,这些特性和新功能可帮助开发者提高游戏性能。

...

  • 子混合

    Submixing 将多个声音组合成单个音频流 - 例如,引擎声音由复合部分组成,所有这些部分同时播放。此外,您可以使用子混合来处理和组合游戏的相似部分。例如,您可以组合所有游戏音效以允许应用用户音量设置,而单独的设置控制音乐音量。与 DSP 相结合,submixing 提供了当今游戏所需的数据路由和处理类型。 XAudio2 允许任意级别的子混音,从而能够创建复杂的声音和游戏混音。

...

  • 非阻塞 API 模型

    除了少数例外,XAudio2 方法调用不会阻塞音频处理引擎。这意味着客户端可以随时安全地进行一组方法调用,而不会阻塞长时间运行的调用而导致延误。例外是 IXAudio2Voice::DestroyVoice 方法(它可能会阻塞引擎,直到被销毁的语音完成处理)和终止音频线程的方法:IXAudio2::StopEngineIXAudio2::Release。请注意,虽然 XAudio2 方法调用不会阻塞音频处理引擎,但 XAudio2 方法包含关键部分,并且在某些情况下本身可能会被阻塞。