SoundEffect и SoundEffectInstance в приложении Windows Phone Silverlight - PullRequest
0 голосов
/ 27 января 2012

Windows Phone 7.1 / 7.5 / приложение Mango Silverlight.

Я использовал пример Sound Sample здесь для реализации воспроизведения звуков в моем приложении.Вот фрагмент.

    //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) будут иметь реализацию звуковых эффектов, как описано выше.Это не должно быть проблемой правильно?

Обновление: Это правильное место для вызова утилизации?Повлияет ли это на воспроизведение звука при переходе на эту страницу с помощью кнопки «Назад»?

//Play sound when page naivgateFrom
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgse)     
{ 
   birdSoundEffectInstance.Dispose(); 
   coyoteSoundEffectInstance.Dispose(); 
} 

1 Ответ

1 голос
/ 27 января 2012

SoundEffectInstances довольно просты в реализации, если предположить, что silverlight работает как обычный XNA.

SoundEffectInstance birdSoundInstance = birdSound.CreateInstance();

Использование SoundEffectInstance аналогично SoundEffect, но имеет гораздо больший контроль. Вы можете выбрать положение панорамирования стерео, высоту и громкость, установить петлю звука, приостановить звук и т. Д. Просто сохраняйте ссылку на Экземпляр и используйте один из его методов для этих действий. Я бы рекомендовал просто добавить birdSoundInstance и coyoteSoundInstance вместе с вашими SoundEffects в свойствах класса, я думаю.

Память не так важна для Windows Phone, потому что платформа ограничивает вас одновременным воспроизведением до 16 экземпляров SoundEffectInstances. Так что, по сути, он не позволит вам использовать большие объемы памяти (если вы не играете 16 очень больших звуков). Что мне нравится делать, так это создавать синглтон для воспроизведения музыки, который содержит 16 звуков. Когда я вызываю .PlaySound (SoundEffectInstance sound), он проверяет наличие пустого места в массиве для размещения этого звука. Если его нет, он заменяет самый старый звук. Он проверяет каждый кадр на наличие остановленных (законченных) звуков в массиве и очищает их, удаляя их. (Очередь может показаться хорошей структурой данных для этого, но она ограничивает удаление законченных звуков).

Еще одна вещь, которую стоит отметить при использовании SoundEffectInstances, это то, что они продолжают существовать, даже если вы разыменовали их, по моему опыту. Если вы хотите остановить воспроизведение экземпляра, вам нужно либо дать ему закончить, либо дать команду на остановку. Обратите внимание, что SoundEffectInstance имеет метод Dispose (). Используйте это, когда закончите воспроизведение звука, чтобы удалить его из памяти. Я не думаю, что сборщик мусора автоматически подхватывает их, как большинство других активов.

Я не уверен, что могу помочь с вашим кодом, поскольку кажется, что загрузка ресурсов Silverlight значительно отличается от загрузки конвейера XNA, но я надеюсь, что я пролил некоторый свет на эту тему. Я думаю, что звуки являются одними из самых простых вещей, которые можно сделать в XNA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...