Windows 7.1/7.5/Mango Silverlight应用程序。
我使用了声音示例这里来实现在我的应用程序中播放声音。这是片段。
//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;
}
}
}问题:
他说:我想停止声音,我看到我需要用SoundEffectInstance来做这个。在我上面的代码中集成这些代码的最佳方法是什么?
他说: 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();
} 发布于 2012-01-27 18:07:13
假设silverlight像常规的XNA一样工作,SoundEffectInstances的实现相当简单。
SoundEffectInstance birdSoundInstance = birdSound.CreateInstance();SoundEffectInstance的使用类似于SoundEffect,除了有更多的控制。您可以选择立体声摇摄位置,音高和音量,将声音设置为循环,暂停声音等。只需保持对实例的引用,并使用其方法之一的这些行动。我想,我建议只在类属性中添加一个birdSoundInstance和coyoteSoundInstance,以及您的SoundEffects。
在Windows上,内存不是很大的问题,因为这个平台限制您同时播放16 SoundEffectInstances。所以,从本质上说,它不会让你使用大量的内存(除非你在播放16个非常大的声音)。我喜欢做的是做一个单独的人来演奏音乐,它有16种声音。当我调用.PlaySound(SoundEffectInstance声音)时,它会检查数组中的一个空点来放置该声音。如果没有,它将取代最古老的声音。它检查数组中的每个帧是否有停止(结束)的声音,并将它们清除,并将它们处理掉。(队列似乎是一个很好的数据结构,但它限制删除已经结束的声音)。
在使用SoundEffectInstances时要注意的另一件事是,在我的经验中,即使您取消对它们的引用,它们也仍然存在。如果你想停止播放一个实例,你需要让它完成或者命令它停止。注意,SoundEffectInstance有一个that ()方法。当您播放完声音时,请使用此方法将声音从内存中删除。我不认为垃圾收集器会像大多数其他资产那样自动捡起它们。
我不确定我是否可以帮助您的代码,因为Silverlight资产加载似乎与XNA管道加载有很大的不同,但我希望我已经对这个主题做了一些说明。我认为声音是一些更容易做的事情在XNA。
https://stackoverflow.com/questions/9029060
复制相似问题