2016-11-11 19 views
0

我正在將我爲Android編寫的節拍器翻譯成經典桌面機器的Python。提前輸入stream.write()

在Android下,緩衝區是2s長,並且始終填滿,這意味着它是2s-lag-proof。 Python和Pyaudio,我做這樣的事情(酒吧,4次):

bar = 0 
while self.isRunning: 
    stream.write(beat[bar]) 
    print("beat {} was read".format(bar) 
    bar += 1 
    bar %= 4 

而看

*sound of beat[0] is played* 
beat 0 was read 
*sound of beat[1] is played* 
beat 1 was read 
... 

PyAudio正在等待他的緩衝區來恢復之前得到空。據我所知,「阻塞」的方式。

相反,我希望看到(如在Android設備)

*sound of beat[0] is played* 
beat 0 was read 
beat 1 was read 
beat 2 was read 
*sound of beat[1] is played* 
beat 3 was read 
*sound of beat[2] is played* 
beat 3 was read 

隨着120 BPM這意味着流總是準備好被讀出的2秒緩衝區。

我的問題:是否有任何飼料緩衝區在同一時間它被讀取? 當我嘗試我的節拍器在蹩腳的硬件主機上的虛擬機,第一次跳動是滯後極其擔心我...

我不確定回調方法將允許,因爲我需要播放特定的聲音取決於我在結構中(我的節拍器處理複雜結構)和酒吧,這將是很痛苦的實施。

回答

0

可能使用Python線程(來自threading模塊),但使用回調API(它將爲您創建一個單獨的音頻線程)更有意義。

您可以使用Queue實現緩衝。

我剛剛爲sounddevice模塊創建了一個example program模塊,該模塊顯示瞭如何完成此操作。

+0

隊列模塊看起來很完美。我會試試看。我已經在使用線程,所以GUI不會凍結,但正如已經提到的,我看不到如何回調方法可以適合程序(我必須發揮不同的聲音,取決於嵌套循環中的迭代。) – funkygoby

+0

I猜你可以在你的情況下使用一個(阻塞或回調)。只要使用你更舒適的任何東西。不管是哪種情況,都不要忘記檢查緩衝區溢出/溢出。 – Matthias

+0

我嘗試了回調方法,但正如文檔中提到的那樣,只要回調函數返回一些東西,pyaudio就會反饋它並播放緩衝區,即使最後一次播放仍在進行中。因此,我沒有聽到明顯的'點擊',而是留下了'Bbbrrrrrrrrrr'。我沒有設法用我的bytearray()提供一個Queue實例。我想阻止方法會做... – funkygoby