在Silverlight 4和WP7的程序中需要使用XNA接口实现在后台播放铃音,不再依赖某个xaml页面。
首先在项目中添加Microsoft.Xna.Framework.dll的引用。
在添加完引用后,接下来在代码文件上方使用using添加下面两个命名空间:
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework;
该类只支持WAV文件,所以只能用WAV格式的音乐,这点非常不方便,可WP7自带的声音都是wma的,目前我还没搞清楚其内部是怎么实现。
将WAV音频文件添加到项目。
然后就可以通过代码实现声音的播放了,代码如下:
1 public class RingPlayerControl 2 { 3 private static readonly Object lockThis = new Object(); 4 private static IsolatedStorageSettings setting = IsolatedStorageSettings.ApplicationSettings; 5 6 public static void Play() 7 { 8 lock (lockThis) 9 { 10 try 11 { 12 Stream stream = TitleContainer.OpenStream("Sounds/DOORBELL.WAV"); 13 SoundEffect effect = SoundEffect.FromStream(stream); 14 FrameworkDispatcher.Update(); 15 effect.Play(); 16 } 17 18 catch (System.Exception ex) 19 { 20 String strError = ex.ToString(); 21 } 22 23 } 24 25 } 26 27 }
XNA提供的TitleContainer.OpenStream方法可以用来读取安装文件夹里的内容。
这样就可以播放声音了,但我感觉即使是WAV格式的铃声也有严格的要求,一开始找了几个wav的,程序报错:Ensure that the specified stream contains valid PCM mono or stereo wave data.可能是这个wav的编码在手机上无法识别,后来从Windows Mobile6.1的手机程序里找了个wav,就很好使了。这个问题在这里有人说过:
http://forums.create.msdn.com/forums/p/82199/496063.aspx
Mango版支持后台播放音乐,参考:http://msdn.microsoft.com/en-us/library/hh202978(v=VS.92).aspx