With a nudge in the right direction from the SlimDX devs, I’ve finally got a working streaming solution for DirectSound in SlimDX. This will be a part of the 1.007 release of AI War, improving performance in the game, but I also wanted to share the code for this since it isn’t out there anywhere else.
First of all, let me note that this entire solution is really just an adaptation of an MDX Directsound streaming solution by Dr Gary. Secondly, it uses the wonderful Ogg Vorbis Decoder (a C# wrapper for the standard ogg dlls) by Atachiants Roman. And, lastly, of course this uses the SlimDX library.
Here’s the code, including a compiled test executable. Do with it what you will. If you want a deep explanation of what is going on there, you want to read Dr Gary’s article above. This is basically his work, after all, and he explains it very nicely.
Here are the major things I added/changed:
1. SlimDX is used instead of MDX, which obviously necessitated a lot of changes.
2. Rather than use Dr Gary’s wav stream class, I’m using the ogg stream class. This required even more changes, especially since the ogg calls are apparently not threadsafe (Dr. Gary was using his wav stream object from multiple threads, which the ogg library did not like one bit).
3. The way I am pulling data off of the ogg stream is a bit different from how the original code was pulling data off of the wav stream. In the original, the stream was seeking every time, to prevent data skips and loss. In my version, I’m using a loop to make sure that this isn’t neccessary, and thus there’s a minor performance gain.
4. I took out support for looping. This code was originally being adapted for AI War, which doesn’t need looping in the same sense. If you want to loop the file, just do like I’m doing in the sample and start playing it again after it completes. My goal was to keep this simple.
5. There are a variety of other minor changes, just switching it to be more in line with the AI War codebase. This was for my own purposes, but since I wanted to make the code public these changes are also seen here.
That’s it! Happy coding.