线程

时间:2016-10-04 17:18:53

标签: python multithreading python-sounddevice

我在Thread上播放声音设备时遇到一些问题。我在开头将声音设备导入为sd。然后在运行期间我想使用ASIO声卡在线程上播放音调。我需要在线程上执行的所有配置都运行良好。但是,当我想播放音调时,我得到以下错误:

sounddevice.PortAudioError:打开OutputStream时出错:意外的主机API 2错误0:u'无法加载ASIO驱动程序

如果我每次需要它时都在线程初始化导入,它就可以工作了。但我当然不想那样做。任何想法热点解决它?

谢谢!

这是一个简单的代码示例:

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()

1 个答案:

答案 0 :(得分:0)

这似乎是一个特定于平台的问题。我刚用ALSA / Linux试过它,它运行正常。使用ASIO,您可能必须在稍后用于创建流的同一个线程中执行库初始化(这发生在import时间内)(play()为您做了什么)?

  

如果我每次需要它时都在线程初始化导入,它就可以工作了。但我当然不想这样做。

你为什么不想这样做?您是否知道在Python中使用import会自动缓存?第二次使用import时,只会执行dict次查找,而不会执行任何操作。

但你是对的,重复的import仍然看起来有点奇怪。 您是否尝试在import中仅执行一次Test.__init__()?在那里你也可以做所有sd.default的东西。

如果您在初始化期间仍然遇到问题(或者如果您坚持在顶部进行所有导入),则可以尝试使用未记录的_initialize()_terminate()函数,请参阅{{3} }。

如果要使用多个Thread实例,则会遇到play()函数的问题,该函数用于单线程使用。但是,只有一个Python线程可以执行音频I / O,这可能更有意义。另请参阅issue #3

顺便说一句,您不需要(...).astype(np.float32),此转换会自动为您完成。

当我在它时,如果默认的输入和输出设备不同,你的行sd.query_devices(sd.default.device)['name']将会中断。

相关问题