2012-12-18 14 views
6

Ich benutze SoundPlayer Soundeffekte im WPF-Programm zu spielen. Ich jedoch feststellen, dass, wenn zwei Soundeffekte bei gleichzeitig gespielt werden, die neue wird die alte ersetzen (dh das neue die alte beendet und spielen selbst), aber was ich will, ist zu halten, die alte zu spielen, auch wenn der Neue wird gespielt.Wie kann man mit WPF zwei Sounddateien gleichzeitig abspielen?

SoundPlayer wowSound = new SoundPlayer("soundEffect/Wow.wav"); 

SoundPlayer countingSound = new SoundPlayer("soundEffect/funny.wav"); 

wowSound.Play(); // play like background music 

countingSound.Play(); // from click to generate the sound effect 
+0

http://www.interact-sw.co.uk/iangblog/2008/01/25/wpf-concurrent-audio .. ich dieses sah, aber tat es ausprobieren .. – Mullaly

+0

Ist es, weil Sie feiern? – WildCrustacean

Antwort

4

können Sie SoundPlayer.PlaySync() verwenden, die spielt die .wav Datei der Benutzeroberfläche Faden, so dass wowSound zuerst gespielt werden würde. Dann wird countingSound spielte nach wowSound beendet hat spielen

Beispiel

SoundPlayer wowSound = new SoundPlayer(@"soundEffect/Wow.wav"); //Initialize a new SoundPlayer of name wowSound 
SoundPlayer countingSound = new SoundPlayer(@"soundEffect/funny.wav"); //Initialize a new SoundPlayer of name wowSound 
wowSound.PlaySync(); //Play soundEffect/Wow.wav synchronously 
countingSound.PlaySync(); //Play soundEffect/funny.wav synchronously 

HINWEIS: Sie können nicht mehr als eine Sound zugleich SoundPlayer mit spielen, da es nicht unterstützt die gleichzeitige Wiedergabe Geräusche. Wenn Sie möchten, dass zwei oder mehr Töne auf einmal spielen, System.Windows.Media.MediaPlayer eine bessere Option wäre

Beispiel

MediaPlayer wowSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name wowSound 
wowSound.Open(new Uri(@"soundEffect/Wow.wav")); //Open the file for a media playback 
wowSound.Play(); //Play the media 

MediaPlayer countingSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name countingSound 
countingSound.Open(new Uri(@"soundEffect/funny.wav")); //Open the file for a media playback 
countingSound.Play(); //Play the media 
+1

Ich habe versucht PlaySync() -Methode, aber ich finde, dass das neue nur nach dem alten spielt. Ich möchte beide gleichzeitig spielen. Sie können denken, dass die wowSound.Play() wie Hintergrundmusik spielt und countingSound.Play() wird per Klick abgespielt. –

+0

@Alanlau Wenn du beide Sounds gleichzeitig spielen willst, denke ich, dass du 'Play()' ausprobieren kannst. Haben Sie einen schönen Tag :) –

+0

Picrofo, ich hoffe, eine nette zu, aber ich finde, dass die Play() -Methode lassen Sie einfach die neue die alte ersetzen. Mit anderen Worten, das Neue wird das Alte beenden und sich selbst spielen. –

0
using System.Threading.Tasks; 

private void MyMethod() 
{ 
    Task.Factory.StartNew(PlaySound1); 
    Task.Factory.StartNew(PlaySound2); 
} 

private void PlaySound1() 
{ 
    SoundPlayer wowSound = new SoundPlayer("soundEffect/Wow.wav"); 
    wowSound.Play(); 
} 

private void PlaySound2() 
{ 
    SoundPlayer countingSound = new SoundPlayer("soundEffect/funny.wav"); 
    countingSound.Play(); 
} 

EDIT:

Picrofo richtig ist, kann es nicht auf diese Weise getan werden, aber es scheint, dass Sie dies mit DirectShow .NET erreichen können, die nur ein Wrapper um die MS Directshow ist ...

+0

Ich denke nicht wirklich, dass dies funktioniert, auch wenn Sie versuchen, einen neuen 'Thread' auszuführen, um die Wave-Dateien abzuspielen. 'SoundPlayer' verwendet die Native-WINAPI-Funktion, um Wave-Dateien abzuspielen, die leider keine simultanen Sounds abspielen können. Einen schönen Tag noch :) –

0

Nachdem ich die eingebauten Player in WPF und C# eine Weile benutzt hatte, fand ich, dass sie zu wenig Features enthielten, also wechselte ich zu NAudio.

http://naudio.codeplex.com/

Es erfordert, dass Sie ein wenig mehr Code zu schreiben, aber Sie werden froh sein, wenn Sie feststellen, dass die Anforderungen geändert haben (was sie immer tun) und die in Media Player gebaut werden nicht mehr tun .

Der Quellcode kommt mit ein paar Proben und Sie können mehr Hilfe finden sowohl hier auf Stack-Überlauf, auf der Codeplex-Website und nur durch eine Google-Suche.