Browse Source

Initial Catia and shared_jack.py code

tags/v0.9.0
falkTX 13 years ago
parent
commit
137186a2dd
10 changed files with 2455 additions and 17 deletions
  1. +6
    -1
      Makefile
  2. +3
    -7
      src/catarina.py
  3. +826
    -0
      src/catia.py
  4. BIN
      src/icons/48x48/catia.png
  5. +2
    -0
      src/icons/icons.qrc
  6. +435
    -0
      src/icons/scalable/catia.svg
  7. +2
    -2
      src/jacklib.py
  8. +88
    -0
      src/shared_jack.py
  9. +31
    -7
      src/shared_settings.py
  10. +1062
    -0
      src/ui/catia.ui

+ 6
- 1
Makefile View File

@@ -11,13 +11,15 @@ all: build

build: UI RES LANG

UI: catarina tools
UI: catarina catia tools

catarina: src/ui_catarina.py \
src/ui_catarina_addgroup.py src/ui_catarina_removegroup.py src/ui_catarina_renamegroup.py \
src/ui_catarina_addport.py src/ui_catarina_removeport.py src/ui_catarina_renameport.py \
src/ui_catarina_connectports.py src/ui_catarina_disconnectports.py

catia: src/ui_catia.py

tools: \
src/ui_logs.py src/ui_render.py src/ui_xycontroller.py \
src/ui_settings_app.py src/ui_settings_jack.py
@@ -49,6 +51,9 @@ src/ui_catarina_connectports.py: src/ui/catarina_connectports.ui
src/ui_catarina_disconnectports.py: src/ui/catarina_disconnectports.ui
$(PYUIC) -o src/ui_catarina_disconnectports.py $<

src/ui_catia.py: src/ui/catia.ui
$(PYUIC) -o src/ui_catia.py $<

src/ui_logs.py: src/ui/logs.ui
$(PYUIC) -o src/ui_logs.py $<



+ 3
- 7
src/catarina.py View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-

# PatchCanvas test application
# Copyright (C) 2012 Filipe Coelho <falktx@gmail.com>
# Copyright (C) 2010-2012 Filipe Coelho <falktx@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -567,7 +567,7 @@ class CatarinaMainW(QMainWindow, ui_catarina.Ui_CatarinaMainW):

self.scene = patchcanvas.PatchScene(self, self.graphicsView)
self.graphicsView.setScene(self.scene)
self.graphicsView.setRenderHint(QPainter.Antialiasing, bool(self.m_savedSettings["Canvas/Antialiasing"] == Qt.Checked))
self.graphicsView.setRenderHint(QPainter.Antialiasing, bool(self.m_savedSettings["Canvas/Antialiasing"] == patchcanvas.ANTIALIASING_FULL))
self.graphicsView.setRenderHint(QPainter.TextAntialiasing, self.m_savedSettings["Canvas/TextAntialiasing"])
if (self.m_savedSettings["Canvas/UseOpenGL"] and hasGL):
self.graphicsView.setViewport(QGLWidget(self.graphicsView))
@@ -1156,10 +1156,6 @@ class CatarinaMainW(QMainWindow, ui_catarina.Ui_CatarinaMainW):
@pyqtSlot()
def slot_configureCatarina(self):
dialog = SettingsW(self, "catarina", hasGL)
dialog.hideRow(0)
dialog.hideRow(2)
dialog.hideRow(3)
dialog.setCurrentRow(1)
if (dialog.exec_()):
self.loadSettings(False)
patchcanvas.clear()
@@ -1222,7 +1218,7 @@ if __name__ == '__main__':
app = QApplication(sys.argv)
app.setApplicationName("Catarina")
app.setApplicationVersion(VERSION)
app.setOrganizationName("falkTX")
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/catarina.svg"))

# Show GUI


+ 826
- 0
src/catia.py View File

@@ -0,0 +1,826 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# JACK Patchbay
# Copyright (C) 2010-2012 Filipe Coelho <falktx@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For a full copy of the GNU General Public License see the COPYING file

# Imports (Global)
from PyQt4.QtCore import pyqtSlot, QSettings
from PyQt4.QtGui import QApplication, QMainWindow

# Imports (Custom Stuff)
import ui_catia
from shared_jack import *
from shared_canvas import *
from shared_settings import *

try:
from PyQt4.QtOpenGL import QGLWidget
hasGL = True
except:
hasGL = False

try:
import dbus
from dbus.mainloop.qt import DBusQtMainLoop
haveDBus = True
except:
haveDBus = False

iGroupId = 0
iGroupName = 1

iPortId = 0
iPortName = 1
iPortNameR = 2
iPortGroupName = 3

iConnId = 0
iConnOutput = 1
iConnInput = 2

# Main Window
class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.setupUi(self)

self.settings = QSettings("Cadence", "Catia")
self.loadSettings(True)

setIcons(self, ["canvas", "jack", "transport", "misc"])

self.act_quit.setIcon(getIcon("application-exit"))
self.act_configure.setIcon(getIcon("configure"))

self.m_group_list = []
self.m_group_split_list = []
self.m_port_list = []
self.m_connection_list = []
self.m_last_group_id = 1
self.m_last_port_id = 1
self.m_last_connection_id = 1

self.m_buffer_size = 0
self.m_sample_rate = 0
self.m_last_buffer_size = 0
self.m_last_sample_rate = 0
self.m_next_sample_rate = 0

self.m_last_bpm = None
self.m_last_transport_state = None

self.cb_buffer_size.clear()
self.cb_sample_rate.clear()

for buffer_size in buffer_sizes:
self.cb_buffer_size.addItem(str(buffer_size))

for sample_rate in sample_rates:
self.cb_sample_rate.addItem(str(sample_rate))

self.act_jack_bf_list = (self.act_jack_bf_16, self.act_jack_bf_32, self.act_jack_bf_64, self.act_jack_bf_128, self.act_jack_bf_256,
self.act_jack_bf_512, self.act_jack_bf_1024, self.act_jack_bf_2048, self.act_jack_bf_4096, self.act_jack_bf_8192)

