2013-06-19 76 views
1

我正在編程一個音頻程序,它讀取由arduino發送的串行信息,並在串行信息爲「ok」時播放一些歌曲,如果是「不好」則停止播放。 問題是,我正在使用python庫名稱「pyAudio」,它將一個.wav聲音再現爲一個字節流,因此migth是一個'while'循環,每次都會寫入字節流,所以聲音播放。 由於這個while循環,我不能在執行代碼的同時做更多的事情。但我需要每次讀取串行信息以瞭解是否必須播放聲音。有沒有辦法讓我以循環不停止運行的方式進行串行讀取?Python'多任務'需要

謝謝!

+0

這可以通過**線程**和**隊列**模塊來解決。有很多方法可以處理這個問題,但通常你創建一個線程來讀取每個阻塞事件,並通過Queue將它們讀取的內容傳遞給主線程,以便處理它。 – tdelaney

+0

還有帶發生器和協同程序的源濾波器 - 接收器模式 - 請參閱http://www.dabeaz.com/coroutines/。 –

+0

你可以使用['callback' API來避免阻塞循環](http://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o)。 – jfs

回答

0

的僞草案:

def play_audio(buffer,play_controller): 
    # buffer is the audio buffer to play 
    # play_controller.is_set lets you pause the playback 
    while not_finished: 
     if not play_controller.is_set(): 
      """ 
      The necessary code for playing a audio buffer/song 
      """ 
     else: time.sleep(0.1) 
#end 

import threading 
pause_handler = threading.Event() 
player = threading.Thread(
       target = play_audio, 
       args = (buffer,pause_handler) 
      ) 
player.start() 
pause_handler.set() # this could pause playback 
pause_handler.clear() # this could restart playback 

如果我理解正確的你。正如你所看到的,這很直截了當。

如果您正在尋找更可靠的解決方案,您應該查看GStreamerhere

+0

對於串行讀取來說,多處理並不更容易嗎?對我來說會好很多! – user2483347

+0

您可以用串行方式填充音頻數據的緩衝區,並且使用'threading.Event()'作爲暫停或'ok'變量。 – jorgenkg