2012-12-18 12 views
6

Io uso SoundPlayer per riprodurre effetti sonori nel programma WPF. Tuttavia, trovo che quando due suoni vengono riprodotti contemporaneamente, quello nuovo sostituirà quello vecchio (cioè il nuovo terminerà il vecchio e suonerà da solo), ma quello che voglio è continuare a suonare il vecchio anche quando il nuovo si gioca.Come riprodurre due file audio contemporaneamente con WPF?

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 .. Ho visto questo, ma non l'ho provato .. – Mullaly

+0

È questo perché ti piace festeggiare? – WildCrustacean

risposta

4

È possibile utilizzare SoundPlayer.PlaySync() che svolge il file .wav utilizzando il filo interfaccia utente in modo che wowSound sarebbe giocato prima. Poi, countingSound si giocherà dopo wowSound ha finito di giocare

Esempio

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 

AVVISO: Non si può giocare più di un suono allo stesso tempo utilizzando SoundPlayer in quanto non supporta la riproduzione simultanea suoni. Se si desidera riprodurre due o più suoni contemporaneamente, System.Windows.Media.MediaPlayer sarebbe una scelta migliore

Esempio

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

Ho provato il metodo PlaySync(), ma trovo che il nuovo stia giocando solo dopo quello vecchio. Voglio giocare entrambi allo stesso tempo. Potresti pensare che wowSound.Play() stia suonando come musica di sottofondo e countingSound.Play() viene riprodotto facendo clic. –

+0

@Alanlau Se vuoi suonare entrambi i suoni contemporaneamente, penso che potresti provare 'Play()'. Buona giornata :) –

+0

Picrofo, spero anch'io, ma trovo che il metodo Play() lascerà semplicemente il nuovo sostituire il vecchio. In altre parole, il nuovo terminerà il vecchio e giocherà da solo. –

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 è giusto, non può essere fatto in questo modo, ma sembra che è possibile ottenere questo utilizzando DirectShow .NET che è solo un wrapper per MS DirectShow ...

+0

Non penso davvero che funzionerà anche se proverai a eseguire un nuovo 'Thread' per riprodurre i file wave. 'SoundPlayer' utilizza la funzione WINAPI nativa per riprodurre i file wave che, sfortunatamente, non supporta la riproduzione di suoni simultanei. Buona giornata :) –

0

Dopo aver usato i player incorporati in WPF e C# per un po ', ho scoperto che mancavano le funzionalità, quindi mi sono spostato su NAudio.

http://naudio.codeplex.com/

richiede di scrivere un po 'di più codice, ma sarete felici una volta che si scopre che i requisiti sono cambiati (che fanno sempre) e costruito in lettori multimediali non farà più .

Il codice sorgente viene fornito con alcuni esempi e puoi trovare ulteriore aiuto sia qui su Stack Overflow, sul sito di codeplex e semplicemente cercando Google.