self.scene = patchcanvas.PatchScene(self, self.graphicsView)
self.graphicsView.setScene(self.scene)
self.graphicsView.setRenderHint(QPainter.Antialiasing, bool(self.m_savedSettings["Canvas/Antialiasing"] == patchcanvas.ANTIALIASING_FULL))
self.graphicsView.setRenderHint(QPainter.TextAntialiasing, self.m_savedSettings["Canvas/TextAntialiasing"])
if (self.m_savedSettings["Canvas/UseOpenGL"] and hasGL):
self.graphicsView.setViewport(QGLWidget(self.graphicsView))
self.graphicsView.setRenderHint(QPainter.HighQualityAntialiasing, self.m_savedSettings["Canvas/HighQualityAntialiasing"])

p_options = patchcanvas.options_t()
p_options.theme_name = self.m_savedSettings["Canvas/Theme"]
p_options.auto_hide_groups = self.m_savedSettings["Canvas/AutoHideGroups"]
p_options.use_bezier_lines = self.m_savedSettings["Canvas/UseBezierLines"]
p_options.antialiasing = self.m_savedSettings["Canvas/Antialiasing"]
p_options.eyecandy = self.m_savedSettings["Canvas/EyeCandy"]

p_features = patchcanvas.features_t()
p_features.group_info = False
p_features.group_rename = False
p_features.port_info = True
p_features.port_rename = bool(self.m_savedSettings["Main/JackPortAlias"] > 0)
p_features.handle_group_pos = True

patchcanvas.setOptions(p_options)
patchcanvas.setFeatures(p_features)
patchcanvas.init(self.scene, self.canvasCallback, DEBUG)

# DBus Stuff
if (haveDBus):
if (DBus.jack and DBus.jack.IsStarted()):
self.jackStarted()
else:
self.jackStarted(autoStop=True)
if (jack.client):
self.act_tools_jack_start.setEnabled(False)
self.act_tools_jack_stop.setEnabled(False)
self.act_jack_configure.setEnabled(False)
self.b_jack_configure.setEnabled(False)

if (DBus.a2j):
if (DBus.a2j.is_started()):
self.a2jStarted()
else:
self.a2jStopped()
else:
self.act_tools_a2j_start.setEnabled(False)
self.act_tools_a2j_stop.setEnabled(False)
self.act_tools_a2j_export_hw.setEnabled(False)
self.menu_A2J_Bridge.setEnabled(False)

else: #No DBus
self.act_tools_jack_start.setEnabled(False)
self.act_tools_jack_stop.setEnabled(False)
self.act_jack_configure.setEnabled(False)
self.b_jack_configure.setEnabled(False)
self.act_tools_a2j_start.setEnabled(False)
self.act_tools_a2j_stop.setEnabled(False)
self.act_tools_a2j_export_hw.setEnabled(False)
self.menu_A2J_Bridge.setEnabled(False)

self.jackStarted(autoStop=True)

self.cb_sample_rate.setEnabled(bool(DBus.jack != None))

#self.m_timer120 = self.startTimer(self.saved_settings["Main/RefreshInterval"])
#self.m_timer600 = self.startTimer(self.saved_settings["Main/RefreshInterval"]*5)

setCanvasConnections(self)
#setJackConnections(self, ["jack", "buffer-size", "transport", "misc"])

self.connect(self.act_tools_jack_start, SIGNAL("triggered()"), SLOT("slot_JackServerStart()"))
self.connect(self.act_tools_jack_stop, SIGNAL("triggered()"), SLOT("slot_JackServerStop()"))
self.connect(self.act_tools_a2j_start, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStart()"))
self.connect(self.act_tools_a2j_stop, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStop()"))
self.connect(self.act_tools_a2j_export_hw, SIGNAL("triggered()"), SLOT("slot_A2JBridgeExportHW()"))

self.connect(self.act_configure, SIGNAL("triggered()"), SLOT("slot_configureCatia()"))

self.connect(self.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCatia()"))
self.connect(self.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()"))

#self.connect(self, SIGNAL("XRunCallback"), self._XRunCallback)
#self.connect(self, SIGNAL("BufferSizeCallback"), self._BufferSizeCallback)
#self.connect(self, SIGNAL("SampleRateCallback"), self._SampleRateCallback)
#self.connect(self, SIGNAL("ClientRegistrationCallback"), self._ClientRegistrationCallback)
self.connect(self, SIGNAL("PortRegistrationCallback(int, bool)"), SLOT("slot_PortRegistrationCallback(int, bool)"))
self.connect(self, SIGNAL("PortConnectCallback(int, int, bool)"), SLOT("slot_PortConnectCallback(int, int, bool)"))
#self.connect(self, SIGNAL("PortRenameCallback"), self._PortRenameCallback)
#self.connect(self, SIGNAL("ShutdownCallback"), self._ShutdownCallback)

if (DBus.jack or DBus.a2j):
DBus.bus.add_signal_receiver(self.DBusSignalReceiver, destination_keyword='dest', path_keyword='path',
member_keyword='member', interface_keyword='interface', sender_keyword='sender', )

def canvasCallback(self, action, value1, value2, value_str):
if (action == patchcanvas.ACTION_GROUP_INFO):
pass

def init_jack(self):
if (not jack.client): # Jack Crash/Bug ?
self.menu_Transport.setEnabled(False)
self.group_transport.setEnabled(False)
return

#buffer_size = int(jacklib.get_buffer_size(jack.client))
#realtime = int(jacklib.is_realtime(jack.client))
#sample_rate = int(jacklib.get_sample_rate(jack.client))
#self.xruns = 0
self.last_bpm = None
self.last_transport_state = None

#setBufferSize(self, buffer_size)
#setRealTime(self, realtime)
#setSampleRate(self, sample_rate)
#setXruns(self, self.xruns)

#refreshDSPLoad(self)
#refreshTransport(self)

self.init_callbacks()
self.init_ports()
self.scene.zoom_fit()
self.scene.zoom_reset()

jacklib.activate(jack.client)

def init_callbacks(self):
if (not jack.client):
return

#jacklib.set_buffer_size_callback(jack.client, self.JackBufferSizeCallback)
#jacklib.set_sample_rate_callback(jack.client, self.JackSampleRateCallback)
#jacklib.set_xrun_callback(jack.client, self.JackXRunCallback)

#jacklib.set_client_registration_callback(jack.client, self.JackClientRegistrationCallback)
jacklib.set_port_registration_callback(jack.client, self.JackPortRegistrationCallback, None)
jacklib.set_port_connect_callback(jack.client, self.JackPortConnectCallback, None)
#jacklib.on_shutdown(jack.client, self.JackShutdownCallback)

#if (JACK2):
#jacklib.set_port_rename_callback(jack.client, self.JackPortRenameCallback)

def init_ports_prepare(self):
pass

def init_ports(self):
if (not jack.client):
return

self.m_group_list = []
self.m_group_split_list = []
self.m_port_list = []
self.m_connection_list = []
self.m_last_group_id = 1
self.m_last_port_id = 1
self.m_last_connection_id = 1

# Get all ports, put a2j ones to the bottom of the list
a2j_name_list = []
port_name_list = c_char_p_p_to_list(jacklib.get_ports(jack.client, "", "", 0))

h = 0
for i in range(len(port_name_list)):
if (port_name_list[i-h].split(":")[0] == a2j_client_name):
port_name = port_name_list.pop(i-h)
a2j_name_list.append(port_name)
h += 1

for a2j_name in a2j_name_list:
port_name_list.append(a2j_name)

del a2j_name_list

import hashlib

# Add ports
for port_name in port_name_list:
port_ptr = jacklib.port_by_name(jack.client, port_name)
self.canvas_add_port(port_ptr, port_name)

# Add connections
for port_name in port_name_list:
port_ptr = jacklib.port_by_name(jack.client, port_name)

# Only make connections from an output port
if (jacklib.port_flags(port_ptr) & jacklib.JackPortIsInput):
continue

port_connection_names = c_char_p_p_to_list(jacklib.port_get_all_connections(jack.client, port_ptr))

for port_con_name in port_connection_names:
port_con_ptr = jacklib.port_by_name(jack.client, port_con_name)
self.canvas_connect_ports(port_name, port_con_name)

def canvas_add_group(self, group_name):
group_id = self.m_last_group_id
patchcanvas.addGroup(group_id, group_name)

group_obj = [None, None]
group_obj[iGroupId] = group_id
group_obj[iGroupName] = group_name

self.m_group_list.append(group_obj)
self.m_last_group_id += 1

return group_id

def canvas_remove_group(self, group_name):
group_id = -1
for group in self.m_group_list:
if (group[iGroupName] == group_name):
group_id = group[iGroupId]
self.m_group_list.remove(group)
break
else:
print("Catia - remove group failed")
return

patchcanvas.removeGroup(group_id)

def canvas_add_port(self, port_ptr, port_name):
port_id = self.m_last_port_id
group_id = -1

# Use the real port_name on m_port_list
port_nameR = port_name

alias_n = self.m_savedSettings["Main/JackPortAlias"]
if (alias_n in (1, 2)):
aliases = jacklib.port_get_aliases(port_ptr)
if (aliases[0] == 2 and alias_n == 2):
port_name = aliases[2]
elif (aliases[0] >= 1 and alias_n == 1):
port_name = aliases[1]

port_flags = jacklib.port_flags(port_ptr)
group_name = port_name.split(":")[0]

if (port_flags & jacklib.JackPortIsInput):
port_mode = patchcanvas.PORT_MODE_INPUT
elif (port_flags & jacklib.JackPortIsOutput):
port_mode = patchcanvas.PORT_MODE_OUTPUT
else:
port_mode = patchcanvas.PORT_MODE_NULL

if (group_name == a2j_client_name):
haveA2J = True
port_name = str(jacklib.port_short_name(port_ptr), encoding="ascii")
port_type = patchcanvas.PORT_TYPE_MIDI_A2J
group_name = port_name.split(" [", 1)[0]
port_short_name = port_name.split("): ", 1)[1]

else:
haveA2J = False
port_short_name = port_name.split(":", 1)[1]

port_type_str = str(jacklib.port_type(port_ptr), encoding="ascii")
if (port_type_str == jacklib.JACK_DEFAULT_AUDIO_TYPE):
port_type = patchcanvas.PORT_TYPE_AUDIO_JACK
elif (port_type_str == jacklib.JACK_DEFAULT_MIDI_TYPE):
port_type = patchcanvas.PORT_TYPE_MIDI_JACK
else:
port_type = patchcanvas.PORT_TYPE_NULL

for group in self.m_group_list:
#if (haveA2J):
#if (" VST" in group_name and group_name[0].isdigit()):
#group_name = group_name.replace(group_name[0], "", 1) # <- TESTING (useful for vsthost/dssi-vst)

#if (group_name.lower() == group[1].lower() or # <- TESTING (useful for LMMS)
#group_name.split(" ")[0].lower() == group[1].split(" ")[0].lower() or # <- TESTING (useful for Renoise and Loomer plugins)
#"vst_"+group_name.rsplit(" ",1)[0].replace(" ","").lower() == group[1] # <- TESTING (useful for vsthost/dssi-vst)
#):
#group_id = group[0]
#break

if (group[iGroupName] == group_name):
group_id = group[iGroupId]
break
else:
# For ports with no group
group_id = self.canvas_add_group(group_name)

patchcanvas.addPort(group_id, port_id, port_short_name, port_mode, port_type)

port_obj = [None, None, None, None]
port_obj[iPortId] = port_id
port_obj[iPortName] = port_name
port_obj[iPortNameR] = port_nameR
port_obj[iPortGroupName] = group_name

self.m_port_list.append(port_obj)
self.m_last_port_id += 1

if (group_id not in self.m_group_split_list and port_flags & jacklib.JackPortIsPhysical):
patchcanvas.splitGroup(group_id)
patchcanvas.setGroupIcon(group_id, patchcanvas.ICON_HARDWARE)
self.m_group_split_list.append(group_id)

return port_id

def canvas_remove_port(self, port_id):
patchcanvas.removePort(port_id)

for port in self.m_port_list:
if (port[iPortId] == port_id):
group_name = port[iPortGroupName]
self.m_port_list.remove(port)
break
else:
return

# Check if group has no more ports; if yes remove it
for port in self.m_port_list:
if (port[iPortGroupName] == group_name):
break
else:
self.canvas_remove_group(group_name)

#def canvas_rename_port(self, port_id, port_name):
#patchcanvas.renamePort(port_id, port_name.split(":")[-1])

def canvas_connect_ports(self, port_out_name, port_in_name):
port_out_id = -1
port_in_id = -1

for port in self.m_port_list:
if (port[iPortNameR] == port_out_name):
port_out_id = port[iPortId]
elif (port[iPortNameR] == port_in_name):
port_in_id = port[iPortId]

if (port_out_id == -1 or port_in_id == -1):
print("Catia - connect ports failed")
return

connection_id = self.m_last_connection_id
patchcanvas.connectPorts(connection_id, port_out_id, port_in_id)

conn_obj = [None, None, None]
conn_obj[iConnId] = connection_id
conn_obj[iConnOutput] = port_out_id
conn_obj[iConnInput] = port_in_id

self.m_connection_list.append(conn_obj)
self.m_last_connection_id += 1

return connection_id

def canvas_disconnect_ports(self, port_out_name, port_in_name):
port_out_id = -1
port_in_id = -1

for port in self.m_port_list:
if (port[iPortNameR] == port_out_name):
port_out_id = port[iPortId]
elif (port[iPortNameR] == port_in_name):
port_in_id = port[iPortId]

if (port_out_id == -1 or port_in_id == -1):
print("Catia - disconnect ports failed")
return

for connection in self.m_connection_list:
if (connection[iConnOutput] == port_out_id and connection[iConnInput] == port_in_id):
patchcanvas.disconnectPorts(connection[iConnId])
self.m_connection_list.remove(connection)
break

def jackStarted(self, autoStop=False):
if (not jack.client):
jack.client = jacklib.client_open("catia", jacklib.JackNoStartServer, None)
if (autoStop and not jack.client):
self.jackStopped()
return

self.act_jack_render.setEnabled(canRender)
self.b_jack_render.setEnabled(canRender)
self.menu_Transport.setEnabled(True)
self.group_transport.setEnabled(True)
self.menuJackServer(True)

if (DBus.jack):
self.cb_sample_rate.setEnabled(True)

self.pb_dsp_load.setValue(0)
self.pb_dsp_load.setMaximum(100)
self.pb_dsp_load.update()

self.init_jack()

def jackStopped(self):
if (haveDBus):
self.DBusReconnect()

if (jack.client):
# client already closed
jack.client = None

self.act_jack_render.setEnabled(False)
self.b_jack_render.setEnabled(False)
self.menu_Transport.setEnabled(False)
self.group_transport.setEnabled(False)
self.menuJackServer(False)

#if (DBus.jack):
#setBufferSize(self, jacksettings.getBufferSize())
#setSampleRate(self, jacksettings.getSampleRate())
#setRealTime(self, jacksettings.isRealtime())
#setXruns(self, -1)
#else:
#self.cb_buffer_size.setEnabled(False)
#self.cb_sample_rate.setEnabled(False)
#self.menu_Jack_Buffer_Size.setEnabled(False)

#if (self.selected_transport_view == TRANSPORT_VIEW_HMS):
#self.label_time.setText("00:00:00")
#elif (self.selected_transport_view == TRANSPORT_VIEW_BBT):
#self.label_time.setText("000|0|0000")
#elif (self.selected_transport_view == TRANSPORT_VIEW_FRAMES):
#self.label_time.setText("000'000'000")

self.pb_dsp_load.setValue(0)
self.pb_dsp_load.setMaximum(0)
self.pb_dsp_load.update()

#if (self.next_sample_rate):
#jack_sample_rate(self, self.next_sample_rate)

patchcanvas.clear()

def a2jStarted(self):
self.menuA2JBridge(True)

def a2jStopped(self):
self.menuA2JBridge(False)

def menuJackServer(self, started):
if (DBus.jack):
self.act_tools_jack_start.setEnabled(not started)
self.act_tools_jack_stop.setEnabled(started)
self.menuA2JBridge(False)

def menuA2JBridge(self, started):
if (DBus.jack and DBus.jack.IsStarted()):
self.act_tools_a2j_start.setEnabled(not started)
self.act_tools_a2j_stop.setEnabled(started)
self.act_tools_a2j_export_hw.setEnabled(not started)
else:
self.act_tools_a2j_start.setEnabled(False)
self.act_tools_a2j_stop.setEnabled(False)

def DBusSignalReceiver(self, *args, **kwds):
if (kwds['interface'] == "org.jackaudio.JackControl"):
if (kwds['member'] == "ServerStarted"):
self.jackStarted()
elif (kwds['member'] == "ServerStopped"):
self.jackStopped()
elif (kwds['interface'] == "org.gna.home.a2jmidid.control"):
if (kwds['member'] == "bridge_started"):
self.a2jStarted()
elif (kwds['member'] == "bridge_stopped"):
self.a2jStopped()

def DBusReconnect(self):
DBus.bus = dbus.SessionBus(mainloop=DBus.loop)
try:
DBus.jack = DBus.bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller")
except:
DBus.jack = None
try:
DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control")
a2j_client_name = DBus.a2j.get_jack_client_name()
except:
DBus.a2j = None
a2j_client_name = None

#def JackBufferSizeCallback(self, buffer_size, arg=None):
#if (DEBUG): print("JackBufferSizeCallback", buffer_size)
#self.emit(SIGNAL("BufferSizeCallback"), buffer_size)
#return 0

#def JackSampleRateCallback(self, sample_rate, arg=None):
#if (DEBUG): print("JackSampleRateCallback", sample_rate)
#self.emit(SIGNAL("SampleRateCallback"), sample_rate)
#return 0

#def JackXRunCallback(self, arg=None):
#if (DEBUG): print("JackXRunCallback", self.xruns+1)
#self.emit(SIGNAL("XRunCallback"))
#return 0

#def JackClientRegistrationCallback(self, client_name, register_yesno, arg=None):
#if (DEBUG): print("JackClientRegistrationCallback", client_name, register_yesno)
#self.emit(SIGNAL("ClientRegistrationCallback"), client_name, register_yesno)
#return 0

def JackPortRegistrationCallback(self, port_id, register_yesno, arg):
if (DEBUG): print("JackPortRegistrationCallback", port_id, register_yesno)
self.emit(SIGNAL("PortRegistrationCallback(int, bool)"), port_id, bool(register_yesno))
return 0

def JackPortConnectCallback(self, port_a, port_b, connect_yesno, arg):
if (DEBUG): print("JackPortConnectCallback", port_a, port_b, connect_yesno)
self.emit(SIGNAL("PortConnectCallback(int, int, bool)"), port_a, port_b, bool(connect_yesno))
return 0

#def JackPortRenameCallback(self, port_id, old_name, new_name, arg=None):
#if (DEBUG): print("JackPortRenameCallback", port_id, old_name, new_name)
#self.emit(SIGNAL("PortRenameCallback"), port_id, old_name, new_name)
#return 0

#def JackShutdownCallback(self, arg=None):
#if (DEBUG): print("JackShutdownCallback")
#self.emit(SIGNAL("ShutdownCallback"))
#return 0

@pyqtSlot()
def slot_JackServerStart(self):
if (DBus.jack):
return DBus.jack.StartServer()
else:
return False

@pyqtSlot()
def slot_JackServerStop(self):
if (DBus.jack):
return DBus.jack.StopServer()
else:
return False

@pyqtSlot()
def slot_A2JBridgeStart(self):
if (DBus.a2j):
return DBus.a2j.start()
else:
return False

@pyqtSlot()
def slot_A2JBridgeStop(self):
if (DBus.a2j):
return DBus.a2j.stop()
else:
return False

@pyqtSlot()
def slot_A2JBridgeExportHW(self):
if (DBus.a2j):
ask = QMessageBox.question(self, self.tr("A2J Hardware Export"), self.tr("Enable Hardware Export on the A2J Bridge?"),
QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel, QMessageBox.No)
if (ask == QMessageBox.Yes):
DBus.a2j.set_hw_export(True)
elif (ask == QMessageBox.No):
DBus.a2j.set_hw_export(False)

#def _BufferSizeCallback(self, buffer_size):
#setBufferSize(self, buffer_size)

#def _SampleRateCallback(self, sample_rate):
#setSampleRate(self, sample_rate)

#def _XRunCallback(self):
#self.xruns += 1
#setXruns(self, self.xruns)

#def _ClientRegistrationCallback(self, client_name, register_yesno):
#if (register_yesno):
#self.canvas_add_group(client_name)
#else:
#self.canvas_remove_group(client_name)

@pyqtSlot(int, bool)
def slot_PortRegistrationCallback(self, port_id_jack, register_yesno):
port_ptr = jacklib.port_by_id(jack.client, port_id_jack)
port_nameR = str(jacklib.port_name(port_ptr), encoding="ascii")

if (register_yesno):
self.canvas_add_port(port_ptr, port_nameR)
else:
for port in self.m_port_list:
if (port[iPortNameR] == port_nameR):
port_id = port[iPortId]
break
else:
return

self.canvas_remove_port(port_id)

@pyqtSlot(int, int, bool)
def slot_PortConnectCallback(self, port_a_jack, port_b_jack, connect_yesno):
port_a_ptr = jacklib.port_by_id(jack.client, port_a_jack)
port_b_ptr = jacklib.port_by_id(jack.client, port_b_jack)
port_a_nameR = str(jacklib.port_name(port_a_ptr), encoding="ascii")
port_b_nameR = str(jacklib.port_name(port_b_ptr), encoding="ascii")

if (connect_yesno):
self.canvas_connect_ports(port_a_nameR, port_b_nameR)
else:
self.canvas_disconnect_ports(port_a_nameR, port_b_nameR)

#def _PortRenameCallback(self, port_id, old_name, new_name):
#self.canvas_rename_port(port_id, new_name)

#def _ShutdownCallback(self):
#self.jackStopped()
#jack.client = None

@pyqtSlot()
def slot_configureCatia(self):
dialog = SettingsW(self, "catia", hasGL)
if (dialog.exec_()):
self.loadSettings(False)
patchcanvas.clear()

p_options = patchcanvas.options_t()
p_options.theme_name = self.m_savedSettings["Canvas/Theme"]
p_options.auto_hide_groups = self.m_savedSettings["Canvas/AutoHideGroups"]
p_options.use_bezier_lines = self.m_savedSettings["Canvas/UseBezierLines"]
p_options.antialiasing = self.m_savedSettings["Canvas/Antialiasing"]
p_options.eyecandy = self.m_savedSettings["Canvas/EyeCandy"]

patchcanvas.setOptions(p_options)
patchcanvas.init(self.scene, self.canvasCallback, DEBUG)

self.init_ports()

@pyqtSlot()
def slot_aboutCatia(self):
QMessageBox.about(self, self.tr("About Catia"), self.tr("<h3>Catia</h3>"
"<br>Version %s"
"<br>Catia is a nice JACK Patchbay with A2J Bridge integration.<br>"
"<br>Copyright (C) 2010-2012 falkTX" % (VERSION)))

def saveSettings(self):
self.settings.setValue("Geometry", self.saveGeometry())
self.settings.setValue("ShowToolbar", self.frame_toolbar.isVisible())
self.settings.setValue("ShowStatusbar", self.frame_statusbar.isVisible())
#self.settings.setValue("TransportView", self.selected_transport_view)

def loadSettings(self, geometry):
if (geometry):
self.restoreGeometry(self.settings.value("Geometry", ""))

show_toolbar = self.settings.value("ShowToolbar", True, type=bool)
self.act_settings_show_toolbar.setChecked(show_toolbar)
self.frame_toolbar.setVisible(show_toolbar)

show_statusbar = self.settings.value("ShowStatusbar", True, type=bool)
self.act_settings_show_statusbar.setChecked(show_statusbar)
self.frame_statusbar.setVisible(show_statusbar)

#transport_set_view(self, self.settings.value("TransportView", TRANSPORT_VIEW_HMS, type=int))

self.m_savedSettings = {
"Main/RefreshInterval": self.settings.value("Main/RefreshInterval", 100, type=int),
"Main/JackPortAlias": self.settings.value("Main/JackPortAlias", 2, type=int),
"Canvas/Theme": self.settings.value("Canvas/Theme", patchcanvas.getDefaultThemeName(), type=str),
"Canvas/AutoHideGroups": self.settings.value("Canvas/AutoHideGroups", False, type=bool),
"Canvas/UseBezierLines": self.settings.value("Canvas/UseBezierLines", True, type=bool),
"Canvas/EyeCandy": self.settings.value("Canvas/EyeCandy", patchcanvas.EYECANDY_SMALL, type=int),
"Canvas/UseOpenGL": self.settings.value("Canvas/UseOpenGL", False, type=bool),
"Canvas/Antialiasing": self.settings.value("Canvas/Antialiasing", patchcanvas.ANTIALIASING_SMALL, type=int),
"Canvas/TextAntialiasing": self.settings.value("Canvas/TextAntialiasing", True, type=bool),
"Canvas/HighQualityAntialiasing": self.settings.value("Canvas/HighQualityAntialiasing", False, type=bool)
}

def closeEvent(self, event):
self.saveSettings()
patchcanvas.clear()
QMainWindow.closeEvent(self, event)

#--------------- main ------------------
if __name__ == '__main__':

# App initialization
app = QApplication(sys.argv)
app.setApplicationName("Catia")
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/catia.svg"))

if (haveDBus):
DBus.loop = DBusQtMainLoop(set_as_default=True)
DBus.bus = dbus.SessionBus(mainloop=DBus.loop)

try:
DBus.jack = DBus.bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller")
jacksettings.initBus(DBus.bus)
except:
DBus.jack = None

try:
DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control")
a2j_client_name = str(DBus.a2j.get_jack_client_name())
except:
DBus.a2j = None
a2j_client_name = None

if (DBus.jack or DBus.a2j):
string = "Catia - using DBus for "
if (DBus.jack):
string += "JACK"
if (DBus.a2j):
string += " and a2jmidid"
elif (DBus.a2j):
string += "a2jmidid"
print(string)

else:
DBus.jack = None
DBus.a2j = None
a2j_client_name = None

# Show GUI
gui = CatiaMainW()

# Set-up custom signal handling
set_up_signals(gui)

gui.show()

# App-Loop
ret = app.exec_()

# Close Jack
if (jack.client):
jacklib.deactivate(jack.client)
jacklib.client_close(jack.client)

# Exit properly
sys.exit(ret)

BIN
src/icons/48x48/catia.png View File

Before After
Width: 48  |  Height: 48  |  Size: 3.1KB

+ 2
- 0
src/icons/icons.qrc View File

@@ -29,6 +29,7 @@
<file>16x16/zoom-out.png</file>

<file>48x48/catarina.png</file>
<file>48x48/catia.png</file>
<file>48x48/canvas.png</file>
<file>48x48/exec.png</file>
<file>48x48/jack.png</file>
@@ -36,6 +37,7 @@
<file>48x48/media-record.png</file>

<file>scalable/catarina.svg</file>
<file>scalable/catia.svg</file>
<file>scalable/jack.svg</file>
<file>scalable/pb_generic.svg</file>
<file>scalable/pb_hardware.svg</file>


+ 435
- 0
src/icons/scalable/catia.svg View File

@@ -0,0 +1,435 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
id="svg6544"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="New document 13">
<defs
id="defs6546">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6187"
id="linearGradient5122"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-233.14282,-417.71428)"
x1="375.71429"
y1="946.64789"
x2="331.42856"
y2="839.50507" />
<linearGradient
id="linearGradient6187">
<stop
style="stop-color:#1a1a1a;stop-opacity:1;"
offset="0"
id="stop6189" />
<stop
style="stop-color:#202020;stop-opacity:1;"
offset="1"
id="stop6191" />
</linearGradient>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter6286-5"
x="-0.13600001"
width="1.272"
y="-0.153"
height="1.306">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.08"
id="feGaussianBlur6288-9" />
</filter>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter6286"
x="-0.13600001"
width="1.272"
y="-0.153"
height="1.306">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.08"
id="feGaussianBlur6288" />
</filter>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter6223"
x="-0.23733346"
width="1.474667"
y="-0.10335481"
height="1.2067096">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.5771384"
id="feGaussianBlur6225" />
</filter>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter6207"
x="-0.23733346"
width="1.474667"
y="-0.10335481"
height="1.2067096">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.5771384"
id="feGaussianBlur6209" />
</filter>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter8786">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="8.96"
id="feGaussianBlur8788" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4657"
id="linearGradient4862"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.83385449,0,0,0.83385449,-12.083733,130.8065)"
x1="241.21584"
y1="795.42145"
x2="-21.002575"
y2="516.61938" />
<linearGradient
id="linearGradient4657">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop4659" />
<stop
id="stop4661"
offset="0.29307336"
style="stop-color:#500000;stop-opacity:1" />
<stop
id="stop4663"
offset="0.80562556"
style="stop-color:#a00000;stop-opacity:1" />
<stop
style="stop-color:#d40000;stop-opacity:1"
offset="1"
id="stop4665" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3902"
id="linearGradient4864"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.83385449,0,0,0.83385449,-12.083733,130.8065)"
x1="320.00772"
y1="662.08124"
x2="-128.07874"
y2="629.75647" />
<linearGradient
id="linearGradient3902">
<stop
style="stop-color:#783c00;stop-opacity:1"
offset="0"
id="stop3904" />
<stop
id="stop3936"
offset="0.07563529"
style="stop-color:#d4a41c;stop-opacity:1" />
<stop
id="stop3934"
offset="0.14044002"
style="stop-color:#743800;stop-opacity:1" />
<stop
id="stop3932"
offset="0.20430526"
style="stop-color:#fcf87c;stop-opacity:1" />
<stop
id="stop3930"
offset="0.26901498"
style="stop-color:#a86c00;stop-opacity:1" />
<stop
id="stop3928"
offset="0.3417097"
style="stop-color:#9c6000;stop-opacity:1" />
<stop
id="stop3926"
offset="0.41261438"
style="stop-color:#fcfc80;stop-opacity:1" />
<stop
id="stop3924"
offset="0.48499879"
style="stop-color:#8c5000;stop-opacity:1" />
<stop
id="stop3922"
offset="0.54586536"
style="stop-color:#fcfc80;stop-opacity:1" />
<stop
id="stop3920"
offset="0.62692177"
style="stop-color:#d09c14;stop-opacity:1" />
<stop
id="stop3918"
offset="0.68774176"
style="stop-color:#804400;stop-opacity:1" />
<stop
id="stop3916"
offset="0.75042593"
style="stop-color:#d0a014;stop-opacity:0.9372549;" />
<stop
id="stop3914"
offset="0.81777459"
style="stop-color:#743800;stop-opacity:1" />
<stop
id="stop3912"
offset="0.87812954"
style="stop-color:#d0a014;stop-opacity:0.74901961;" />
<stop
id="stop3910"
offset="0.94099933"
style="stop-color:#743800;stop-opacity:1" />
<stop
style="stop-color:#fcfc80;stop-opacity:1"
offset="1"
id="stop3906" />
</linearGradient>
<linearGradient
y2="516.61938"
x2="-21.002575"
y1="795.42145"
x1="241.21584"
gradientTransform="matrix(0.83385449,0,0,0.83385449,-12.083733,130.8065)"
gradientUnits="userSpaceOnUse"
id="linearGradient6540"
xlink:href="#linearGradient4657"
inkscape:collect="always" />
<linearGradient
y2="629.75647"
x2="-128.07874"
y1="662.08124"
x1="320.00772"
gradientTransform="matrix(0.83385449,0,0,0.83385449,-12.083733,130.8065)"
gradientUnits="userSpaceOnUse"
id="linearGradient6542"
xlink:href="#linearGradient3902"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="320.14286"
inkscape:cy="102.28571"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="483"
inkscape:window-height="423"
inkscape:window-x="877"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata6549">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-54.857141,-378.6479)">
<g
style="display:inline"
id="g8790"
transform="translate(117.44741,-152.65313)"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967">
<rect
transform="matrix(0.83385449,0,0,0.83385449,-10.399092,130.80653)"
ry="32"
rx="32"
y="505.79703"
x="-37.086269"
height="256"
width="256"
id="rect3756-4-1-0"
style="opacity:0.93280634;fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter8786)" />
<rect
ry="26.683344"
rx="26.683344"
y="552.56763"
x="-41.323643"
height="213.46675"
width="213.46675"
id="rect3756-4-1"
style="fill:url(#linearGradient6540);fill-opacity:1;stroke:url(#linearGradient6542);stroke-width:6.67083597;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
</g>
<rect
style="opacity:0.79000005;color:#000000;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:3.71435571;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6207);enable-background:accumulate"
id="rect26451-6"
width="46.285645"
height="106.28564"
x="98.714378"
y="421.5051"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967" />
<rect
style="opacity:0.79000005;color:#000000;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:3.71435571;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6223);enable-background:accumulate"
id="rect26451-2-7"
width="46.285645"
height="106.28564"
x="218.71432"
y="485.54062"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967" />
<g
style="display:inline"
id="g6296"
transform="translate(-233.14282,-413.71428)"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6227"
d="m 375.99999,860.36218 c 34.50466,0 43.13083,64 77.63549,64"
style="fill:none;stroke:#3f5a7e;stroke-width:4.15359259;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
transform="matrix(1.0782707,0,0,1,-29.429791,0)"
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6227-0"
d="m 376,860.36218 c 32,0 40,64 72,64"
style="opacity:0.74703555;fill:none;stroke:#cccccc;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter6286)" />
</g>
<g
transform="translate(-232.78786,-359.27522)"
style="display:inline"
id="g6296-4"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6227-8"
d="m 375.99999,860.36218 c 34.50466,0 43.13083,64 77.63549,64"
style="fill:none;stroke:#3f5a7e;stroke-width:4.15359259;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
transform="matrix(1.0782707,0,0,1,-29.429791,0)"
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6227-0-4"
d="m 376,860.36218 c 32,0 40,64 72,64"
style="opacity:0.74703555;fill:none;stroke:#cccccc;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter6286-5)" />
</g>
<rect
style="color:#000000;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:3.71435571;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect26451-2"
width="46.285645"
height="106.28564"
x="218.71432"
y="485.54062"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967" />
<rect
style="color:#000000;fill:url(#linearGradient5122);fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:3.71435571;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect26451"
width="46.285645"
height="106.28564"
x="98.714378"
y="421.5051"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967" />
<g
style="display:inline"
id="g6156"
transform="translate(-233.14282,-413.02378)"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967">
<path
inkscape:connector-curvature="0"
id="rect4969"
d="m 357.12454,852.99332 -7.49485,7.49488 7.49485,7.49485 18.62473,0 0,-14.98973 -18.62473,0 z"
style="color:#000000;fill:#385680;fill-opacity:1;fill-rule:evenodd;stroke:#677b94;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
id="rect4969-7"
d="m 357.12454,907.3603 -7.49485,7.49488 7.49485,7.49485 18.62473,0 0,-14.98973 -18.62473,0 z"
style="color:#000000;fill:#385680;fill-opacity:1;fill-rule:evenodd;stroke:#677b94;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
<text
xml:space="preserve"
style="font-size:13.28867149px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="105.98605"
y="479.4852"
id="text6152"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967"><tspan
sodipodi:role="line"
id="tspan6154"
x="105.98605"
y="479.4852">OUT</tspan></text>
<path
style="color:#000000;fill:#385680;fill-opacity:1;fill-rule:evenodd;stroke:#677b94;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 239.61771,504.00505 7.4948,7.49488 -7.4948,7.49485 -18.6248,0 0,-14.98973 18.6248,0 z"
id="rect4969-6"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:#385680;fill-opacity:1;fill-rule:evenodd;stroke:#677b94;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 239.61771,558.37203 7.4948,7.49488 -7.4948,7.49485 -18.6248,0 0,-14.98973 18.6248,0 z"
id="rect4969-7-3"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-size:13.28867149px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="233.81784"
y="543.52716"
id="text6152-9"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/pj/Documents/svg/path10192-9.png"
inkscape:export-xdpi="89.989967"
inkscape:export-ydpi="89.989967"><tspan
sodipodi:role="line"
id="tspan6205"
x="233.81784"
y="543.52716">IN</tspan></text>
</g>
</svg>

+ 2
- 2
src/jacklib.py View File

@@ -546,13 +546,13 @@ def port_get_aliases(port):
# Instead, aliases will be passed in return value, in form of (int ret, str alias1, str alias2)
name_size = port_name_size()
alias_type = c_char_p*2
aliases = alias_type(" "*name_size, " "*name_size)
aliases = alias_type(" ".encode("ascii")*name_size, " ".encode("ascii")*name_size)

jacklib.jack_port_get_aliases.argtypes = [POINTER(jack_port_t), POINTER(ARRAY(c_char_p, 2))]
jacklib.jack_port_get_aliases.restype = c_int

ret = jacklib.jack_port_get_aliases(port, pointer(aliases))
return (ret, aliases[0], aliases[1])
return (ret, str(aliases[0], encoding="ascii"), str(aliases[1], encoding="ascii"))

def port_request_monitor(port, onoff):
jacklib.jack_port_request_monitor.argtypes = [POINTER(jack_port_t), c_int]


+ 88
- 0
src/shared_jack.py View File

@@ -0,0 +1,88 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Common/Shared code related to JACK
# Copyright (C) 2012 Filipe Coelho <falktx@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For a full copy of the GNU General Public License see the COPYING file

# Imports (Global)
from PyQt4.QtCore import QTimer
from PyQt4.QtGui import QCursor, QFontMetrics, QMenu

# Imports (Custom Stuff)
import jacksettings, logs, render
from shared import *
from jacklib_helpers import *

# Have JACK2 ?
try:
jacklib.get_version_string()
JACK2 = True
except:
JACK2 = False

# Can Render ?
for iPATH in PATH:
if (os.path.exists(os.path.join(iPATH, "jack_capture"))):
canRender = True
break
else:
canRender = False

# Variables
TRANSPORT_VIEW_HMS = 0
TRANSPORT_VIEW_BBT = 1
TRANSPORT_VIEW_FRAMES = 2

buffer_sizes = (16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)
sample_rates = (22050, 32000, 44100, 48000, 88200, 96000, 192000)

# DBus object
class DBusObject(object):
__slots__ = [
'loop',
'bus',
'a2j',
'jack',
'ladish_control',
'ladish_studio',
'ladish_room',
'ladish_graph',
'ladish_app_iface',
'ladish_app_daemon',
'patchbay'
]
DBus = DBusObject()

# Jack object
class JackObject(object):
__slots__ = [
'client'
]
jack = JackObject()

# Init objects
DBus.loop = None
DBus.bus = None
DBus.a2j = None
DBus.jack = None
DBus.ladish_control = None
DBus.ladish_studio = None
DBus.ladish_room = None
DBus.ladish_graph = None
DBus.ladish_app_iface = None
DBus.ladish_app_daemon = None
DBus.patchbay = None

jack.client = None

+ 31
- 7
src/shared_settings.py View File

@@ -34,7 +34,21 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW):
QDialog.__init__(self, parent)
self.setupUi(self)

