Python Language Mode de rappel E / S audio


Exemple

"""PyAudio Example: Play a wave file (callback version)."""

import pyaudio
import wave
import time
import sys

if len(sys.argv) < 2:
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
    sys.exit(-1)

wf = wave.open(sys.argv[1], 'rb')

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# define callback (2)
def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    return (data, pyaudio.paContinue)

# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True,
                stream_callback=callback)

# start the stream (4)
stream.start_stream()

# wait for stream to finish (5)
while stream.is_active():
    time.sleep(0.1)

# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()

# close PyAudio (7)
p.terminate()

En mode de rappel, PyAudio appelle une fonction de rappel spécifiée (2) chaque fois qu'il a besoin de nouvelles données audio (pour la lecture) et / ou lorsque de nouvelles données audio (enregistrées) sont disponibles. Notez que PyAudio appelle la fonction de rappel dans un thread séparé. La fonction a le callback(<input_data>, <frame_count>, <time_info>, <status_flag>) signature suivant callback(<input_data>, <frame_count>, <time_info>, <status_flag>) et doit renvoyer un tuple contenant les trames de données audio frame_count et un indicateur indiquant s'il y a plus d'images à lire / enregistrer.

Commencez à traiter le flux audio à l'aide de pyaudio.Stream.start_stream () (4), qui appellera la fonction de rappel à plusieurs reprises jusqu'à ce que cette fonction renvoie pyaudio.paComplete .

Pour que le flux reste actif, le thread principal ne doit pas se terminer, par exemple en dormant (5).