Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- ####################################
- ### Módulos ###
- ####################################
- import dbus
- from gi.repository import Gtk
- from dbus.mainloop.glib import DBusGMainLoop
- # Hay que hacer este llamado antes de definir el bus
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- ####################################
- ### Bus ###
- ####################################
- bus = dbus.SessionBus()
- jack_control_obj = bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller")
- jack_control_ifa = dbus.Interface(jack_control_obj, "org.jackaudio.JackPatchbay")
- graph = jack_control_ifa.GetGraph(0)
- ####################################
- ### GUI ###
- ####################################
- class MainWindow(Gtk.Window):
- def __init__(self):
- Gtk.Window.__init__(self, title="Listado de Puertos Jack")
- self.set_default_size(200, 200)
- self.ports = []
- self.clients = []
- self.model = Gtk.TreeStore(int, str)
- self.__create_model(graph[1])
- box = Gtk.VBox(False, 3)
- self.add(box)
- sw = Gtk.ScrolledWindow()
- self.treeView = Gtk.TreeView(self.model)
- cellRenderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("ID", cellRenderer, text=0)
- column1 = Gtk.TreeViewColumn("Puertos", cellRenderer, text=1)
- self.treeView.append_column(column)
- self.treeView.append_column(column1)
- sw.add(self.treeView)
- box.add(sw)
- button = Gtk.Button("Hola Mundo!")
- button.connect("clicked", self.printMSJ)
- box.pack_start(button, False, False, 0)
- jack_control_ifa.connect_to_signal("ClientAppeared", self.__add_client)
- jack_control_ifa.connect_to_signal("PortAppeared", self.__add_port)
- jack_control_ifa.connect_to_signal("ClientDisappeared", self.__del_client)
- jack_control_ifa.connect_to_signal("PortDisappeared", self.__del_port)
- def __create_model(self, item_list):
- for client in item_list:
- iter = self.model.append(None)
- self.model.set(iter,
- 0, client[0],
- 1, client[1])
- self.clients.append([client[0], client[1]])
- print("Agregando Cliente:", self.model.get_path(iter), ", ID:", client[0])
- print(" Name:", client[1])
- for port in client[2]:
- child_iter = self.model.append(iter)
- self.model.set(child_iter,
- 0, port[0],
- 1, port[1])
- self.ports.append([client[0], port[0], port[1], port[2], port[3]])
- print("--> Puerto:", self.model.get_path(child_iter), ", Port ID: ", port[0])
- print(" Port Name: ", port[1], isInputOrOutput(port[2]), ["Audio", "MIDI"][port[3]])
- def __add_client (self, new_graph_version, client_id, client_name):
- iter = self.model.append(None)
- self.model.set(iter,
- 0, client_id,
- 1, client_name)
- self.clients.append([client_id, client_name])
- print("Agregando Cliente:", self.model.get_path(iter), ", ID:", client_id)
- print(" Name:", client_name)
- def __add_port (self, new_graph_version, client_id, client_name, port_id, port_name, port_flags, port_type):
- in_client = search_tree(self.model, self.model.iter_children(None), match_func_tree, (0, client_id))
- child_iter = self.model.append(in_client)
- self.model.set(child_iter,
- 0, port_id,
- 1, port_name)
- self.ports.append([client_id, port_id, port_name, port_flags, port_type])
- print("--> Puerto:", self.model.get_path(in_client), ", Port ID: ", port_id)
- print(" Port Name: ", port_name, isInputOrOutput(port_flags), ["Audio", "MIDI"][port_type])
- def __del_client(self, new_graph_version, client_id, client_name):
- dissapeared_client = search_tree(self.model, self.model.iter_children(None), match_func_tree, (0, client_id))
- self.model.remove(dissapeared_client)
- i = 0
- while i < len(self.clients):
- if self.clients[i][0] == client_id:
- del self.clients[i]
- break
- i += 1
- print("Ha desaparecido el cliente:", client_name)
- def __del_port(self, new_graph_version, client_id, client_name, port_id, port_name):
- in_client = search_tree(self.model, self.model.iter_children(None), match_func_tree, (0, client_id))
- if in_client:
- dissapeared_port = search_tree(self.model, self.model.iter_children(in_client), match_func_tree, (0, port_id))
- self.model.remove(dissapeared_port)
- i = 0
- while i < len(self.ports):
- if self.ports[i][1] == port_id:
- del self.ports[i]
- break
- i += 1
- print("Ha desaparecido el puerto:", port_name)
- def printMSJ(self, widget):
- treeselection = self.treeView.get_selection()
- (sel_model, sel_iter) = treeselection.get_selected()
- seleccion = self.model.get_value(sel_iter, 1)
- print("Hola Mundo seleccionando:", seleccion)
- ####################################
- ### Funciones ###
- ####################################
- def match_func_tree(model, iter, data):
- column, key = data # data es una tupla que contiene número de columna, clave (key)
- value = model.get_value(iter, column)
- return value == key
- def search_tree(model, iter, func, data, include_children = False):
- while iter:
- if func(model, iter, data):
- return iter
- if include_children:
- result = search(model, model.iter_children(iter), func, data)
- if result: return result
- iter = model.iter_next(iter)
- return None
- def isInputOrOutput(JackPortFlags):
- if((JackPortFlags & 0x1) != 0):
- return "input"
- elif((JackPortFlags & 0x2) != 0):
- return "output"
- elif ((JackPortFlags & 0x1) != 0) & ((JackPortFlags & 0x2) != 0):
- print("Advertencia: Un puerto no puede ser de entrada y salida a la vez")
- else:
- print("Advertencia: El puerto no es entrada ni salida")
- win = MainWindow()
- win.connect("delete-event", Gtk.main_quit)
- win.show_all()
- Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement