2014-09-01 2 views
3

Поскольку XNA SoundEffect больше не доступен в Windows Runtime API (для разработки универсального приложения), мне нужно что-то подобное, чтобы воспроизводить несколько аудиопотоков одновременно ,Несколько аудиопотоков в универсальном приложении (Runtime API), замена XNA SoundEffect

Требования: Воспроизведение одного и того же аудиофайла несколько раз, одновременно.

Предыдущая Silverlight реализация с SoundEffect:

// Play sound 10 times, sound can be played together. 
// i.e. First sound continues playing while second sound starts playing. 
for(int i=0; i++; i < 10) 
{ 
    Stream stream = TitleContainer.OpenStream("sounds/Ding.wav"); 
    SoundEffect effect = SoundEffect.FromStream(stream); 
    FrameworkDispatcher.Update(); 
    effect.Play(); 
    // Wait a while before playing again. 
    Thread.Sleep(500); 
} 

SoundEffect поддерживает несколько (до 16 я думаю) SoundEffectInstance воспроизводится одновременно.

Стандарт MediaElement API поддерживает только 1 аудиопоток для Windows Phone 8.1.

Я столкнулся с этим: https://github.com/rajenki/audiohelper, который использует API XAudio2, но он, похоже, не поддерживает одновременный звук.

ответ

3

Решено. Я использовал SharpDX. Огромное спасибо автору здесь: http://www.hoekstraonline.net/2013/01/13/how-to-play-a-wav-sound-file-with-directx-in-c-for-windows-8/?utm_source=rss&utm_medium=rss&utm_campaign=how-to-play-a-wav-sound-file-with-directx-in-c-for-windows-8

Вот код к решению:

Initialization:

 xAudio = new XAudio2(); 
     var masteringVoice = new MasteringVoice(xAudio); 
     var nativeFileStream = new NativeFileStream("Assets/Ding.wav", NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read); 

     stream = new SoundStream(nativeFileStream); 
     waveFormat = stream.Format; 
     buffer = new AudioBuffer 
     { 
      Stream = stream.ToDataStream(), 
      AudioBytes = (int)stream.Length, 
      Flags = BufferFlags.EndOfStream 
     }; 

обработчик события:

 var sourceVoice = new SourceVoice(xAudio, waveFormat, true); 


     sourceVoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); 
     sourceVoice.Start(); 

Официально предоставляется код по образцу SharpDX в не использует NativeFileStream, он должен заставить его работать.

Смежные вопросы