编辑所以该代码是正确的(感谢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;
}
所以我的问题是......
编辑
我知道SND_ASYNC的事情,但我不知道如何使用它,我不能缝合使用它没有编译的东西..剂量任何人有一个代码使用SND_ASYNC的例子?
编辑2
所以我现在正在使用
"PlaySound(TEXT("mysound.wav"), NULL, SND_FILENAME | SND_ASYNC);"
现在我想知道我怎么能一次发出一个或多个声音,因为如果我用该标志两次调用playound它将停止第一个并播放2秒.. 有没有办法玩一次发出2声?
答案 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);
答案 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::StopEngine
和 IXAudio2::Release
。请注意,虽然 XAudio2 方法调用不会阻塞音频处理引擎,但 XAudio2 方法包含关键部分,并且在某些情况下本身可能会被阻塞。