几天来,我一直在玩 SharpDX.XAudio2,虽然事情在很大程度上是积极的(这里和那里奇怪的软件怪癖),但以下问题让我完全陷入困境:
我正在使用 VS2015 在 C# .NET 中工作。
我正在尝试同时播放多个声音。
为此,我做了:
- Test.cs:包含主要方法
- cSoundEngine.cs:包含 XAudio2、MasteringVoice 和声音管理方法。
- VoiceChannel.cs:保存 SourceVoice,以及将来的任何 sfx/相关数据。
cSoundEngine:
List<VoiceChannel> sourceVoices;
XAudio2 engine;
MasteringVoice master;
public cSoundEngine()
{
engine = new XAudio2();
master = new MasteringVoice(engine);
sourceVoices = new List<VoiceChannel>();
}
public VoiceChannel AddAndPlaySFX(string filepath, double vol, float pan)
{
/**
* Set up and start SourceVoice
*/
NativeFileStream fileStream = new NativeFileStream(filepath, NativeFileMode.Open, NativeFileAccess.Read);
SoundStream soundStream = new SoundStream(fileStream);
SourceVoice source = new SourceVoice(engine, soundStream.Format);
AudioBuffer audioBuffer = new AudioBuffer()
{
Stream = soundStream.ToDataStream(),
AudioBytes = (int)soundStream.Length,
Flags = SharpDX.XAudio2.BufferFlags.EndOfStream
};
//Make voice wrapper
VoiceChannel voice = new VoiceChannel(source);
sourceVoices.Add(voice);
//Volume
source.SetVolume((float)vol);
//Play sound
source.SubmitSourceBuffer(audioBuffer, soundStream.DecodedPacketsInfo);
source.Start();
return voice;
}
测试.cs:
cSoundEngine engine = new cSoundEngine();
total = 6;
for (int i = 0; i < total; i++)
{
string filepath = System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.FullName + @"\Assets\Planet.wav";
VoiceChannel sfx = engine.AddAndPlaySFX(filepath, 0.1, 0);
}
Console.Read(); //Input anything to end play.
目前在 VoiceChannel.cs 中没有任何值得展示的内容 - 它包含“SourceVoice source”,这是构造函数中发送的一个参数!
一切都很好,运行良好,最多有 5 种声音(总计 = 5)。您所听到的只是 Planet.wav 的幸福无人机。但是,任何高于 5 的值都会导致控制台冻结约 5 秒,然后关闭(可能是调试器无法处理的 c++ 错误)。可悲的是,没有错误信息可供我们查看或其他任何内容。
来自测试:
- 只要您没有超过 5 个正在运行的源语音,就不会崩溃。
- 改变采样率似乎没有帮助。
- 将主对象的 inputChannels 设置为不同的数字没有区别。
- MasteringVoice 似乎说输入声音的最大数量是 64。
- 从不同的 wav 文件中播放每个 sfx 没有区别。
- 为 sourcevoices 和/或 master 设置音量没有区别。
从XAudio2 API 文档中,我发现了这句话:'XAudio2 消除了多声道声音的 6 声道限制,并在任何支持多声道的声卡上支持多声道音频。该卡不需要硬件加速。. 这是我找到提到这个问题的最接近的东西。
我对 sfx 的编程经验并不丰富,其中很多对我来说都很陌生,所以请在适当的时候称我为白痴,但请尝试用外行的方式解释事情。
请,如果您有任何想法或答案,他们将不胜感激!
-乔什