#!/usr/bin/python

import sys
import string
import jack
jack.attach("jc")

def help(all_ports):
    print
    print "jc is a script to control jack connections"
    print "Choose (c)onnect (d)isconnect (s)ever (r)efresh. Anything else quits."
    print
    print "Connect and disconnect take the format:"
    print "<c/d> <x> <y>"
    print
    print "where <x> is an output port number and <Y> is an"
    print "input port number(the spaces count). For example:"
    print "c 0 2"
    print "will (probably) connect alsa_pcm:capture_1 to alsa_pcm:playback_1"
    print
    print "Sever disconnects all ports from a single output or input port"
    print
    print "The numbering is dynamic and can change, so hit (r)efresh"
    print "to get the current state of jack"
    print
    choose(all_ports)

def ports(all_ports):
    out_ports=[]
    in_ports=[]
    for x in all_ports:
        if (jack.get_port_flags(x) & jack.IsOutput) == 2:
            o=str(all_ports.index(x))+' '+x
            out_ports.append(o)
            for y in (jack.get_connections(x)):
                z='  '+str(all_ports.index(y))+' '+y
                out_ports.append(z)
        elif (jack.get_port_flags(x) & jack.IsInput) == 1:
            i=str(all_ports.index(x))+' '+x
            in_ports.append(i)
            for u in (jack.get_connections(x)):
                v='  '+str(all_ports.index(u))+' '+u
                in_ports.append(v)
    lout=len(out_ports)
    lin=len(in_ports)
    extra=abs(lout-lin)
    print string.expandtabs('OUTPUTS\tINPUTS', 40)
    if lout >= lin:
        for m in range(lout-extra):
            p=out_ports[m]+'\t'+in_ports[m]
            print string.expandtabs(p, 40)
        for n in range((lout-extra), lout):
            print out_ports[n]
    elif lin > lout:
        for m in range (lin-extra):
            p=out_ports[m]+'\t'+in_ports[m]
            print string.expandtabs(p, 40)
        for n in range((lin-extra), lin):
            q='\t'+in_ports[n]
            print string.expandtabs(q, 40)
    return(all_ports)

def connect(all_ports,a,b):
    jack.connect(all_ports[a], all_ports[b])
    print "Connected", all_ports[a], "to", all_ports[b]
    start()

def disconnect(all_ports,a,b):
    jack.disconnect(all_ports[a], all_ports[b])
    print "Disconnected", all_ports[a], "from", all_ports[b]
    start()

def sever(all_ports,a):
    if (jack.get_port_flags(all_ports[a]) & jack.IsOutput) == 2:
        for x in jack.get_connections(all_ports[a]):
            jack.disconnect(all_ports[a], x)
    elif (jack.get_port_flags(all_ports[a]) & jack.IsInput) == 1:
        for x in jack.get_connections(all_ports[a]):
            jack.disconnect(x, all_ports[a])
    print "Severed all ties to", all_ports[a]
    start()

def quit():
    jack.detach("jc")
    print "Closed this jack connection. Buh-bye!"
    sys.exit(0)

def start():
    all_ports=jack.get_ports()
    ports(all_ports)
    choose(all_ports)

def choose(all_ports):
    print
    choice=string.split(raw_input("Your wish? (h for help) "))
    print
    if choice[0] == "c":
        if jack.get_ports() != all_ports:
            print "!!!Something Changed!!! Choose again."
            start()
        a,b=int(choice[1]),int(choice[2])
        connect(all_ports,a,b)
    elif choice[0] == "d":
        if jack.get_ports() != all_ports:
            print "!!!Something Changed!!! Choose again."
            start()
        a,b=int(choice[1]),int(choice[2])
        disconnect(all_ports,a,b)
    elif choice[0] == "s":
        if jack.get_ports() != all_ports:
            print "!!!Something Changed!!! Choose again."
            start()
        a=int(choice[1])
        sever(all_ports,a)
    elif choice[0] == "r":
        start()
    elif choice[0] == "h":
        help(all_ports)
    quit()
    
start()

