From 9693a932a30adbea59bee65041bd3e9eae32df6c Mon Sep 17 00:00:00 2001 From: Lars Immisch Date: Fri, 16 Feb 2024 14:14:37 +0100 Subject: [PATCH] Add echo (seed for loopback.py) --- echo.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 echo.py diff --git a/echo.py b/echo.py new file mode 100644 index 0000000..72c39f7 --- /dev/null +++ b/echo.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# -*- mode: python; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- + +import alsaaudio +import select + +def echo(inpcm, outpcm): + q = list() + + # setup the synchronous event loop + # See https://docs.python.org/3/library/select.html#poll-objects for background + reactor = select.poll() + + infd, inmask = inpcm.polldecriptors() + outfd, outmask = outpcm.polldescriptors() + + write_started = False + + def write(): + data = q.pop() + written = outpcm.write(data) + if written < len(data): + q.insert(0, data[written:]) + + reactor.register(infd, inmask) + reactor.register(outfd, outmask) + + while True: + events = reactor.poll() + for fd, event in events: + if event == select.POLLIN and fd == infd: + data = inpcm.read() + q.append(data) + if not write_started: + write() + write_started = True + elif event == select.POLLOUT and fd == outfd: + if not q: + return + write() \ No newline at end of file