Я играю с SharpDX.XAudio2 уже несколько дней, и хотя в целом ситуация была в значительной степени положительной (странные странности программного обеспечения здесь и там), следующая проблема застряла у меня:
Яработа в C # .NET с использованием VS2015.
Я пытаюсь воспроизводить несколько звуков одновременно.
Для этого я сделал:
- 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;
}
Test.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, кажется, говорит, что максимальное количество inputvoices составляет 64.
- Создание каждой игры sfx из другого файла wav не имеет значения.
- Настройка громкости для исходных голосов и / или мастера не имеет значения.
Из документации API XAudio2 Я нашел эту цитату: 'XAudio2 удаляет 6-канальныйограничение многоканальных звуков и поддержка многоканального звука на любой многоканальной звуковой плате.Карта не требует аппаратного ускорения. '.Это самое близкое к тому, что я нашел, чтобы упомянуть эту проблему.
Я не очень хорошо разбираюсь в программировании на sfx, и многое из этого является для меня совсем новым, так что не стесняйтесь называть меня идиотом, когда это уместно, но, пожалуйста, попробуйте объяснить это с точки зрения непрофессионала.
Пожалуйста, если у вас есть идеи или ответы, они будут очень благодарны!
-Джош