Аудио-цикл с XNA на Windows Phone 8, пока звук все еще воспроизводится

Мне нужен способ запуска/остановки цикла во время воспроизведения звука. Я обнаружил, что лучший способ воспроизвести несколько звуков - использовать XNA. Поэтому я создал SoundEffectInstance, начиная с моего объекта SoundEffect, который содержит аудиоклип. Теперь проблема в том, что у меня есть кнопка, которая должна изменить состояние этого клипа с "зацикленного" на "non looping" и наоборот.

Здесь проблема: он выдает исключение, говоря, что цикл должен быть установлен перед первым воспроизведением. Поэтому я подумал, что, переключаясь с "non looping" на "looped", я мог просто ждать остановки звука, а затем воссоздать SoundEngineInstance, установить IsLooped = true и снова запустить его. Это работает, но есть некоторые задержки, и это заставляет вас потерять время, так что это совершенно бесполезно.

Я ищу способ установить или отключить цикл во время воспроизведения звука и без какой-либо задержки.

EDIT:

Я попытался использовать два SoundEngineInstance, один зацикленный и один нет, и просто переключаюсь между ними с помощью тома. Проблема заключается в том, что не-петлевая запись останавливается только после первого воспроизведения, поэтому, если я зациклирую ее два раза, а затем поставлю ее в состояние без петли, звук не воспроизводится, потому что незатухающий клип уже закончился!

Предложения?

Ответ 1

У меня была такая же функция, и я использовал два экземпляра с одним и тем же аудиоклипом для его решения, один с циклом и один без него. Я переключил между ними. Возможно, это не лучшее решение, но это сработало для меня.

Ответ 2

Из http://msdn.microsoft.com/en-us/library/dd940203(v=xnagamestudio.31).aspx:

  • Объявите SoundEffect, используя метод, показанный в разделе How To: Воспроизведение звука.

  • Объявите параметр SoundEffectInstance и установите его для возвращаемого значения SoundEffect.CreateInstance.

  • Установите SoundEffectInstance.IsLooped в true.

  • Вызовите SoundEffectInstance.Play, чтобы воспроизвести звук цикла.

Вероятно, вы можете установить IsLooped в false, когда вы больше не хотите, чтобы он зациклился, но только для воспроизведения до конца.