2016-10-04 6 views
0

스레드에서 사운드 장치를 재생할 때 몇 가지 문제가 있습니다. 처음에는 sd로 사운드 장치를 가져옵니다. 그런 다음 실행 중에 ASIO 사운드 카드를 사용하여 스레드에서 소리를 내고 싶습니다. 스레드에서 수행해야하는 모든 구성이 잘 작동합니다. 나는 음색을 연주 할 때, 나는 다음과 같은 오류가 발생했습니다 :Python Sounddevice.play() on Threads

sounddevice.PortAudioError : 오류 개방의 OutputStream : 2 오류 0 예상치 못한 호스트 API : 경우 ASIO 드라이버 '

를로드 할 수 u'Failed I 스레드가 필요할 때마다 가져 오기를 초기화하면됩니다. 하지만 물론 그렇게하고 싶지는 않습니다. 어떤 아이디어를 해결하기 위해 뜨거운?

감사합니다. 다음은 간단한 코드 예제

는 :

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/리눅스와 함께 노력하고 잘 작동합니다. ASIO를 사용하면 나중에 나중에 스트림을 생성하는 데 사용하는 동일한 스레드에서 라이브러리 초기화 (import 시간 동안 발생)를 수행해야합니다 (play()).

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

왜 원하지 않습니까? 파이썬에서 import의 사용이 자동으로 캐싱된다는 것을 알고 있습니까? 두 번째로 import을 사용하면 dict 조회 만 수행되고 나머지는 수행되지 않습니다.

하지만 맞아요, 반복 된 import은 여전히 ​​입니다. 조금 이상하게 보입니다. importTest.__init__()에 한 번만 보내려고 했습니까? 거기서도 sd.default 모든 것을 할 수 있습니다. 여전히 초기화하는 동안 문제를 (당신이 상단에 모든 수입을 가지고 주장하는 경우 또는), 당신은 문서화되지 않은 _initialize()_terminate() 기능을 사용하려고 할 수있는 경우

, issue #3를 참조하십시오.

Thread 인스턴스를 여러 개 사용하려면 play() 함수에 문제가 발생합니다.이 함수는 단일 스레드 용으로 만들어졌습니다. 하지만 오디오 I/O를 수행하는 Python 스레드를 하나만 사용하는 것이 좋습니다. PortAudio Tips – Threading을 참조하십시오.

현재로서는 (...).astype(np.float32)이 필요하지 않습니다.이 변환은 자동으로 수행됩니다.

기본 입력 장치와 출력 장치가 다를 경우 sd.query_devices(sd.default.device)['name'] 줄이 깨집니다.