Задержка при воспроизведении аудиоклипов одновременно с SoundEffect - PullRequest
2 голосов
/ 24 апреля 2011

Я работаю над приложением для Windows Phone, и у меня возникла следующая проблема. У меня есть зацикленный файл .Wav для фоновой музыки, который можно включить или выключить. Дополнительные звуковые эффекты (например, Sound1) могут быть воспроизведены при нажатии кнопки. Когда фоновая музыка выключена, звуковые эффекты воспроизводятся нормально. Однако, когда фоновая музыка включена, между нажатием кнопки и звуковым эффектом наблюдается небольшая (но очень заметная) задержка. Что я могу сделать программно, чтобы избежать этого? В соответствии с рекомендациями на веб-сайте MSDN http://msdn.microsoft.com/en-us/library/ff431744%28v=vs.92%29.aspx, я настраиваю dispatcherTimer для вызова FrameworkDispatcher.Update каждые 50 мс. Тем не менее, это, похоже, не слишком помогает ... Я вставил часть своего кода ниже. Что еще я могу сделать, чтобы избавиться от этой задержки?

public partial class Modules : PhoneApplicationPage
{
    static SoundEffectInstance loopedSound = null;
    static SoundEffectInstance sound1=null;
    double pitchValue = 4.0;
    static double pitchAdjust = 0.0;

    public Modules()
    {
        InitializeComponent();

        // Timer to simulate the XNA game loop (SoundEffect classes are from the XNA Framework)
        DispatcherTimer XnaDispatchTimer = new DispatcherTimer();
        XnaDispatchTimer.Interval = TimeSpan.FromMilliseconds(50);
        XnaDispatchTimer.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
        XnaDispatchTimer.Start();
    }



    private void playButton_Click(object sender, RoutedEventArgs e)
    {
        if (loopedSound!=null) 
            loopedSound.Dispose();
        SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundSound.wav", UriKind.Relative)).Stream);
        LoopClip(sound);

    }

    private void stopButton_Click(object sender, RoutedEventArgs e)
    {
        loopedSound.Stop();
    }

    static protected void LoopClip(SoundEffect soundEffect)
    {
        loopedSound = soundEffect.CreateInstance();
        loopedSound.IsLooped = true;
        loopedSound.Pitch = (float) pitchAdjust;
        loopedSound.Play();
    }

    static protected void sound1Clip(SoundEffect soundEffect)
    {
        sound1 = soundEffect.CreateInstance();
        sound1.IsLooped = false;
        sound1.Play();
    }


    private void Sound1Button_Click(object sender, RoutedEventArgs e)
    {
        if (sound1 == null)
        {
            SoundEffect sound =    SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"sound1.wav", UriKind.Relative)).Stream);
            sound1Clip(sound);
        }
        if (sound1 != null)
        {

            sound1.Play();
        }


    }



}

}

1 Ответ

2 голосов
/ 24 апреля 2011

Предварительно загрузите SoundEffect, чтобы не получать задержку от FromStream (). Это, однако, не очень удобно для телефона.

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