2016-06-08 9 views
1

Ich habe mit einer Win Forms-Anwendung eine Art Tetris-Spiel in C# erstellt. Ich möchte, dass das Programm eine .wav-Datei während des Spiels und eine weitere kurze .wav-Datei nur gelegentlich, aber parallel zum "main" -Sound abspielt.Abspielen von zwei (oder mehr) .wav-Sounds in einer WindowForms-Anwendung

ich am Anfang erklärt:

SoundPlayer sp; 
SoundPlayer sp2; 

Dann im Formload Ereignis:

private void Form1_Load(object sender, EventArgs e) 
{ 
    ... 
    sp2 = new SoundPlayer(".../tetris.wav"); 
    sp2.PlayLooping(); 
    ... 
} 

Dann so weit wie eine Linie der Blöcke verschwinden ich die Bombe-Ton schießen wollen:

sp = new SoundPlayer(".../bomb.wav"); 
sp.Play(); 

Das Problem ist: Wenn der zweite Ton ausgelöst wird, hörte der erste (Haupt-) Ton auf. Ich denke, das ist ein Thread-Problem, aber ich weiß nicht, wie ich das lösen soll.

Danke, Filippo

+0

Sie können [async/await] (http: // www. Dnetnetperls.com/async) oder eine ältere Alternative ist [backgroundworker] (http://www.dotnetperls.com/backgroundworker). – Arman

+0

@ user3283415 hat meine Antwort Ihr Problem gelöst? –

+1

Mögliches Duplikat von [gleichzeitig 2 Sounds abspielen] (http://stackoverflow.com/questions/4740262/playing-2-sounds-together-at-same-time) – DonBoitnott

Antwort

0

Nein, das kein Einfädeln Problem! SoundPlayer unterstützt nur eine Audio-Wiedergabe gleichzeitig.

Wenn Sie Multi-Sound benötigen, dann haben Sie eine der folgenden Tech verwenden:

WPF/Mediaplayer = System.Windows.Media.MediaPlayer(); Öffnen und dann spielen

DirectX/Directsound

XNA/SoundEffect-

0

ich mit dem gleichen Problem zu kämpfen hatte .....

Die kurze Antwort ist kann man nicht. Das System lässt nur einen Kanal zur Soundschnittstelle innerhalb eines bestimmten Prozesses zu. Wenn Sie also einen neuen Sound starten, wird der vorherige beendet.

Es gibt eine Reihe von Work-arounds, die meist Direct-X oder Media-Player verwenden. Ich fand jedoch, dass keine dieser Lösungen einfach oder robust ist, da Sie davon abhängig sind, dass der Benutzer die richtigen Dinge installiert hat.

Allerdings fand ich eine schnelle und einfache Lösung für das Problem.

Ich habe einen speziellen "Hook" zu meiner Anwendung hinzugefügt, so dass, wenn ich es mit einem entsprechenden Kommandozeilenargument ausführe, es nur einen bestimmten Ton synchron spielt und beendet wird. Ich benutze dann das Prozessobjekt, um eine andere Instanz der Anwendung mit dem entsprechenden Argument zu starten. Und hey presto .. mehrere Sounds.

Wenn Ihre Anwendung so konfiguriert ist, dass sie automatisch eine einzelne Instanz ist, müssen Sie sie deaktivieren und durch einen kleinen Code ersetzen, um eine andere Instanz zu erkennen und zu beenden.

Eine weitere Alternative ist das Hinzufügen einer kleinen exe zu Ihrem Anwendungspaket, das einfach den Soundteil übernimmt.

Ich weiß, es klingt nicht sehr "rein", aber wirklich, alles, was Sie wirklich versuchen, mit Ihrem Code zu tun ist, starten einen temporären Hintergrundprozess, um einen Sound zu spielen. Es spielt keine Rolle, ob es sich bei diesem Prozess um eine native Windows-Funktion oder um eine eigene Erstellung handelt.

Verwandte Themen