windows - afspiller to lyde samtidigt c #

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver en WP7-applikation, der kræver forskellige lydeffekter, der skal afspilles (ved tryk på tryk) over loopet baggrundsmusik. Baggrundsmusikken startes ved at trykke på knap 1 og loops fine. Når jeg trykker på knappen3 (udløser en lydeffekt) overlapper lydeffekten på baggrundsmusikbøden ved først at trykke på. Men når jeg trykker på knappen3 igen, stopper baggrundsmusikken. Jeg kan ikke finde ud af hvorfor dette kunne ske !? Jeg har indsat de relevante dele af koden nedenfor. Vil sætte pris på enhver hjælp.


public partial class MainPage : PhoneApplicationPage
{
    SoundEffect soundEffect;
    Stream soundfile;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }



    static protected void LoopClip(SoundEffect soundEffect)
    {
        {
        SoundEffectInstance instance = soundEffect.CreateInstance();
        instance.IsLooped = true;
        FrameworkDispatcher.Update();
        instance.Play();
        }
    }

    public void PlaySound(string soundFile)
    {
        using (var stream = TitleContainer.OpenStream(soundFile))
        {

            var effect = SoundEffect.FromStream(stream);
            effect.Play();
        }
    }

    private void button1\_Click(object sender, RoutedEventArgs e)
    {
        soundfile = TitleContainer.OpenStream("BackgroundMusic.wav");
        soundEffect = SoundEffect.FromStream(soundfile);  
        LoopClip(soundEffect);
    }


    private void button3\_Click(object sender, RoutedEventArgs e)
    {
        PlaySound("sound3.wav");
    }

}


}

Bedste reference


Dette skal fungere, hvis du altid arbejder med forekomster, så skift kode til dette, og det bør løse problemet:


public partial class MainPage : PhoneApplicationPage
{   

    SoundEffectInstance loopedSound = null;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }

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

    public void PlaySound(string soundFile)
    {
        SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(soundFile, UriKind.Relative)).Stream);
        SoundEffectInstance instance = sound.CreateInstance();
        instance.Play();
    }

    private void button1\_Click(object sender, RoutedEventArgs e)
    {
        SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundMusic.wav", UriKind.Relative)).Stream); 
        LoopClip(sound);
    }


    private void button3\_Click(object sender, RoutedEventArgs e)
    {
        PlaySound("sound3.wav");
    }

}


Ovennævnte eksempel forudsætter, at dine lydfiler er indstillet med Build Action=Indhold og er på øverste niveau bibliotek.

Andre referencer 1


Du skal spille hver lyd fra en separat tråd.


Hvad der synes at ske her er, at de forskellige Play metodeopkald forstyrrer hinanden, da de er i samme tråd.


Prøv bare at sætte baggrundsmusikken i en separat tråd og se om det løser det problem du nævner i spørgsmålet. Hvis det er tilfældet, opdele de andre også.