Как мне остановить Simpleaudio от одновременного одновременного воспроизведения файла? - PullRequest
0 голосов
/ 26 октября 2019

Я использую simpleaudio в текстовой приключенческой игре. Я использую Python 3. В своем основном цикле я хочу добиться этого: воспроизвести короткий аудиоклип, а после его окончания снова начать воспроизведение того же аудиоклипа. Моя проблема в том, что я не могу понять, как заставить Simpleaudio сделать это.

Я прочитал всю документацию API безрезультатно. Я пробовал много разных вещей относительно петель, и ни одна из них не работает.

import simpleaudio as sa

def audio(audiofile):
    filename = "/Users/*********/Desktop/Programming/Python Files/Adventure Game/Audio Files/" + audiofile
    wave_obj = sa.WaveObject.from_wave_file(filename)
    play_obj = wave_obj.play()

A = True
while True:
audio("openingtune.wav")
clear_screen()
firstinput = input("> ")
user_input1(firstinput)

# I didn't include the other functions because they're not relevant to this. 

Примечание. Цикл «while true» обновляется очень часто (после того, как введен ввод и получен вывод). Я понятия не имею, как это сделать: после того, как песня закончилась один раз, она должна начаться заново в тот же момент.

1 Ответ

0 голосов
/ 27 октября 2019

Ваш текущий подход не работает, потому что вы воспроизводите аудио в главном потоке. Он начинает воспроизводить звук, как и предполагалось, с первого раза, но после audio происходит последовательность действий, то есть весь ввод пользователя. В то же время, audio может прекратить воспроизведение и не будет выполняться до следующего прохода цикла.

Решение: запустить аудио в отдельном потоке.

Код:

import simpleaudio as sa
from threading import Thread

def audio(audiofile):
    filename = "/Users/*********/Desktop/Programming/Python Files/Adventure Game/Audio Files/" + audiofile
    wave_obj = sa.WaveObject.from_wave_file(filename)
    while(True):
        play_obj = wave_obj.play()

# Let's play the music on a separate thread
audio_thread = Thread(target=audio, args=("openingtune.wav",))
audio_thread.start()

# And now the main game loop
A = True
while True:
    clear_screen()
    firstinput = input("> ")
    user_input1(firstinput)

Возможно, вы захотите ввести некоторые элементы управления, чтобы остановить воспроизведение звука.

...