@@ -165,7 +165,7 @@ carla_backend: carla_lilv | |||
$(MAKE) -C src/carla-backend | |||
carla_bridge: carla_lilv | |||
$(MAKE) -C src/carla-bridge | |||
# $(MAKE) -C src/carla-bridge | |||
carla_discovery: | |||
$(MAKE) -C src/carla-discovery unix$(_arch_n) NATIVE=1 | |||
@@ -4,3 +4,10 @@ | |||
Cadence is a set of tools useful for audio production. | |||
It's being developed by falkTX, using Python and Qt (and some C++ where needed). | |||
needs: | |||
pyqt4-dev-tools | |||
libqt4-dev | |||
liblo-dev | |||
libgtk2.0-dev | |||
python3-pyqt4 |
@@ -819,4 +819,4 @@ if __name__ == '__main__': | |||
gui.show() | |||
# Exit properly | |||
sys.exit(app.exec_()) | |||
sys.exit(gui.systray.exec_(app)) |
@@ -20,7 +20,7 @@ CARLA_C_FLAGS = $(BASE_FLAGS) $(CFLAGS) | |||
CARLA_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) | |||
CARLA_CXX_FLAGS += $(shell pkg-config --cflags liblo QtCore QtGui) | |||
CARLA_CXX_FLAGS += -DNDEBUG -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT | |||
# CARLA_CXX_FLAGS += -DVESTIGE_HEADER -I../carla-includes/vestige # Comment this line to not use vestige header | |||
CARLA_CXX_FLAGS += -DVESTIGE_HEADER -I../carla-includes/vestige # Comment this line to not use vestige header | |||
CARLA_LD_FLAGS = -shared -ldl -lm -fPIC $(LDFLAGS) | |||
CARLA_LD_FLAGS += $(shell pkg-config --libs liblo QtCore QtGui) | |||
@@ -21,6 +21,8 @@ | |||
// TODO - setMidiProgram() | |||
#ifdef WANT_LINUXSAMPLER | |||
#include "carla_plugin.h" | |||
#include "carla_linuxsampler_includes.h" | |||
@@ -32,8 +34,6 @@ CARLA_BACKEND_START_NAMESPACE | |||
} /* adjust editor indent */ | |||
#endif | |||
#ifdef WANT_LINUXSAMPLER | |||
/*! | |||
* @defgroup CarlaBackendLinuxSamplerPlugin Carla Backend LinuxSampler Plugin | |||
* | |||
@@ -57,8 +57,8 @@ public: | |||
engine_channel = nullptr; | |||
instrument = nullptr; | |||
audioOutputDevice = new AudioOutputDevicePlugin(this); | |||
midiInputDevice = new MidiInputDevicePlugin(sampler); | |||
audioOutputDevice = new LinuxSampler::AudioOutputDevicePlugin(engine_, this); | |||
midiInputDevice = new LinuxSampler::MidiInputDevicePlugin(sampler); | |||
midiInputPort = midiInputDevice->CreateMidiPort(); | |||
m_isGIG = isGIG; | |||
@@ -283,7 +283,7 @@ public: | |||
for (i=0; i < MAX_MIDI_EVENTS && midiEventCount < MAX_MIDI_EVENTS; i++) | |||
{ | |||
if (! extMidiNotes[i].valid) | |||
if (extMidiNotes[i].channel < 0) | |||
break; | |||
if (extMidiNotes[i].velo) | |||
@@ -291,7 +291,7 @@ public: | |||
else | |||
midiInputPort->DispatchNoteOff(extMidiNotes[i].note, extMidiNotes[i].velo, cin_channel, framesOffset); | |||
extMidiNotes[i].valid = false; | |||
extMidiNotes[i].channel = -1; | |||
midiEventCount += 1; | |||
} | |||
@@ -558,8 +558,8 @@ private: | |||
LinuxSampler::InstrumentManager* instrument; | |||
std::vector<LinuxSampler::InstrumentManager::instrument_id_t> instrumentIds; | |||
AudioOutputDevicePlugin* audioOutputDevice; | |||
MidiInputDevicePlugin* midiInputDevice; | |||
LinuxSampler::AudioOutputDevicePlugin* audioOutputDevice; | |||
LinuxSampler::MidiInputDevicePlugin* midiInputDevice; | |||
LinuxSampler::MidiInputPort* midiInputPort; | |||
bool m_isGIG; | |||
@@ -571,7 +571,7 @@ CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const initializer& init, bool i | |||
{ | |||
qDebug("LinuxSamplerPlugin::newLinuxSampler(%p, %s, %s, %s, %s)", init.engine, init.filename, init.name, init.label, bool2str(isGIG)); | |||
short id = init.engine->getNewPluginIndex(); | |||
short id = init.engine->getNewPluginId(); | |||
if (id < 0) | |||
{ | |||
@@ -592,29 +592,37 @@ CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const initializer& init, bool i | |||
return plugin; | |||
} | |||
#endif | |||
CarlaPlugin* CarlaPlugin::newGIG(const initializer& init) | |||
{ | |||
qDebug("CarlaPlugin::newGIG(%p, %s, %s, %s)", init.engine, init.filename, init.name, init.label); | |||
#ifdef WANT_LINUXSAMPLER | |||
return LinuxSamplerPlugin::newLinuxSampler(init, true); | |||
#else | |||
} | |||
CarlaPlugin* CarlaPlugin::newSFZ(const initializer& init) | |||
{ | |||
qDebug("CarlaPlugin::newSFZ(%p, %s, %s, %s)", init.engine, init.filename, init.name, init.label); | |||
return LinuxSamplerPlugin::newLinuxSampler(init, false); | |||
} | |||
#else // WANT_LINUXSAMPLER | |||
#include "carla_plugin.h" | |||
CARLA_BACKEND_START_NAMESPACE | |||
CarlaPlugin* CarlaPlugin::newGIG(const initializer& init) | |||
{ | |||
qDebug("CarlaPlugin::newGIG(%p, %s, %s, %s)", init.engine, init.filename, init.name, init.label); | |||
setLastError("linuxsampler support not available"); | |||
return nullptr; | |||
#endif | |||
} | |||
CarlaPlugin* CarlaPlugin::newSFZ(const initializer& init) | |||
{ | |||
qDebug("CarlaPlugin::newSFZ(%p, %s, %s, %s)", init.engine, init.filename, init.name, init.label); | |||
#ifdef WANT_LINUXSAMPLER | |||
return LinuxSamplerPlugin::newLinuxSampler(init, false); | |||
#else | |||
setLastError("linuxsampler support not available"); | |||
return nullptr; | |||
#endif | |||
} | |||
#endif | |||
/**@}*/ | |||
@@ -3,8 +3,8 @@ | |||
QT = core gui | |||
CONFIG = debug link_pkgconfig qt warn_on plugin shared | |||
PKGCONFIG = jack liblo fluidsynth alsa libpulse-simple | |||
# linuxsampler suil-0 | |||
PKGCONFIG = jack liblo fluidsynth linuxsampler alsa libpulse-simple | |||
# suil-0 | |||
TARGET = carla_backend | |||
TEMPLATE = app | |||
@@ -52,7 +52,7 @@ INCLUDEPATH = .. \ | |||
#DEFINES += HAVE_SUIL | |||
DEFINES += WANT_FLUIDSYNTH | |||
#DEFINES += WANT_LINUXSAMPLER | |||
DEFINES += WANT_LINUXSAMPLER | |||
DEFINES += CARLA_ENGINE_JACK | |||
#DEFINES += CARLA_ENGINE_RTAUDIO | |||
DEFINES += QTCREATOR_TEST | |||
@@ -17,7 +17,6 @@ | |||
#include "carla_includes.h" | |||
#include "carla_lib_includes.h" | |||
#include "carla_vst_includes.h" | |||
#include <cmath> | |||
#include <cstdint> | |||
@@ -29,9 +28,11 @@ | |||
#include <QtCore/QFileInfo> | |||
#include <QtCore/QUrl> | |||
#include "ladspa/ladspa.h" | |||
#include "carla_ladspa_includes.h" | |||
#include "carla_lv2_includes.h" | |||
#include "carla_vst_includes.h" | |||
#include "dssi/dssi.h" | |||
#include "lv2_rdf.h" | |||
#ifdef BUILD_NATIVE | |||
# ifdef WANT_FLUIDSYNTH | |||
@@ -40,21 +41,21 @@ | |||
# warning fluidsynth not available (no SF2 support) | |||
# endif | |||
# ifdef WANT_LINUXSAMPLER | |||
# include "linuxsampler/EngineFactory.h" | |||
# define BUILD_BRIDGE // FIXME | |||
# include "carla_linuxsampler_includes.h" | |||
# undef BUILD_BRIDGE | |||
# else | |||
# warning linuxsampler not available (no GIG and SFZ support) | |||
# endif | |||
#endif | |||
#define CARLA_BACKEND_NO_EXPORTS | |||
#define CARLA_BACKEND_NO_NAMESPACE | |||
#include "carla_backend.h" | |||
#define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | |||
// fake values to test plugins with | |||
const uint32_t bufferSize = 512; | |||
const double sampleRate = 44100.f; | |||
const double sampleRate = 44100.0; | |||
// Since discovery can find multi-architecture binaries, don't print ELF related errors | |||
void print_lib_error(const char* filename) | |||
@@ -64,6 +65,8 @@ void print_lib_error(const char* filename) | |||
DISCOVERY_OUT("error", error); | |||
} | |||
using namespace CarlaBackend; | |||
// ------------------------------ VST Stuff ------------------------------ | |||
intptr_t VstCurrentUniqueId = 0; | |||
@@ -71,7 +74,7 @@ intptr_t VstCurrentUniqueId = 0; | |||
intptr_t VstHostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) | |||
{ | |||
#if DEBUG | |||
qDebug("VstHostCallback(%p, opcode: %s, index: %i, value: " P_INTPTR ", opt: %f", effect, VstOpcode2str(opcode), index, value, opt); | |||
qDebug("VstHostCallback(%p, opcode: %s, index: %i, value: " P_INTPTR ", opt: %f", effect, VstMasterOpcode2str(opcode), index, value, opt); | |||
#endif | |||
switch (opcode) | |||
@@ -177,7 +180,7 @@ intptr_t VstHostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_ | |||
return kVstLangEnglish; | |||
default: | |||
qDebug("VstHostCallback(%p, opcode: %s, index: %i, value: " P_INTPTR ", opt: %f", effect, VstOpcode2str(opcode), index, value, opt); | |||
qDebug("VstHostCallback(%p, opcode: %s, index: %i, value: " P_INTPTR ", opt: %f", effect, VstMasterOpcode2str(opcode), index, value, opt); | |||
break; | |||
} | |||
@@ -25,19 +25,66 @@ | |||
#if VESTIGE_HEADER | |||
#warning Using vestige header | |||
#define audioMasterGetOutputSpeakerArrangement audioMasterGetSpeakerArrangement | |||
#define effFlagsProgramChunks (1 << 5) | |||
#define effSetProgramName 4 | |||
#define effGetParamLabel 6 | |||
#define effGetParamDisplay 7 | |||
#define effGetVu 9 | |||
#define effEditDraw 16 | |||
#define effEditMouse 17 | |||
#define effEditKey 18 | |||
#define effEditSleep 21 | |||
#define effIdentify 22 | |||
#define effGetChunk 23 | |||
#define effSetChunk 24 | |||
#define effCanBeAutomated 26 | |||
#define effString2Parameter 27 | |||
#define effGetNumProgramCategories 28 | |||
#define effGetProgramNameIndexed 29 | |||
#define effCopyProgram 30 | |||
#define effConnectInput 31 | |||
#define effConnectOutput 32 | |||
#define effGetInputProperties 33 | |||
#define effGetOutputProperties 34 | |||
#define effGetPlugCategory 35 | |||
#define effGetCurrentPosition 36 | |||
#define effGetDestinationBuffer 37 | |||
#define effOfflineNotify 38 | |||
#define effOfflinePrepare 39 | |||
#define effOfflineRun 40 | |||
#define effProcessVarIo 41 | |||
#define effSetSpeakerArrangement 42 | |||
#define effSetBlockSizeAndSampleRate 43 | |||
#define effSetBypass 44 | |||
#define effGetErrorText 46 | |||
#define effVendorSpecific 50 | |||
#define effGetTailSize 52 | |||
#define effIdle 53 | |||
#define effGetIcon 54 | |||
#define effSetViewPosition 55 | |||
#define effKeysRequired 57 | |||
#define effEditKeyDown 59 | |||
#define effEditKeyUp 60 | |||
#define effSetEditKnobMode 61 | |||
#define effGetMidiProgramName 62 | |||
#define effGetCurrentMidiProgram 63 | |||
#define effGetMidiProgramCategory 64 | |||
#define effHasMidiProgramsChanged 65 | |||
#define effGetMidiKeyName 66 | |||
#define effBeginSetProgram 67 | |||
#define effEndSetProgram 68 | |||
#define effGetSpeakerArrangement 69 | |||
#define effShellGetNextPlugin 70 | |||
#define effStartProcess 71 | |||
#define effStopProcess 72 | |||
#define effSetTotalSampleToProcess 73 | |||
#define effSetPanLaw 74 | |||
#define effBeginLoadBank 75 | |||
#define effBeginLoadProgram 76 | |||
#define effSetProcessPrecision 77 | |||
#define effGetNumMidiInputChannels 78 | |||
#define effGetNumMidiOutputChannels 79 | |||
#define kPlugCategSynth 2 | |||
#define kPlugCategAnalysis 3 | |||
#define kPlugCategMastering 4 | |||
@@ -52,7 +99,6 @@ | |||
#define kVstProcessPrecision32 0 | |||
#define kVstTransportChanged 1 | |||
#define kVstVersion 2400 | |||
//#define audioMasterGetOutputSpeakerArrangement audioMasterGetSpeakerArrangement | |||
struct ERect { | |||
short top, left, bottom, right; | |||
}; | |||
@@ -332,11 +378,7 @@ const char* VstMasterOpcode2str(const int32_t opcode) | |||
#if ! VST_FORCE_DEPRECATED | |||
case audioMasterSetOutputSampleRate: | |||
return "audioMasterSetOutputSampleRate"; | |||
#ifdef VESTIGE_HEADER | |||
case audioMasterGetSpeakerArrangement: | |||
#else | |||
case audioMasterGetOutputSpeakerArrangement: | |||
#endif | |||
return "audioMasterGetOutputSpeakerArrangement"; | |||
#endif | |||
case audioMasterGetVendorString: | |||
@@ -3430,7 +3430,8 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||
if event.timerId() == self.TIMER_GUI_STUFF: | |||
for pwidget in self.m_plugin_list: | |||
if pwidget: pwidget.check_gui_stuff() | |||
CarlaHost.idle_guis() | |||
if CarlaHost.is_engine_running(): | |||
CarlaHost.idle_guis() | |||
elif event.timerId() == self.TIMER_GUI_STUFF2: | |||
for pwidget in self.m_plugin_list: | |||
if pwidget: pwidget.check_gui_stuff2() | |||
@@ -3514,8 +3515,15 @@ if __name__ == '__main__': | |||
if carla_bridge_vst_x11: | |||
CarlaHost.set_option(OPTION_PATH_BRIDGE_VST_X11, 0, carla_bridge_vst_x11) | |||
# TEST | |||
#count = CarlaHost.get_engine_driver_count() | |||
#print(count) | |||
#for i in range(0, count): | |||
#dname = cString(CarlaHost.get_engine_driver_name(i)) | |||
#print("%i - %s" % (i, dname)) | |||
if not CarlaHost.engine_init("JACK", "Carla"): | |||
CustomMessageBox(None, QMessageBox.Critical, "Error", "Could not connect to JACK", | |||
CustomMessageBox(None, QMessageBox.Critical, "Error", "Could not connect to Audio backend, possible reasons:", | |||
cString(CarlaHost.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) | |||
sys.exit(1) | |||
@@ -779,6 +779,8 @@ class Host(object): | |||
if lib_prefix_arg: | |||
carla_library_path = os.path.join(lib_prefix_arg, "lib", "carla", carla_libname) | |||
print("Host() - using carla-backend library '%s'" % carla_library_path) | |||
self.lib = cdll.LoadLibrary(carla_library_path) | |||
self.lib.get_engine_driver_count.argtypes = None | |||
@@ -1309,8 +1309,9 @@ if __name__ == '__main__': | |||
else: | |||
DBus.jack = None | |||
DBus.a2j = None | |||
DBus.a2j = None | |||
a2j_client_name = None | |||
print("Not using DBus") | |||
# Show GUI | |||
gui = CatiaMainW() | |||
@@ -17,8 +17,6 @@ | |||
# For a full copy of the GNU General Public License see the COPYING file | |||
# Imports (Global) | |||
import dbus | |||
from dbus.mainloop.qt import DBusQtMainLoop | |||
from time import ctime | |||
from PyQt4.QtCore import QPointF, QSettings | |||
from PyQt4.QtGui import QAction, QApplication, QMainWindow, QVBoxLayout, QTableWidgetItem, QTreeWidgetItem | |||
@@ -40,6 +38,13 @@ try: | |||
except: | |||
hasGL = False | |||
try: | |||
import dbus | |||
from dbus.mainloop.qt import DBusQtMainLoop | |||
haveDBus = True | |||
except: | |||
haveDBus = False | |||
# NOTE - set to true when supported | |||
USE_CLAUDIA_ADD_NEW = True | |||
@@ -2485,6 +2490,11 @@ if __name__ == '__main__': | |||
app.setOrganizationName("Cadence") | |||
app.setWindowIcon(QIcon(":/scalable/claudia.svg")) | |||
if not haveDBus: | |||
QMessageBox.critical(None, app.translate("ClaudiaMainW", "Error"), app.translate("ClaudiaMainW", | |||
"DBus is not available, Claudia cannot start without it!")) | |||
sys.exit(1) | |||
DBus.loop = DBusQtMainLoop(set_as_default=True) | |||
DBus.bus = dbus.SessionBus(mainloop=DBus.loop) | |||
DBus.jack = DBus.bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller") | |||
@@ -139,7 +139,7 @@ if __name__ == '__main__': | |||
# JACK initialization | |||
jack_status = jacklib.jack_status_t(0) | |||
client = jacklib.client_open("M", jacklib.JackSessionID, jacklib.pointer(jack_status)) | |||
client = jacklib.client_open("M", jacklib.JackNoStartServer|jacklib.JackSessionID, jacklib.pointer(jack_status)) | |||
if not client: | |||
errorString = get_jack_status_error_string(jack_status) | |||
@@ -56,9 +56,10 @@ class PixmapDial(QDial): | |||
if self.palette().window().color().lightness() > 100: | |||
# Light background | |||
self.m_color1 = QColor(100, 100, 100, 255) | |||
self.m_color2 = QColor(0, 0, 0, 0) | |||
self.m_colorT = [self.palette().text().color(), self.palette().mid().color()] | |||
c = self.palette().dark().color() | |||
self.m_color1 = c | |||
self.m_color2 = QColor(c.red(), c.green(), c.blue(), 0) | |||
self.m_colorT = [self.palette().buttonText().color(), self.palette().mid().color()] | |||
else: | |||
# Dark background | |||
self.m_color1 = QColor(0, 0, 0, 255) | |||
@@ -99,6 +99,7 @@ class PixmapKeyboard(QWidget): | |||
self.m_font = QFont("Monospace", 8, QFont.Normal) | |||
self.m_pixmap = QPixmap("") | |||
self.setCursor(Qt.PointingHandCursor) | |||
self.setMode(self.HORIZONTAL) | |||
def sendNoteOn(self, note, sendSignal=True): | |||
@@ -17,17 +17,41 @@ | |||
# For a full copy of the GNU General Public License see the COPYING file | |||
# Imports (Global) | |||
from os import getenv | |||
import os, sys | |||
from PyQt4.QtCore import SIGNAL | |||
from PyQt4.QtGui import QAction, QIcon, QMenu, QSystemTrayIcon | |||
try: | |||
if getenv("DESKTOP_SESSION") in ("ubuntu", "ubuntu-2d") and not os.path.exists("/var/kxstudio/no_appindicators"): | |||
from gi.repository import AppIndicator3, Gtk | |||
if os.getenv("DESKTOP_SESSION") in ("ubuntu", "ubuntu-2d") and not os.path.exists("/var/cadence/no_appindicators"): | |||
# Check current Qt theme. If Gtk+, use Gtk2 AppIndicator | |||
style = None | |||
if len(sys.argv) > 2 and "-style" in sys.argv: | |||
i = sys.argv.index("-style") | |||
if i < len(sys.argv): | |||
style = sys.argv[i+1] | |||
check_cmd = "python3 -c 'import sys; from PyQt4.QtGui import QApplication; app = QApplication(sys.argv); print(app.style().objectName())'" | |||
if style: | |||
check_cmd += " -style " | |||
check_cmd += style | |||
from subprocess import getoutput | |||
needsGtk2 = bool(getoutput(check_cmd).strip().lower() in ("gtk", "gtk+")) | |||
if needsGtk2: | |||
from gi import pygtkcompat | |||
pygtkcompat.enable() | |||
pygtkcompat.enable_gtk(version="2.0") | |||
from gi.repository import Gtk, AppIndicator | |||
else: | |||
from gi.repository import Gtk, AppIndicator3 as AppIndicator | |||
TrayEngine = "AppIndicator" | |||
elif getenv("KDE_FULL_SESSION"): | |||
from PyKDE4.kdeui import KAction, KIcon, KMenu, KStatusNotifierItem | |||
TrayEngine = "KDE" | |||
else: | |||
TrayEngine = "Qt" | |||
except: | |||
@@ -80,7 +104,7 @@ class GlobalSysTray(object): | |||
elif TrayEngine == "AppIndicator": | |||
self.menu = Gtk.Menu() | |||
self.tray = AppIndicator3.Indicator.new(name, icon, AppIndicator3.IndicatorCategory.APPLICATION_STATUS) | |||
self.tray = AppIndicator.Indicator.new(name, icon, AppIndicator.IndicatorCategory.APPLICATION_STATUS) | |||
self.tray.set_menu(self.menu) | |||
# Double-click is not possible with App-Indicators | |||
@@ -484,7 +508,7 @@ class GlobalSysTray(object): | |||
if TrayEngine == "KDE": | |||
self.tray.setStatus(KStatusNotifierItem.Active) | |||
elif TrayEngine == "AppIndicator": | |||
self.tray.set_status(AppIndicator3.IndicatorStatus.ACTIVE) | |||
self.tray.set_status(AppIndicator.IndicatorStatus.ACTIVE) | |||
elif TrayEngine == "Qt": | |||
self.tray.show() | |||
@@ -492,7 +516,7 @@ class GlobalSysTray(object): | |||
if TrayEngine == "KDE": | |||
self.tray.setStatus(KStatusNotifierItem.Passive) | |||
elif TrayEngine == "AppIndicator": | |||
self.tray.set_status(AppIndicator3.IndicatorStatus.PASSIVE) | |||
self.tray.set_status(AppIndicator.IndicatorStatus.PASSIVE) | |||
elif TrayEngine == "Qt": | |||
self.tray.hide() | |||
@@ -217,6 +217,7 @@ | |||
<height>64</height> | |||
</size> | |||
</property> | |||
<layout class="QHBoxLayout" name="horizontalLayout_4"/> | |||
</widget> | |||
</item> | |||
</layout> | |||
@@ -231,7 +232,7 @@ | |||
<x>0</x> | |||
<y>0</y> | |||
<width>588</width> | |||
<height>21</height> | |||
<height>20</height> | |||
</rect> | |||
</property> | |||
<widget class="QMenu" name="menu_File"> | |||
@@ -206,6 +206,7 @@ class XYGraphicsScene(QGraphicsScene): | |||
def mousePressEvent(self, event): | |||
self.m_mouseLock = True | |||
self.handleMousePos(event.scenePos()) | |||
self.parent().setCursor(Qt.CrossCursor) | |||
QGraphicsScene.mousePressEvent(self, event) | |||
def mouseMoveEvent(self, event): | |||
@@ -214,6 +215,7 @@ class XYGraphicsScene(QGraphicsScene): | |||
def mouseReleaseEvent(self, event): | |||
self.m_mouseLock = False | |||
self.parent().setCursor(Qt.ArrowCursor) | |||
QGraphicsScene.mouseReleaseEvent(self, event) | |||
# XY Controller Window | |||
@@ -605,7 +607,7 @@ if __name__ == '__main__': | |||
# Start jack | |||
jack_status = jacklib.jack_status_t(0) | |||
jack_client = jacklib.client_open("XY-Controller", jacklib.JackSessionID, jacklib.pointer(jack_status)) | |||
jack_client = jacklib.client_open("XY-Controller", jacklib.JackNoStartServer|jacklib.JackSessionID, jacklib.pointer(jack_status)) | |||
if not jack_client: | |||
errorString = get_jack_status_error_string(jack_status) | |||