升级WP应用时注意的问题——WMAppManifest.xml

前一阵中游在线 创始人 杨亨冉 (http://weibo.com/nowpaper)在codeplex上开源了几个游戏,下载了采蘑菇这个游戏看了看,想参考一下在silverlight里播放声音的代码。于是直接把其中播放声音的代码修改后copy到了以前的一个项目里。不要告我侵权啊^_^

结果发现一到播放背景音乐的地方就出错。为啥捏?

找到了这个文章:http://www.dotblogs.com.tw/thewillwillweb/archive/2011/11/22/59115.aspx 

silverlight里播放声音可以用XNA里面的组件,先添加Microsoft.Xna.Framework.dll的引用,添加Microsoft.Xna.Framework 与 Microsoft.Xna.Framework.Audio 两个命名空间 

 第一种方法是使用 SoundEffect ,但播放后就无法停止,因此适合用来播放一些短的声音或音效:

Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();

长一些的声音可以用 SoundEffectInstance    :

Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
SoundEffectInstance instance = effect.CreateInstance();
instance.Play();

这两种方法的区别还有:SoundEffect播放声音之前必须调用FrameworkDispatcher.Update(); 方法,而SoundEffectInstance不需要调用此方法就可以播放,而且可以设置暂停、继续、停止、重复等。详细的区别可以参考上面那位台湾朋友的文章。

采蘑菇的游戏里播放音效是使用了SoundEffect,但在播放背景音乐时,使用了MediaPlayer,关键代码如下:

复制代码
public static void PlayBackSound()
{
if (IsMusicPlay == false || MediaPlayer.State == MediaState.Playing)
return;
FrameworkDispatcher.Update();
if (song_Background == null)
{
song_Background = Song.FromUri("background", new System.Uri("Sound/background.mp3", System.UriKind.Relative));


MediaPlayer.Volume = 0.5f;
MediaPlayer.IsRepeating = true;
MediaPlayer.Play(song_Background);
}
else
MediaPlayer.Resume();
}
复制代码

使用MediaPlayer播放Song,Song提供了对歌曲库中歌曲的访问,FromUri()方法是从一个Uri路径创建此Song对象,看起来也很容易理解,但添加到项目中后,一运行到创建Song对象的代码便提示未知错误。单从调试信息来看得不到任何有用的消息。我反复对比了修改后的代码和源代码的区别,甚至直接新建一个页面直接调用PlayBackSound()方法,也是到初始化Song这一句就出错。

折腾了半天,于是改变策略直接新建一个项目就测试这一个方法。奇怪的是,这次正常运行了,可以正常初始化Song对象并播放出来。

不应该啊,难道我的项目有其他代码影响了这部分功能?

继续想,终于想到了,问题可能出现在WMAppManifest.xml里,这个文件里有一节 <Capabilities>,设置了此应用需要用到的功能,如使用传感器、使用摄像头、使用媒体等,而我的项目由于要发布到Marketplace上,发布前都要用Marketplace验证套件进行测试,把不需要的功能去掉,因此立即用Marketplace验证套件验证此项目,果然看到所需的Capabilities增加了ID_CAP_MEDIALIB和其他一些。增加此Capabilities后,终于正常了。OMG,竟然浪费了一天时间。

教训:如果在WP7的项目升级中增加了其他功能,相应的Capabilities也必须要及时调整。




posted @   yan_xiaodi  阅读(1143)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示