All pastes #1398427 Raw Edit

Something

public text v1 · immutable
#1398427 ·published 2009-04-21 17:30 UTC
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))