Launching the audio processing in a separated thread
============================================================================================================================================


**08-multiple-threads.py**

This program launches an audio process in a separated thread with the
subprocess module and sends parameters to its standard input to control
the sound playback.

.. code-block:: python

    import os
    import sys
    import time
    import random
    import subprocess
    
    # Get the python command according to the current operating system.
    if sys.platform.startswith("win"):
        PYTHON_EXE = "py -%d.%d" % (sys.version_info[0], sys.version_info[1])
    else:
        PYTHON_EXE = "python%d.%d" % (sys.version_info[0], sys.version_info[1])
    
    # Path of the python file to run in the subprocess.
    script_path = os.path.join(os.path.expanduser("~"), "08_multiple_threads_process.py")
    
    # Thread's processing... Soundfile player + delay + reverb.
    script = """
    from pyo import *
    
    s = Server(duplex=0).boot()
    
    sf = SfPlayer('../snds/snd_1.aif', mul=0.7)
    dd = SmoothDelay(sf, delay=0.25, feedback=0.5)
    rv = STRev(sf+dd, inpos=0.50, revtime=1.5, cutoff=5000, bal=0.25).out()
    
    s.start()
    """
    
    # Create the python file to run in the subprocess.
    f = open(script_path, "w")
    f.write(script)
    f.close()
    
    # Launch an interactive python (-i flag) in a subprocess and store a
    # reference to the standard input to pass message to the running process.
    pipe = subprocess.Popen(
        ["%s -i %s" % (PYTHON_EXE, script_path)], shell=True, universal_newlines=True, stdin=subprocess.PIPE,
    ).stdin
    
    # Wait for the audio server to be ready.
    time.sleep(2)
    
    # Send events to the subprocess.
    for i in range(20):
        # Randomly choose a sound (snd_1.aif to snd_6.aif).
        snd = "../snds/snd_%d.aif" % random.randrange(1, 7)
    
        # Replace the sound and start the playback.
        pipe.write("sf.path = '%s'\ndump = sf.play()\n" % snd)
        pipe.write("dd.delay = %f\n" % random.uniform(0.1, 0.5))
        pipe.flush()
    
        # Wait some time before the next event.
        time.sleep(random.uniform(0.5, 1))
    
    # Stop the audio Server before exiting.
    pipe.write("s.stop()\ntime.sleep(0.25)\n")
    
    # Close the subprocess.
    pipe.close()
    
    # Delete the python file.
    os.remove(script_path)

