Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple audio stream in Universal App(Runtime API), XNA SoundEffect replacement

As the XNA SoundEffect is no longer available in the Windows Runtime API (for developing Universal App), I need something similar to play multiple audio streams at the same time.

Requirements: Play the same audio file multiple times, simultaneously.

Previous Silverlight implementation with 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 supports multiple (up to 16 I think) SoundEffectInstance being played simultaneously.

The standard MediaElement API only supports 1 audio stream for Windows Phone 8.1.

I bumped into this: https://github.com/rajenki/audiohelper which uses the XAudio2 API but it doesn't seem to support simultaneous audio either.

like image 808
Wilfred Wee Avatar asked Mar 25 '26 20:03

Wilfred Wee


1 Answers

Solved. I used SharpDX. Huge thanks to the author here: 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

Here is the code to the solution:

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
        };

Event handler:

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


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

The officially provided code by SharpDX's sample does not use NativeFileStream, it is required to make it work.

like image 173
Wilfred Wee Avatar answered Mar 28 '26 09:03

Wilfred Wee