#!/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))