self.ms_AutoHideGroups = bool(appName == "catarina")
# Load app-specific settings
self.ms_AutoHideGroups = True

if (appName == "catarina"):
self.ms_AutoHideGroups = False
self.lw_page.hideRow(0)
self.lw_page.hideRow(2)
self.lw_page.hideRow(3)
self.lw_page.setCurrentCell(1, 0)

elif (appName == "catia"):
self.group_main_paths.setVisible(False)
self.lw_page.hideRow(2)
self.lw_page.hideRow(3)
self.lw_page.setCurrentCell(0, 0)

self.settings = self.parent().settings
self.loadSettings()
@@ -49,13 +63,14 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW):
self.connect(self.buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), SLOT("slot_resetSettings()"))
self.connect(self, SIGNAL("accepted()"), SLOT("slot_saveSettings()"))

def hideRow(self, row):
self.lw_page.hideRow(row)

def setCurrentRow(self, row):
self.lw_page.setCurrentCell(row, 0)

def loadSettings(self):
# ------------------------
# Page 0
self.sb_gui_refresh.setValue(self.settings.value("Main/RefreshInterval", 120, type=int))
self.cb_jack_port_alias.setCurrentIndex(self.settings.value("Main/JackPortAlias", 2, type=int))

# ------------------------
# Page 1
self.cb_canvas_hide_groups.setChecked(self.settings.value("Canvas/AutoHideGroups", self.ms_AutoHideGroups, type=bool))
self.cb_canvas_bezier_lines.setChecked(self.settings.value("Canvas/UseBezierLines", True, type=bool))
self.cb_canvas_eyecandy.setCheckState(self.settings.value("Canvas/EyeCandy", CANVAS_EYECANDY_SMALL, type=int))
@@ -74,6 +89,13 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW):

@pyqtSlot()
def slot_saveSettings(self):
# ------------------------
# Page 0
self.settings.setValue("Main/RefreshInterval", self.sb_gui_refresh.value())
self.settings.setValue("Main/JackPortAlias", self.cb_jack_port_alias.currentIndex())

# ------------------------
# Page 1
self.settings.setValue("Canvas/Theme", self.cb_canvas_theme.currentText())
self.settings.setValue("Canvas/AutoHideGroups", self.cb_canvas_hide_groups.isChecked())
self.settings.setValue("Canvas/UseBezierLines", self.cb_canvas_bezier_lines.isChecked())
@@ -87,6 +109,8 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW):

@pyqtSlot()
def slot_resetSettings(self):
self.sb_gui_refresh.setValue(120)
self.cb_jack_port_alias.setCurrentIndex(1)
self.cb_canvas_theme.setCurrentIndex(0)
self.cb_canvas_hide_groups.setChecked(self.ms_AutoHideGroups)
self.cb_canvas_bezier_lines.setChecked(True)


+ 1062
- 0
src/ui/catia.ui
File diff suppressed because it is too large
View File


Loading…
Cancel
Save