首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows应用程序中的SoundEffect和SoundEffectInstance

Windows应用程序中的SoundEffect和SoundEffectInstance
EN

Stack Overflow用户
提问于 2012-01-27 04:42:07
回答 1查看 2.6K关注 0票数 0

Windows 7.1/7.5/Mango Silverlight应用程序。

我使用了声音示例这里来实现在我的应用程序中播放声音。这是片段。

代码语言:javascript
复制
    //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的合适位置吗?当我使用后退按钮进入这个页面时,它会影响声音播放吗?

代码语言:javascript
复制
//Play sound when page naivgateFrom
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgse)     
{ 
   birdSoundEffectInstance.Dispose(); 
   coyoteSoundEffectInstance.Dispose(); 
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-27 18:07:13

假设silverlight像常规的XNA一样工作,SoundEffectInstances的实现相当简单。

代码语言:javascript
复制
SoundEffectInstance birdSoundInstance = birdSound.CreateInstance();

SoundEffectInstance的使用类似于SoundEffect,除了有更多的控制。您可以选择立体声摇摄位置,音高和音量,将声音设置为循环,暂停声音等。只需保持对实例的引用,并使用其方法之一的这些行动。我想,我建议只在类属性中添加一个birdSoundInstance和coyoteSoundInstance,以及您的SoundEffects。

在Windows上,内存不是很大的问题,因为这个平台限制您同时播放16 SoundEffectInstances。所以,从本质上说,它不会让你使用大量的内存(除非你在播放16个非常大的声音)。我喜欢做的是做一个单独的人来演奏音乐,它有16种声音。当我调用.PlaySound(SoundEffectInstance声音)时,它会检查数组中的一个空点来放置该声音。如果没有,它将取代最古老的声音。它检查数组中的每个帧是否有停止(结束)的声音,并将它们清除,并将它们处理掉。(队列似乎是一个很好的数据结构,但它限制删除已经结束的声音)。

在使用SoundEffectInstances时要注意的另一件事是,在我的经验中,即使您取消对它们的引用,它们也仍然存在。如果你想停止播放一个实例,你需要让它完成或者命令它停止。注意,SoundEffectInstance有一个that ()方法。当您播放完声音时,请使用此方法将声音从内存中删除。我不认为垃圾收集器会像大多数其他资产那样自动捡起它们。

我不确定我是否可以帮助您的代码,因为Silverlight资产加载似乎与XNA管道加载有很大的不同,但我希望我已经对这个主题做了一些说明。我认为声音是一些更容易做的事情在XNA。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9029060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档