Некоторые приложения 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/