在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