How to loop-play an audio with pyaudio?

Viewed 5682

I want to play an audio wave file using Pyaudio and tkinter where the audio plays when the button is pressed and the audio stops when the stop button is pressed. Now, the audio is a simple 5 secs wave file, as it is suppose to, the audio stops after 5 secs. I would like to know how to loop it, such that the audio keeps on playing forever unless the stop button is clicked. I cannot find a way with this code.

from tkinter import *
import pyaudio
import wave
import sys
import threading

# --- classes ---

def play_audio():
    global is_playing
    global my_thread
    chunk = 1024
    wf = wave.open('sound.wav', 'rb')
    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 != '' and is_playing: # is_playing to stop playing
        stream.write(data)
        data = wf.readframes(chunk)



    stream.stop_stream()
    stream.close()
    p.terminate()


# --- functions ---

def press_button_play():
    global is_playing
    global my_thread

    if not is_playing:
        is_playing = True
        my_thread = threading.Thread(target=play_audio)
        my_thread.start()

def press_button_stop():
    global is_playing
    global my_thread

    if is_playing:
        is_playing = False
        my_thread.join()

# --- main ---

is_playing = False
my_thread = None

root = Tk()
root.title("Compose-O-Matic")
root.geometry("400x300")

button_start = Button(root, text="PLAY", command=press_button_play)
button_start.grid()

button_stop = Button(root, text="STOP", command=press_button_stop)
button_stop.grid()

root.mainloop()
1 Answers
Related