Windows Phone 7.1 / 7.5 / Mango Silverlight app。
我使用声音示例示例here在我的应用中实现播放声音。 这是片段。
//The sounds to play
private SoundEffect coyoteSound;
private SoundEffect birdSound;
//Constructor
public MainPage()
{
InitializeComponent();
// Prime the pump or we'll get an exception.
FrameworkDispatcher.Update();
// Create and load SoundEffect objects.
LoadSound("Resources/coyoteSound.wav", out coyoteSound);
LoadSound("Resources/birdSound.wav", out birdSound);
}
/// <summary>
/// Loads a wav file into an XNA Framework SoundEffect.
/// </summary>
/// <param name="SoundFilePath">Relative path to the wav file.</param>
/// <param name="Sound">The SoundEffect to load the audio into.</param>
private void LoadSound(String SoundFilePath, out SoundEffect Sound)
{
// For error checking, assume we'll fail to load the file.
Sound = null;
try
{
// Holds informations about a file stream.
StreamResourceInfo SoundFileInfo = App.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative));
// Create the SoundEffect from the Stream
Sound = SoundEffect.FromStream(SoundFileInfo.Stream);
}
catch (NullReferenceException)
{
// Display an error message
MessageBox.Show("Couldn't load sound " + SoundFilePath);
}
}
//Play sound when page naivgateTo
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgse)
{
birdSound.Play();
}
//Common mouseclick handler to play sound
private void ElementClick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement ele = sender as FrameworkElement;
if (ele != null)
{
switch (ele.Name)
{
case "imgcoyoteSound":
coyoteSound.Play();
break;
case "imgbirdSound":
birdSound.Play();
break;
default:
birdSound.Play();
break;
}
}
}
问题:
1:我想停止声音,我发现我需要使用SoundEffectInstance。在上面的代码中集成这些内容的最佳方法是什么。
2:OnNavigatedTo中的声音甚至在我的页面加载之前就开始播放了?我尝试将游戏放入OnLoaded,但仍然是说法。有什么想法?
3:我在阅读使用SoundEffect / SoundEffectInstance时对内存使用情况的注意事项。以上代码是否会导致内存问题?
4:我的大部分页面(20-25)将具有如上所述的声音效果。这不应该是一个正确的问题吗?
更新:是否适合调用dispose?当我使用后退按钮进入此页面时会影响声音播放吗?
//Play sound when page naivgateFrom
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgse)
{
birdSoundEffectInstance.Dispose();
coyoteSoundEffectInstance.Dispose();
}
答案 0 :(得分:1)
SoundEffectInstances实现起来相当简单,假设silverlight像常规XNA一样工作。
SoundEffectInstance birdSoundInstance = birdSound.CreateInstance();
SoundEffectInstance的使用类似于SoundEffect,除了有更多控件。您可以选择立体声平移位置,音高和音量,设置声音循环,暂停声音等。只需保持对实例的引用,并使用其中一种方法执行这些操作。我建议只在类属性中添加一个birdSoundInstance和coyoteSoundInstance以及SoundEffects,我猜。
内存在Windows Phone上不是一个问题,因为该平台限制您同时播放16个SoundEffectInstances。所以,基本上,它不会让你使用大量的内存(除非你播放16个非常大的声音)。我喜欢做的是制作一个单独的音乐播放音乐,其中包含16种声音。当我调用.PlaySound(SoundEffectInstance声音)时,它会检查数组中的空位以放入该声音。如果没有,则替换最旧的声音。它会检查每个帧中阵列中已停止(已结束)的声音并将其冲洗掉,然后将它们丢弃。 (一个队列可能看起来像是一个很好的数据结构,但它对于删除已经结束的声音是有限制的。)
使用SoundEffectInstances时要注意的另一件事是,即使你取消引用它们,它们仍然存在,根据我的经验。如果你想停止播放一个实例,你需要让它完成或命令它停止。请注意,SoundEffectInstance具有Dispose()方法。完成播放声音后将其从内存中删除。我不认为垃圾收集器会像大多数其他资产一样自动选择它们。
我不确定我可以帮助你的代码,因为似乎Silverlight资产加载与XNA管道加载明显不同,但我希望我已经阐明了这个问题。我认为声音是XNA中更容易做的事情。