c # - Lag, når du afspiller samtidige lydklip med SoundEffect

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på en Windows Phone-app og har det følgende problem: Jeg har en sløjfe .Wav-fil til baggrundsmusik, som kan slås til eller fra. Yderligere lydeffekter (f.eks. Sound1) kan afspilles på tastetryk. baggrundsmusikken er slukket, lydeffekterne virker fint. Men når baggrundsmusikken er tændt, er der en lille (men meget mærkbar) mellemlagring og lydeffekt. Er der noget, jeg kan gøre programatisk for at undgå dette? anbefalinger på MSDN-webstedet http://msdn.microsoft.com/en-us/library/ff431744\%28v=vs.92\%29.aspx, konfigurerer jeg en dispatcherTimer til at ringe til FrameworkDispatcher.Update hver 50 ms. Dette gør dog synes ikke at hjælpe for meget ... Jeg har indsat nogle af min kode nedenfor. Er der noget andet jeg kan gøre for at slippe af med dette lag? [2]


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();
        }


    }



}


}

Bedste reference


Forhåndsindlæse SoundEffect, så du ikke får forsinkelsen fra FromStream (). Det er dog ikke meget telefonvenligt.