J'écris un programme en Python pour lire de l'audio sur une Focusrite Scarlett 6i6 tout en enregistrant simultanément une autre forme d'onde sur un Picoscope 2205AMSO. Pour lire l'audio sur le Focusrite, j'utilise la bibliothèque sounddevice :

sounddevice.play(noise, blocking=True)

Pour enregistrer l'autre forme d'onde, j'utilise la bibliothèque picoscope :

ps.runBlock()
ps.waitReady()
dataA = ps.getDataV('A', nSamples, returnOverflow=False)

Cependant, ces deux instructions ne s'exécuteront pas en même temps car elles sont bloquantes. Si je supprime l'argument "blocking = True" de l'appel de fonction sounddevice.play, l'audio ne sera jamais lu. Y a-t-il un moyen pour que je puisse à la fois enregistrer et lire sans bloquer ?

0
PetSven 6 févr. 2020 à 22:04

1 réponse

Meilleure réponse

J'ai pu faire fonctionner les deux fonctions simultanément en utilisant la bibliothèque asyncio :

import asyncio  

def record():
    ps.runBlock()
    ps.waitReady()

def play():
    sounddevice.play(noise, blocking=True)

async def non_blocking(loop, executor):
    await asyncio.wait(
        fs={
            loop.run_in_executor(executor, play),
            loop.run_in_executor(executor, record),
        },
        return_when=asyncio.ALL_COMPLETED
    )

loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
loop.run_until_complete(non_blocking(loop, executor))
0
PetSven 6 févr. 2020 à 21:57