rendered paste body#!/usr/bin/env python
# vi: ai si ts=4 sw=4 et :
import sys
import fcntl
import array
import time
DAHDI_SETLINEAR = 1074059816
DAHDI_ECHOCANCEL = 1074059809
DAHDI_ECHOCANCEL_FAX_MODE = 55910
DAHDI_GETEVENT = -2147165688
DAHDI_AUDIOMODE = 1074059808
DAHDI_GET_BLOCKSIZE = -2147165695
DAHDI_SET_BLOCKSIZE = 1074059777
# EVENTS
events = {0: "DAHDI_EVENT_NONE", 19: "DAHDI_EVENT_EC_DISABLED",
27: "DAHDI_EVENT_EC_NLP_DISABLED", }
def set_linear(fp):
buf = array.array("I", [1])
fcntl.ioctl(fp.fileno(), DAHDI_SETLINEAR, buf, 1)
def enable_echocan(fp):
buf = array.array("I", [128])
fcntl.ioctl(fp.fileno(), DAHDI_ECHOCANCEL, buf, 1)
def disable_echocan(fp):
buf = array.array("I", [0])
fcntl.ioctl(fp.fileno(), DAHDI_ECHOCANCEL, buf, 1)
def enable_fax_mode(fp):
fcntl.ioctl(fp.fileno(), DAHDI_ECHOCANCEL_FAX_MODE, 0)
def enable_audiomode(fp):
buf = array.array("I", [1])
fcntl.ioctl(fp.fileno(), DAHDI_AUDIOMODE, buf, 1)
def disable_audiomode(fp):
buf = array.array("I", [0])
fcntl.ioctl(fp.fileno(), DAHDI_AUDIOMODE, buf, 1)
def get_event(fp):
buf = array.array("I", [1])
fcntl.ioctl(fp.fileno(), DAHDI_GETEVENT, buf, 1)
return buf[0]
def get_blocksize(fp):
buf = array.array("I", [0])
fcntl.ioctl(fp.fileno(), DAHDI_GET_BLOCKSIZE, buf, 1)
return buf[0]
def set_blocksize(fp, blocksize):
buf = array.array("I", [blocksize])
fcntl.ioctl(fp.fileno(), DAHDI_SET_BLOCKSIZE, buf, 1)
def process_events(channels):
for chan in channels:
event = get_event(chan)
if event:
try:
print events[event]
except KeyError, e:
print "Unknown event", e
def channel_setup(fp):
set_blocksize(fp, 512)
enable_audiomode(fp)
set_linear(fp)
disable_echocan(fp)
enable_echocan(fp)
#enable_fax_mode(fp)
def main(argv):
chan1 = open("/dev/dahdi/1", "rwb+")
rxfax = open("test_fax/1page_rx.raw", "rb")
channel_setup(chan1)
channel_setup(chan2)
BLOCKSIZE = get_blocksize(chan1)*2
set_blocksize(chan2, BLOCKSIZE/4)
txdata = rxfax.read(BLOCKSIZE)
while len(txdata): # or len(rxdata):
try:
chan1.write(txdata)
txdata = rxfax.read(BLOCKSIZE)
except IOError, e:
if e.errno == 500:
process_events((chan1, chan2))
else:
raise
if __name__ == "__main__":
sys.exit(main(sys.argv))