4
votes

I have the need to play multiple soundeffects at once in my WP7 app. I currently have it working with wav files that takes around 5 megabyte, instead of 500kb when coded in wma/mp3.

Current part of the code:

 Stream stream = TitleContainer.OpenStream(String.Format("/location/{0}.wav", value)
 SoundEffect effect = SoundEffect.FromStream(stream);
 effect.Play();

This works great in a loop, preparing all effects, and then playing them.

However, I would really like to use mp3/wma/whatever-codec to slim my xap file down.

I tried to use MediaElement, but it appears that you also can't use that to play multiple files. Also the XNA MediaPlayer can't be instantiated, and as far as I experienced can't be made to play multiple files at once.

The only solution I see left is that I somehow decode the mp3 to wav and feed that Stream to SoundEffect.

Any ideas on how to accomplish the multiple playback? Or suggestions on how to decode mp3 to wav?

1
I'm not a mobile developer, but I might suggest that WAV might be the best way to go. Decoding MP3s takes some CPU power. I don't know how negligible that is on newer devices, but you might have trouble when doing many at once. You might consider a more light-weight codec, or decode your MP3s to raw uncompressed audio in RAM upon startup of your application.Brad

1 Answers

3
votes

On the conversion... sorry - but I don't think there's any api currently available for WMA or MP3 decoding.

Also, I don't think there are any implementations of MP3, WMA or Ogg decoders which are available in pure c# code - all of them I've seen use DirectShow or PInvoke - e.g. see C# Audio Library.

I personally do expect audio/video compression/decompression to be available at some point in the near future in the WP7 APIs - but I can't guess when!

For some simple compression you can try things like shipping mono instead of stereo files, or shipping 8 bit rather than 16 bit audio files - these are easy to convert back to 16 bit (with obvious loss of resolution) on the phone.

Using compression like zip might also help for some sound effects... but I wouldn't expect it to be hugely successful.