Статьи

Добавление звуковых эффектов в приложение Windows Phone 7 Silverlight

Некоторые приложения Windows Phone 7 выигрывают от использования звуковых эффектов, даже если само приложение написано в Silverlight. Скорее всего, вы заметили, что вы можете воспроизводить мультимедиа в приложении Silverlight, используя MediaPlayerLauncher внутри приложения для передачи управления встроенному мультимедийному проигрывателю на телефоне или используя класс MediaElement . Оба эти варианта хороши, если вы хотите воспроизводить аудиоконтент под управлением какой-либо формы медиаплеера (с MediaElement, позволяющим интегрировать функциональность плеера в ваше собственное приложение).

Однако если вам нужны короткие звуковые эффекты, которые воспроизводятся под вашим приложением, вы можете использовать функциональные возможности, доступные в XNA Framework, даже если вы разрабатываете приложение Windows Phone 7 на основе Silverlight. Платформа XNA содержит класс SoundEffect . Этот класс содержит звуковой ресурс в памяти, который можно воспроизвести изнутри вашего приложения, вызвав его метод Play. Вы даже можете изменить свойства, такие как высота и громкость SoundEffect. Поскольку возможна совместимость между Silverlight и платформой XNA Framework (по крайней мере, до некоторой степени), можно использовать SoundEffect внутри приложения Silverlight. Однако, учитывая различные модели приложений для приложений Silverlight и XNA Frameworkвы должны знать, что вы делаете, когда добавляете SoundEffect в ваше приложение Silverlight. Первая попытка добавить звук может выглядеть так:

using System.ComponentModel;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
     
namespace Clicker.Model
{
    public class SoundPlayer
    {
        public enum Sounds
        {
            Switch = 0,
            Penalty,
            StartGame,
            HighScore,
            EndGame
        };
     
        static SoundEffect[] soundEffects;
     
        public static void Play(Sounds soundEffect)
        {
            if (soundEffects != null)
            {
                soundEffects[(int)soundEffect].Play();
            }
        }
    }
}

Этот фрагмент кода, взятый из реального приложения, показывает, как воспроизводить звук, который был ранее загружен в память. Чтобы сосредоточиться на воспроизведении звуков, загрузка звуков в массив типа SoundEffect опущена. Когда вызывается статический метод Play класса SoundPlayer, генерируется исключение.

исключение

Отображаемое исключение четко указывает на причину проблемы. Вы можете прочитать больше о решении этого конкретного исключения в MSDN, которое содержит информацию о включении событий XNA Framework в приложениях Windows Phone . Информация очень важна, однако она объясняет, как вам следует регулярно вызывать FrameworkDispatcher.Update () . Вызов этого метода отправляет сообщения, которые находятся в очереди сообщений XNA Framework, для обработки. Документация дает совет для вызова FrameworkDispatcher.Update ()регулярно, например, по таймеру. Для воспроизведения одиночных звуковых эффектов это кажется излишним. В конце концов, использование таймера означает, что некоторый код будет выполняться повторно (в нашем случае, даже если в данный момент не воспроизводится звук). На устройстве с батарейным питанием, таком как Windows Phone 7, это означает, что мы расходуем больше энергии, чем необходимо. Вместо этого я просто изменил мой код, добавив вызов FrameworkDispatcher.Update () непосредственно перед вызовом Play метода на Soundeffect объекта. Это прекрасно работает в следующем сценарии:

  • Единственная функциональность XNA Framework, используемая в приложении Silverlight, — это один или несколько экземпляров типа SoundEffect.
  • Только один единственный SoundEffect воспроизводится в любой момент времени.

В следующем фрагменте кода показан модифицированный метод Play моего собственного класса SoundPlayer (который воспроизводит звуки, как и ожидалось):

public static void Play(Sounds soundEffect)
{
    if (soundEffects != null)
    {
        FrameworkDispatcher.Update();
        soundEffects[(int)soundEffect].Play();
    }
}

В следующей записи блога я покажу вам, как загрузить несколько звуковых эффектов в память с помощью BackgroundWorker.

Источник: http://mstruys.com/2011/01/24/adding-sound-effects-to-a-windows-phone-7-silverlight-application/