forked from auracaster/pyalsaaudio
40 lines
913 B
Python
40 lines
913 B
Python
#!/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() |