在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 try11 {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