2017-06-12 1 views
1

Dies ist mein aktueller Code:Python - Verwenden mehrerer Flags für Winsound?

import winsound as wav 

wav.PlaySound("music.wav", wav.SND_LOOP | wav.SND_ASYNC) 
input() 
wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 

Vom python winsound documentation: "[Winsound ist] Interpretation [der Datei] hängt vom Wert der Flags, die unter beschrieben eine bitweise ODER-Verknüpfung Kombination der Konstanten sein können "

Die Musik selbst spielt asynchron und Loops. Wenn jedoch der obige Code den Signalton spielt er einen Fehler wirft (sprites.py der Datei Code):

Traceback (most recent call last): 
    File ".../sprites.py", line 5, in <module> 
    wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 
RuntimeError: Failed to play sound 

Swapping SND_ASYNC und SND_NOSTOP einen identischen Fehler erzeugt, und das Entfernen die SND_NOSTOP Ergebnisse in dem Ton spielen, aber die Musik schneidet aus.

Warum passiert das, und wenn es nicht fixierbar ist, gibt es einen anderen Weg, den Piep zu spielen, ohne die Musik abzuschneiden? Die Klangdateien sind here, wenn das wichtig ist.

This question existiert, aber es scheint keine Antwort zu haben.

+0

können Sie den Link von WAV-Dateien zur Verfügung stellen, damit ich den Fehler reproduzieren kann –

+0

Sounddateien hinzugefügt. – Dova

Antwort

1

Sie kämmen Flaggen gut; Das ist nicht das Problem. Das Problem ist, dass die von Ihnen verwendete API nicht die gleichzeitige Wiedergabe von mehr als einem Sound unterstützt.

Mit anderen Worten, die Ausnahme wird ausgelöst, weil in einer Schleife bereits ein Sound abgespielt wird. Das Flag SND_NOSTOP ist nur nützlich, wenn Sie verhindern möchten, dass ein momentan wiedergegebener Sound unterbrochen wird. Die Ausnahme wird ausgelöst, um anzuzeigen, dass der Sound gerade wiedergegeben wird. Ohne die Flagge wird der alte Sound gestoppt und der neue Sound abgespielt.

Die winsound Python-Modul ist wenig mehr als eine dünne Hülle um die Windows API PlaySound function, in dem es heißt:

SND_NOSTOP
Das angegebene Schallereignis auf einem anderes Klangereignis ergeben wird, das bereits in den gleichen spielen verarbeiten. Wenn ein Sound nicht wiedergegeben werden kann, weil die Ressource, die zum Erzeugen dieses Sounds benötigt wird, gerade einen anderen Sound spielt, gibt die Funktion sofort FALSE zurück, ohne den angeforderten Sound abzuspielen.

Wenn dieses Flag nicht angegeben ist, versucht PlaySound, jeden Ton zu stoppen, der gerade im selben Prozess wiedergegeben wird. Sounds, die in anderen Prozessen wiedergegeben werden, sind nicht betroffen.

die Flagge Verwenden klingt optimistischer nur zu spielen, wenn nichts anderes zur Zeit spielt:

try: 
    wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 
except RuntimeError: 
    # sound api busy with another sound, tough luck 
    pass 

Um zu spielen, klingt müssen Sie gleichzeitig eine API, die Klänge mischen; PlaySound kann dies nicht, und es gibt nichts anderes in der Standardbibliothek.

Sie benötigen etwas, das Sie stattdessen die DirectSound-API verwenden können. Wie die pyglet library. Diese Bibliothek enthält eine ausgezeichnete audio API, die es trivial machen sollte, geloopte Musik mit gelegentlichen anderen Klangeffekten parallel zu kombinieren.

Verwandte Themen