2017-06-12 36 views
1

これは私の現在のコードです:Python - 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) 

python winsound documentationから:[ファイルの]「[Winsoundの]解釈は後述の定数のビット単位の論理和の組み合わせとすることができるフラグの値に依存"

音楽自体は非同期で再生され、ループします。上記のコードは、ビープ音を再生するときしかし、それは(sprites.pyは、コードのファイルである)のエラーがスローされます。

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 

SND_ASYNCSND_NOSTOPが同じエラーが発生しスワッピング、およびビープ音の再生にSND_NOSTOP結果を削除、しかし音楽は消えます。

なぜこのようなことが起こりますか、それが修正不可能な場合は、ビープ音を鳴らすことができますか?

サウンドファイルはhereです(重要な場合)。

This questionが存在しますが、回答がないようです。

+0

あなたはエラーを再現できるようにwavファイルのリンクを提供できます –

+0

追加されたサウンドファイル。 – Dova

答えて

1

フラグを整えるだけです。それは問題ではありません。問題は、使用しているAPIが一度に複数のサウンドを再生することをサポートしていないことです。

つまり、再生中のサウンドがループ内に存在するため、例外がスローされます。 SND_NOSTOPフラグは、現在再生中のサウンドが中断されないようにする場合にのみ使用します。サウンドが現在再生中であることを示すために例外が発生します。フラグがなければ、古い音が止まり、新しい音が鳴ります。

winsound Pythonモジュールは述べてWindows API PlaySound function薄いラッパ、より少しである:

SND_NOSTOP指定されたサウンドイベントはすでに同じに再生されている別のサウンドイベントを生成します
プロセス。そのサウンドを生成するために必要なリソースが別のサウンドを再生中であるためにサウンドを再生できない場合、この関数は要求されたサウンドを再生せずにすぐにFALSEを返します。

このフラグが指定されていない場合、PlaySoundは、同じプロセスで現在再生中のサウンドを停止しようとします。他のプロセスで再生されたサウンドは影響を受けません。

は何もが現在再生されていない場合にのみ、楽観的にサウンドを再生するためのフラグを使用します。

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

を再生するためには、あなたが音を混在させることができるAPIを必要とし、同時に聞こえます。 PlaySoundこれを行うことはできませんし、スタンダードライブラリには何もありません。

代わりにDirectSound APIを使用できるようにする必要があります。 pyglet libraryのように。このライブラリには、ループ音楽と時折の他のサウンドエフェクトを並行して組み合わせることが簡単にできる、優れたaudio APIが含まれています。

関連する問題