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