1

キーボードからの入力に基づいてコンピューターから音を再生するコードに取り組んでいます。サウンドはwavファイルとして保存され、PyAudioで再生されます。ただし、2つの連続するキーボードストロークで再生されるサウンド間のレイテンシーが遅すぎたため、I/O時間を高速化するためにスレッドを追加しようとしています。ただし、オーディオがスクラッチになり、スレッドのロックが機能していないと思います。関連するコードは次のとおりです。

while threading.activeCount() < NUM_THREADS:
   message, delta_time = midi_in.get_message()
   if message:
    if message[2] == 0:
     continue
    elif message and (str(message[1]) == "108" or str(message[1]) == "107"):
     break
    else:
     t = threading.Thread(target=play, args=(message,))
     lock = threading.Lock()

     lock.acquire()
     t.start()
     lock.release()



def play(message):

  WAVE_FILENAME = "final"+str(message[1]) + '.wav'
  CHUNK = 1024
  wf = wave.open(WAVE_FILENAME)
  p = pyaudio.PyAudio()

  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                 channels = wf.getnchannels(),
             rate = wf.getframerate(),
                 output = True)
  data = wf.readframes(CHUNK)
  while data != '':
   stream.write(data)
   data = wf.readframes(CHUNK)

  stream.stop_stream()
  stream.close()

  p.terminate()

助けてくれてありがとう!

4

3 に答える 3

2

スレッドのロックが機能しているとは思わない

その理由は、次のようにすると新しいロックが作成されるためです。

lock = threading.Lock()

つまり、ループの繰り返しで同じロックを使用していません。各反復には独自のロックがあります。その結果、同期は行われません。

于 2013-01-02T19:55:35.643 に答える
2

次のように、ロックをワーカースレッドに渡す必要があると思います。

def play(message, lock):
    lock.acquire()
    # do something with a restricted ressource 
    lock.release()

次に、スレッドを開始してロックを渡します。

t = threading.Thread(target=play, args=(message, lock))
于 2013-01-02T19:57:05.493 に答える
0
于 2013-01-02T20:08:38.090 に答える