2016-10-04 21 views
0

スレッド上でサウンドデバイスを再生するにはいくつかの問題があります。私は最初にsdとしてサウンドデバイスをインポートします。次に、実行中に、ASIOサウンドカードを使ってスレッド上で音を出したい。スレッド上で行う必要があるすべての設定がうまく機能します。しかし、私は次のエラーを得たトーン再生したいとき:スレッド上のPython Sounddevice.play()スレッド

sounddevice.PortAudioError:エラー開口部のOutputStream:予期せぬホストAPI 2エラー0:ASIOドライバをロードするためにu'Failed」

をもし私が私が必要とするたびにスレッドでインポートを初期化してください。もちろん、私はそれをしたくありません。すべてのアイデアはそれを解決するために暑いですか?

ありがとうございます!ここで

簡単なコード例:

from threading import Thread 
import numpy as np 
import sounddevice as sd 

class Test(Thread): 

    def __init__(self): 
     Thread.__init__(self) 
     #-- Configuration of the Tone to be played 
     self.fs = 44100  # sampling rate, in Hz, 44100 or 48000 
     duration = 1.05 # in seconds, may be float 
     f = 200.0  # sine frequency, Hz, may be float 
     self.tone_data = (np.sin(2*np.pi*np.arange(self.fs*duration)*f/self.fs)).astype(np.float32) 

    def run(self):      

     #-- Configuration of the ASIO sound card 
     #import sounddevice as sd 
     sd.default.channels = 2 
     sd.default.device = 14 
     print sd.query_devices(sd.default.device)['name'] 
     #sd.default.latency = ('low','low') 
     #asio_out = sd.AsioSettings(channel_selectors=[1, 2]) 
     #sd.default.extra_settings = asio_out   
     sd.default.samplerate = self.fs     
     sd.play(self.tone_data) 
     sd.wait()   

w = Test()   
w.start() 
+0

[MCVE](http://stackoverflow.com/help/mcve)を提供してください。 – Matthias

+0

@Matthiasを追加してサンプルコード – Laura

+0

好奇心の念から、複数のスレッドを使用するユースケースは何ですか? – Matthias

答えて

0

これは、プラットフォーム固有の問題のようです。私はALSA/Linuxで試してみましたが、うまくいきます。 ASIOを使用すると、後でストリームを作成するために使用している同じスレッド(おそらくplay())でライブラリの初期化(import時に発生)を行う必要がありますか?

If I initialize the import at the thread everytime I need it, it work. But of course I do not want to do that.

なぜあなたはそれをしたくないですか? Pythonでのimportの使用が自動的にキャッシュされることを認識していますか?もう一度importを使用すると、dictルックアップだけが実行されます。

しかし、あなたは正しいですが、importがまだと繰り返されています。がちょっと変わっています。 importTest.__init__()に1回だけ実行しようとしましたか?そこにはsd.defaultのすべてのこともできます。

あなたはまだ初期化中に問題が発生した場合(またはあなたが一番上にあるすべての輸入を持つ上で主張すれば)、あなたはissue #3を参照して、文書化されていない_initialize()_terminate()機能を使用しようとすることができます。

複数のThreadインスタンスを使用する場合は、play()関数で問題が発生します。これはシングルスレッドで使用するためのものです。しかし、オーディオI/Oを行うPythonスレッドを1つしか持たない方がいいでしょう。 PortAudio Tips – Threadingも参照してください。

ご参考までに(...).astype(np.float32)は必要ありません。この変換は自動的に行われます。

私がそれをしている間、デフォルトの入力デバイスと出力デバイスが異なる場合は、sd.query_devices(sd.default.device)['name']という行が壊れてしまいます。