在Windows Phone Silverlight应用程序中的声音效果和声音效果实例

时间:2012-01-27 04:42:08

标签: silverlight xna windows-phone-7.1 windows-phone-7

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(); 
} 

1 个答案:

答案 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中更容易做的事情。