Browse Source

More python code split, tweak plugin-edit window

tags/1.9.4
falkTX 11 years ago
parent
commit
f08a11f4f8
9 changed files with 923 additions and 668 deletions
  1. +0
    -78
      resources/ui/carla_driver.ui
  2. +531
    -308
      resources/ui/carla_edit.ui
  3. +13
    -157
      source/carla-mini
  4. +0
    -57
      source/carla.py
  5. +327
    -0
      source/carla_host.py
  6. +2
    -2
      source/carla_patchbay.py
  7. +0
    -15
      source/carla_rack.py
  8. +5
    -5
      source/carla_settings.py
  9. +45
    -46
      source/carla_widgets.py

+ 0
- 78
resources/ui/carla_driver.ui View File

@@ -1,78 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QComboBox" name="comboBox">
<property name="geometry">
<rect>
<x>210</x>
<y>30</y>
<width>64</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QComboBox" name="comboBox_2">
<property name="geometry">
<rect>
<x>210</x>
<y>70</y>
<width>64</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>90</x>
<y>30</y>
<width>111</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Preferred buffer size:</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>90</x>
<y>80</y>
<width>111</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Preferred sample rate:</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>150</x>
<y>110</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>Show Control Panel</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

+ 531
- 308
resources/ui/carla_edit.ui View File

@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>467</width>
<height>461</height>
<width>592</width>
<height>494</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -26,164 +26,28 @@
<attribute name="title"> <attribute name="title">
<string>Edit</string> <string>Edit</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="2">
<widget class="QGroupBox" name="groupBox">
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title"> <property name="title">
<string>Settings</string>
<string>Control?</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="ch_force_stereo">
<property name="text">
<string>Force stereo (needs restart)</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="ch_fixed_buffer">
<property name="text">
<string>Fixed-size buffer</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="ch_send_control_changes">
<property name="text">
<string>Send Control Changes</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="ch_send_channel_pressure">
<property name="text">
<string>Send Channel Pressure</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QCheckBox" name="ch_send_all_sound_off">
<property name="text">
<string>Send All Sound/Notes Off</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="ch_map_program_changes">
<property name="text">
<string>Map Program changes</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="ch_use_chunks">
<property name="text">
<string>Use Chunks</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<widget class="QCheckBox" name="ch_send_pitchbend">
<property name="text">
<string>Send Pitchbend</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="ch_send_note_aftertouch">
<property name="text">
<string>Send Note Aftertouch</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_plugin">
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>
Plugin Name
</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="b_save_state">
<property name="text">
<string>Save State</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/document-save.png</normaloff>:/16x16/document-save.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_load_state">
<property name="text">
<string>Load State</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Setup</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<layout class="QVBoxLayout" name="verticalLayout_5">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<widget class="QLabel" name="label_ctrl_channel"> <widget class="QLabel" name="label_ctrl_channel">
<property name="text"> <property name="text">
@@ -229,96 +93,20 @@ Plugin Name
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QStackedWidget" name="tab_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_programs_2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Program:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_programs"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_midiPrograms">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property> </property>
<property name="bottomMargin">
<number>0</number>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>10</height>
</size>
</property> </property>
<item>
<widget class="QLabel" name="label_midi_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>MIDI Program:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_midi_programs"/>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="spacing">
<number>0</number>
</property>
</spacer>
</item>
<item> <item>
<widget class="PixmapDial" name="dial_vol"> <widget class="PixmapDial" name="dial_vol">
<property name="minimumSize"> <property name="minimumSize">
@@ -377,6 +165,12 @@ Plugin Name
</item> </item>
<item> <item>
<widget class="QStackedWidget" name="stackedWidget"> <widget class="QStackedWidget" name="stackedWidget">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>42</height>
</size>
</property>
<property name="lineWidth"> <property name="lineWidth">
<number>0</number> <number>0</number>
</property> </property>
@@ -388,16 +182,7 @@ Plugin Name
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@@ -469,16 +254,7 @@ Plugin Name
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@@ -521,24 +297,14 @@ Plugin Name
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<widget class="QRadioButton" name="radioButton"> <widget class="QRadioButton" name="radioButton">
<property name="text"> <property name="text">
<string>Use Balance</string> <string>Use Balance</string>
</property> </property>
<property name="checked">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@@ -548,39 +314,504 @@ Plugin Name
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</item> </item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</item> </item>
</layout>
</widget>
</item>
<item row="1" column="1" rowspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QCheckBox" name="ch_use_chunks">
<property name="text">
<string>Use Chunks</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer">
<widget class="Line" name="line_2">
<property name="lineWidth">
<number>0</number>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string> Audio:</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_fixed_buffer">
<property name="text">
<string>Fixed-size buffer</string>
</property> </property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_force_stereo">
<property name="text">
<string>Force stereo (needs restart)</string>
</property> </property>
</spacer>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="lineWidth">
<number>0</number>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string> MIDI:</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_map_program_changes">
<property name="text">
<string>Map Program changes</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_control_changes">
<property name="text">
<string>Send Control Changes</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_channel_pressure">
<property name="text">
<string>Send Channel Pressure</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_note_aftertouch">
<property name="text">
<string>Send Note Aftertouch</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_pitchbend">
<property name="text">
<string>Send Pitchbend</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_all_sound_off">
<property name="text">
<string>Send All Sound/Notes Off</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_plugin">
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>
Plugin Name
</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QPushButton" name="b_save_state">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Save State</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/document-save.png</normaloff>:/16x16/document-save.png</iconset>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="b_load_state">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Load State</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QStackedWidget" name="sw_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="sww_programs">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Program:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_programs">
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="sww_midiPrograms">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_midi_programs">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>MIDI Program:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_midi_programs">
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Information</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="1">
<widget class="QLineEdit" name="le_maker">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Label/URI:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Name:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_name">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="le_label">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="le_type">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="le_copyright">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="le_unique_id">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Type:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Maker:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Copyright:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Unique ID:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
@@ -633,16 +864,7 @@ Plugin Name
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@@ -665,6 +887,7 @@ Plugin Name
<height>64</height> <height>64</height>
</size> </size>
</property> </property>
<zorder>tabWidget</zorder>
</widget> </widget>
</item> </item>
</layout> </layout>


+ 13
- 157
source/carla-mini View File

@@ -20,50 +20,39 @@
# Imports (Global) # Imports (Global)


try: try:
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication
except: except:
from PyQt4.QtGui import QApplication, QMainWindow
from PyQt4.QtCore import QTimer
from PyQt4.QtGui import QApplication


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Imports (Custom Stuff) # Imports (Custom Stuff)


from carla_database import *
from carla_rack import *
from carla_host import *
from carla_rack import CarlaRackW


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Main Window # Main Window


class CarlaMiniW(QMainWindow):
class CarlaMiniW(HostWindow):
def __init__(self, parent=None): def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
HostWindow.__init__(self, parent)
#self.ui = ui_carla.Ui_CarlaMainW() #self.ui = ui_carla.Ui_CarlaMainW()
#self.ui.setupUi(self) #self.ui.setupUi(self)


Carla.host.engine_init("JACK", "Carla") Carla.host.engine_init("JACK", "Carla")


self.fRack = CarlaRackW(self)
self.setCentralWidget(self.fRack)
self.fContainer = CarlaRackW(self)
self.setCentralWidget(self.fContainer)


self.fIdleTimerFast = self.startTimer(50)
self.fIdleTimerSlow = self.startTimer(50*2)
self.init()


QTimer.singleShot(0, self.slot_pluginAdd) QTimer.singleShot(0, self.slot_pluginAdd)


def closeEvent(self, event): def closeEvent(self, event):
self.fIdleTimerFast = 0
self.fIdleTimerSlow = 0
Carla.host.engine_close() Carla.host.engine_close()
QMainWindow.closeEvent(self, event)

def timerEvent(self, event):
if event.timerId() == self.fIdleTimerFast:
Carla.host.engine_idle()
self.fRack.idleFast()

elif event.timerId() == self.fIdleTimerSlow:
self.fRack.idleSlow()

QMainWindow.timerEvent(self, event)
HostWindow.closeEvent(self, event)


@pyqtSlot() @pyqtSlot()
def slot_pluginAdd(self): def slot_pluginAdd(self):
@@ -81,82 +70,7 @@ class CarlaMiniW(QMainWindow):
CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok)
return return


self.fRack.addPlugin(0)

# ------------------------------------------------------------------------------------------------------------

def engineCallback(ptr, action, pluginId, value1, value2, value3, valueStr):
if pluginId < 0 or not Carla.gui:
return

#if action == CALLBACK_DEBUG:
#Carla.gui.emit(SIGNAL("DebugCallback(int, int, int, double, QString)"), pluginId, value1, value2, value3, cString(valueStr))
#elif action == CALLBACK_PLUGIN_ADDED:
#Carla.gui.emit(SIGNAL("PluginAddedCallback(int)"), pluginId)
#elif action == CALLBACK_PLUGIN_REMOVED:
#Carla.gui.emit(SIGNAL("PluginRemovedCallback(int)"), pluginId)
#elif action == CALLBACK_PLUGIN_RENAMED:
#Carla.gui.emit(SIGNAL("PluginRenamedCallback(int, QString)"), pluginId, valueStr)
#elif action == CALLBACK_PARAMETER_VALUE_CHANGED:
#Carla.gui.emit(SIGNAL("ParameterValueChangedCallback(int, int, double)"), pluginId, value1, value3)
#elif action == CALLBACK_PARAMETER_DEFAULT_CHANGED:
#Carla.gui.emit(SIGNAL("ParameterDefaultChangedCallback(int, int, double)"), pluginId, value1, value3)
#elif action == CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
#Carla.gui.emit(SIGNAL("ParameterMidiChannelChangedCallback(int, int, int)"), pluginId, value1, value2)
#elif action == CALLBACK_PARAMETER_MIDI_CC_CHANGED:
#Carla.gui.emit(SIGNAL("ParameterMidiCcChangedCallback(int, int, int)"), pluginId, value1, value2)
#elif action == CALLBACK_PROGRAM_CHANGED:
#Carla.gui.emit(SIGNAL("ProgramChangedCallback(int, int)"), pluginId, value1)
#elif action == CALLBACK_MIDI_PROGRAM_CHANGED:
#Carla.gui.emit(SIGNAL("MidiProgramChangedCallback(int, int)"), pluginId, value1)
#elif action == CALLBACK_NOTE_ON:
#Carla.gui.emit(SIGNAL("NoteOnCallback(int, int, int, int)"), pluginId, value1, value2, value3)
#elif action == CALLBACK_NOTE_OFF:
#Carla.gui.emit(SIGNAL("NoteOffCallback(int, int, int)"), pluginId, value1, value2)
#elif action == CALLBACK_SHOW_GUI:
#Carla.gui.emit(SIGNAL("ShowGuiCallback(int, int)"), pluginId, value1)
#elif action == CALLBACK_UPDATE:
#Carla.gui.emit(SIGNAL("UpdateCallback(int)"), pluginId)
#elif action == CALLBACK_RELOAD_INFO:
#Carla.gui.emit(SIGNAL("ReloadInfoCallback(int)"), pluginId)
#elif action == CALLBACK_RELOAD_PARAMETERS:
#Carla.gui.emit(SIGNAL("ReloadParametersCallback(int)"), pluginId)
#elif action == CALLBACK_RELOAD_PROGRAMS:
#Carla.gui.emit(SIGNAL("ReloadProgramsCallback(int)"), pluginId)
#elif action == CALLBACK_RELOAD_ALL:
#Carla.gui.emit(SIGNAL("ReloadAllCallback(int)"), pluginId)
#elif action == CALLBACK_PATCHBAY_CLIENT_ADDED:
#Carla.gui.emit(SIGNAL("PatchbayClientAddedCallback(int, int, QString)"), value1, value2, cString(valueStr))
#elif action == CALLBACK_PATCHBAY_CLIENT_REMOVED:
#Carla.gui.emit(SIGNAL("PatchbayClientRemovedCallback(int, QString)"), value1, cString(valueStr))
#elif action == CALLBACK_PATCHBAY_CLIENT_RENAMED:
#Carla.gui.emit(SIGNAL("PatchbayClientRenamedCallback(int, QString)"), value1, cString(valueStr))
#elif action == CALLBACK_PATCHBAY_PORT_ADDED:
#Carla.gui.emit(SIGNAL("PatchbayPortAddedCallback(int, int, int, QString)"), value1, value2, int(value3), cString(valueStr))
#elif action == CALLBACK_PATCHBAY_PORT_REMOVED:
#Carla.gui.emit(SIGNAL("PatchbayPortRemovedCallback(int, int, QString)"), value1, value2, cString(valueStr))
#elif action == CALLBACK_PATCHBAY_PORT_RENAMED:
#Carla.gui.emit(SIGNAL("PatchbayPortRenamedCallback(int, int, QString)"), value1, value2, cString(valueStr))
#elif action == CALLBACK_PATCHBAY_CONNECTION_ADDED:
#Carla.gui.emit(SIGNAL("PatchbayConnectionAddedCallback(int, int, int)"), value1, value2, value3)
#elif action == CALLBACK_PATCHBAY_CONNECTION_REMOVED:
#Carla.gui.emit(SIGNAL("PatchbayConnectionRemovedCallback(int)"), value1)
#elif action == CALLBACK_PATCHBAY_ICON_CHANGED:
#Carla.gui.emit(SIGNAL("PatchbayIconChangedCallback(int, int)"), value1, value2)
#elif action == CALLBACK_BUFFER_SIZE_CHANGED:
#Carla.gui.emit(SIGNAL("BufferSizeChangedCallback(int)"), value1)
#elif action == CALLBACK_SAMPLE_RATE_CHANGED:
#Carla.gui.emit(SIGNAL("SampleRateChangedCallback(double)"), value3)
#elif action == CALLBACK_NSM_ANNOUNCE:
#Carla.gui.emit(SIGNAL("NSM_AnnounceCallback(QString)"), cString(valueStr))
#elif action == CALLBACK_NSM_OPEN:
#Carla.gui.emit(SIGNAL("NSM_OpenCallback(QString)"), cString(valueStr))
#elif action == CALLBACK_NSM_SAVE:
#Carla.gui.emit(SIGNAL("NSM_SaveCallback()"))
#elif action == CALLBACK_ERROR:
#Carla.gui.emit(SIGNAL("ErrorCallback(QString)"), cString(valueStr))
#elif action == CALLBACK_QUIT:
#Carla.gui.emit(SIGNAL("QuitCallback()"))
self.fContainer.addPlugin(0)


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# --------------- main ------------------ # --------------- main ------------------
@@ -179,67 +93,9 @@ if __name__ == '__main__':
Carla.host.set_engine_option(OPTION_PROCESS_NAME, 0, "carla") Carla.host.set_engine_option(OPTION_PROCESS_NAME, 0, "carla")
Carla.host.set_engine_option(OPTION_PATH_RESOURCES, 0, libPath) Carla.host.set_engine_option(OPTION_PATH_RESOURCES, 0, libPath)


# Set bridge paths
if carla_bridge_native:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_NATIVE, 0, carla_bridge_native)

if carla_bridge_posix32:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_POSIX32, 0, carla_bridge_posix32)

if carla_bridge_posix64:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_POSIX64, 0, carla_bridge_posix64)

if carla_bridge_win32:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_WIN32, 0, carla_bridge_win32)

if carla_bridge_win64:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_WIN64, 0, carla_bridge_win64)

if carla_bridge_lv2_external:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_EXTERNAL, 0, carla_bridge_lv2_external)

if WINDOWS:
if carla_bridge_lv2_windows:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_WINDOWS, 0, carla_bridge_lv2_windows)

if carla_bridge_vst_hwnd:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_HWND, 0, carla_bridge_vst_hwnd)

elif MACOS:
if carla_bridge_lv2_cocoa:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_COCOA, 0, carla_bridge_lv2_cocoa)

if carla_bridge_vst_mac:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_MAC, 0, carla_bridge_vst_mac)

else:
if carla_bridge_lv2_gtk2:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_GTK2, 0, carla_bridge_lv2_gtk2)

if carla_bridge_lv2_gtk3:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_GTK3, 0, carla_bridge_lv2_gtk3)

if carla_bridge_lv2_qt4:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_QT4, 0, carla_bridge_lv2_qt4)

if carla_bridge_lv2_qt5:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_QT5, 0, carla_bridge_lv2_qt5)

if carla_bridge_lv2_x11:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_X11, 0, carla_bridge_lv2_x11)

if carla_bridge_vst_x11:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_X11, 0, carla_bridge_vst_x11)

# Create GUI and start engine # Create GUI and start engine
Carla.gui = CarlaMiniW() Carla.gui = CarlaMiniW()


# Only now we're ready to handle events
Carla.host.set_engine_callback(engineCallback)

# Set-up custom signal handling
setUpSignals()

# Show GUI # Show GUI
Carla.gui.show() Carla.gui.show()




+ 0
- 57
source/carla.py View File

@@ -116,9 +116,6 @@ class CarlaMainW(QMainWindow):
self.fClientName = "Carla" self.fClientName = "Carla"
self.fSessionManagerName = "LADISH" if LADISH_APP_NAME else "" self.fSessionManagerName = "LADISH" if LADISH_APP_NAME else ""


self.fLadspaRdfNeedsUpdate = True
self.fLadspaRdfList = []

# ------------------------------------------------------------- # -------------------------------------------------------------
# Load Settings # Load Settings


@@ -438,60 +435,6 @@ class CarlaMainW(QMainWindow):


Carla.host.remove_all_plugins() Carla.host.remove_all_plugins()


def getExtraStuff(self, plugin):
ptype = plugin['type']

if ptype == PLUGIN_LADSPA:
uniqueId = plugin['uniqueId']

self.loadRDFs()

for rdfItem in self.fLadspaRdfList:
if rdfItem.UniqueID == uniqueId:
return pointer(rdfItem)

elif ptype == PLUGIN_DSSI:
if plugin['hints'] & PLUGIN_HAS_GUI:
gui = findDSSIGUI(plugin['binary'], plugin['name'], plugin['label'])
if gui:
return gui.encode("utf-8")

elif ptype in (PLUGIN_GIG, PLUGIN_SF2, PLUGIN_SFZ):
if plugin['name'].endswith(" (16 outputs)"):
# return a dummy non-null pointer
INTPOINTER = POINTER(c_int)
ptr = c_int(0x1)
addr = addressof(ptr)
return cast(addr, INTPOINTER)

return c_nullptr

def loadRDFs(self):
if not self.fLadspaRdfNeedsUpdate:
return

self.fLadspaRdfList = []
self.fLadspaRdfNeedsUpdate = False

if not haveLRDF:
return

settingsDir = os.path.join(HOME, ".config", "falkTX")
frLadspaFile = os.path.join(settingsDir, "ladspa_rdf.db")

if os.path.exists(frLadspaFile):
frLadspa = open(frLadspaFile, 'r')

try:
self.fLadspaRdfList = ladspa_rdf.get_c_ladspa_rdfs(json.load(frLadspa))
except:
pass

frLadspa.close()

def loadRDFsNeeded(self):
self.fLadspaRdfNeedsUpdate = True

def menuTransport(self, enabled): def menuTransport(self, enabled):
self.ui.act_transport_play.setEnabled(enabled) self.ui.act_transport_play.setEnabled(enabled)
self.ui.act_transport_stop.setEnabled(enabled) self.ui.act_transport_stop.setEnabled(enabled)


+ 327
- 0
source/carla_host.py View File

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

# Carla host code
# Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.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 doc/GPL.txt file.

# ------------------------------------------------------------------------------------------------------------
# Imports (Global)

try:
from PyQt5.QtWidgets import QMainWindow
except:
from PyQt4.QtGui import QMainWindow

# ------------------------------------------------------------------------------------------------------------
# Imports (Custom)

from carla_database import *
from carla_settings import *
from carla_widgets import *

# ------------------------------------------------------------------------------------------------------------
# Dummy widget

class CarlaDummyW(object):
def __init__(self, parent):
object.__init__(self)

def addPlugin(self, pluginId):
pass

def removePlugin(self, pluginId):
pass

def removeAllPlugins(self):
pass

def idleFast(self):
pass

def idleSlow(self):
pass

# ------------------------------------------------------------------------------------------------------------
# Host Window

class HostWindow(QMainWindow):
# signals
DebugCallback = pyqtSignal(int, int, int, float, str)
PluginAddedCallback = pyqtSignal(int)
PluginRemovedCallback = pyqtSignal(int)
PluginRenamedCallback = pyqtSignal(int, str)
ParameterValueChangedCallback = pyqtSignal(int, int, float)
ParameterDefaultChangedCallback = pyqtSignal(int, int, float)
ParameterMidiChannelChangedCallback = pyqtSignal(int, int, int)
ParameterMidiCcChangedCallback = pyqtSignal(int, int, int)
ProgramChangedCallback = pyqtSignal(int, int)
MidiProgramChangedCallback = pyqtSignal(int, int)
NoteOnCallback = pyqtSignal(int, int, int, int)
NoteOffCallback = pyqtSignal(int, int, int)
ShowGuiCallback = pyqtSignal(int, int)
UpdateCallback = pyqtSignal(int)
ReloadInfoCallback = pyqtSignal(int)
ReloadParametersCallback = pyqtSignal(int)
ReloadProgramsCallback = pyqtSignal(int)
ReloadAllCallback = pyqtSignal(int)
PatchbayClientAddedCallback = pyqtSignal(int, int, str)
PatchbayClientRemovedCallback = pyqtSignal(int, str)
PatchbayClientRenamedCallback = pyqtSignal(int, str)
PatchbayPortAddedCallback = pyqtSignal(int, int, int, str)
PatchbayPortRemovedCallback = pyqtSignal(int, int, str)
PatchbayPortRenamedCallback = pyqtSignal(int, int, str)
PatchbayConnectionAddedCallback = pyqtSignal(int, int, int)
PatchbayConnectionRemovedCallback = pyqtSignal(int)
PatchbayIconChangedCallback = pyqtSignal(int, int)
BufferSizeChangedCallback = pyqtSignal(int)
SampleRateChangedCallback = pyqtSignal(float)
NSM_AnnounceCallback = pyqtSignal(str)
NSM_OpenCallback = pyqtSignal(str)
NSM_SaveCallback = pyqtSignal()
ErrorCallback = pyqtSignal(str)
QuitCallback = pyqtSignal()
SIGTERM = pyqtSignal()
SIGUSR1 = pyqtSignal()

def __init__(self, parent):
QMainWindow.__init__(self, parent)
#self.ui = ui_carla_plugin.Ui_PluginWidget()
#self.ui.setupUi(self)

# -------------------------------------------------------------
# Set bridge paths

if carla_bridge_native:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_NATIVE, 0, carla_bridge_native)

if carla_bridge_posix32:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_POSIX32, 0, carla_bridge_posix32)

if carla_bridge_posix64:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_POSIX64, 0, carla_bridge_posix64)

if carla_bridge_win32:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_WIN32, 0, carla_bridge_win32)

if carla_bridge_win64:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_WIN64, 0, carla_bridge_win64)

if carla_bridge_lv2_external:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_EXTERNAL, 0, carla_bridge_lv2_external)

if WINDOWS:
if carla_bridge_lv2_windows:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_WINDOWS, 0, carla_bridge_lv2_windows)

if carla_bridge_vst_hwnd:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_HWND, 0, carla_bridge_vst_hwnd)

elif MACOS:
if carla_bridge_lv2_cocoa:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_COCOA, 0, carla_bridge_lv2_cocoa)

if carla_bridge_vst_mac:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_MAC, 0, carla_bridge_vst_mac)

else:
if carla_bridge_lv2_gtk2:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_GTK2, 0, carla_bridge_lv2_gtk2)

if carla_bridge_lv2_gtk3:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_GTK3, 0, carla_bridge_lv2_gtk3)

if carla_bridge_lv2_qt4:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_QT4, 0, carla_bridge_lv2_qt4)

if carla_bridge_lv2_qt5:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_QT5, 0, carla_bridge_lv2_qt5)

if carla_bridge_lv2_x11:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_LV2_X11, 0, carla_bridge_lv2_x11)

if carla_bridge_vst_x11:
Carla.host.set_engine_option(OPTION_PATH_BRIDGE_VST_X11, 0, carla_bridge_vst_x11)

# -------------------------------------------------------------
# Set callback

Carla.host.set_engine_callback(EngineCallback)

# -------------------------------------------------------------
# Set custom signal handling

setUpSignals()

# -------------------------------------------------------------
# Internal stuff

self.fIdleTimerFast = 0
self.fIdleTimerSlow = 0

self.fLadspaRdfNeedsUpdate = True
self.fLadspaRdfList = []

self.fContainer = CarlaDummyW(self)

# -------------------------------------------------------------

def getExtraStuff(self, plugin):
ptype = plugin['type']

if ptype == PLUGIN_LADSPA:
uniqueId = plugin['uniqueId']

self.maybeLoadRDFs()

for rdfItem in self.fLadspaRdfList:
if rdfItem.UniqueID == uniqueId:
return pointer(rdfItem)

elif ptype in (PLUGIN_GIG, PLUGIN_SF2, PLUGIN_SFZ):
if plugin['name'].lower().endswith(" (16 outputs)"):
# return a dummy non-null pointer
INTPOINTER = POINTER(c_int)
int1 = c_int(0x1)
addr = addressof(int1)
return cast(addr, INTPOINTER)

return c_nullptr

def maybeLoadRDFs(self):
if not self.fLadspaRdfNeedsUpdate:
return

self.fLadspaRdfNeedsUpdate = False
self.fLadspaRdfList = []

if not haveLRDF:
return

settingsDir = os.path.join(HOME, ".config", "falkTX")
frLadspaFile = os.path.join(settingsDir, "ladspa_rdf.db")

if os.path.exists(frLadspaFile):
frLadspa = open(frLadspaFile, 'r')

try:
self.fLadspaRdfList = ladspa_rdf.get_c_ladspa_rdfs(json.load(frLadspa))
except:
pass

frLadspa.close()

def setLoadRDFsNeeded(self):
self.fLadspaRdfNeedsUpdate = True

def init(self):
self.fIdleTimerFast = self.startTimer(50)
self.fIdleTimerSlow = self.startTimer(50*2)

def timerEvent(self, event):
if event.timerId() == self.fIdleTimerFast:
Carla.host.engine_idle()
self.fContainer.idleFast()

elif event.timerId() == self.fIdleTimerSlow:
self.fContainer.idleSlow()

QMainWindow.timerEvent(self, event)

def closeEvent(self, event):
if self.fIdleTimerFast != 0:
self.killTimer(self.fIdleTimerFast)
self.fIdleTimerFast = 0

if self.fIdleTimerSlow != 0:
self.killTimer(self.fIdleTimerSlow)
self.fIdleTimerSlow = 0

QMainWindow.closeEvent(self, event)

# ------------------------------------------------------------------------------------------------------------
# Engine callback

def EngineCallback(ptr, action, pluginId, value1, value2, value3, valueStr):
if pluginId < 0 or not Carla.gui:
return

if action == CALLBACK_DEBUG:
Carla.gui.DebugCallback.emit(pluginId, value1, value2, value3, cString(valueStr))
elif action == CALLBACK_PLUGIN_ADDED:
Carla.gui.PluginAddedCallback.emit(pluginId)
elif action == CALLBACK_PLUGIN_REMOVED:
Carla.gui.PluginRemovedCallback.emit(pluginId)
elif action == CALLBACK_PLUGIN_RENAMED:
Carla.gui.PluginRenamedCallback.emit(pluginId, valueStr)
elif action == CALLBACK_PARAMETER_VALUE_CHANGED:
Carla.gui.ParameterValueChangedCallback.emit(pluginId, value1, value3)
elif action == CALLBACK_PARAMETER_DEFAULT_CHANGED:
Carla.gui.ParameterDefaultChangedCallback.emit(pluginId, value1, value3)
elif action == CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
Carla.gui.ParameterMidiChannelChangedCallback.emit(pluginId, value1, value2)
elif action == CALLBACK_PARAMETER_MIDI_CC_CHANGED:
Carla.gui.ParameterMidiCcChangedCallback.emit(pluginId, value1, value2)
elif action == CALLBACK_PROGRAM_CHANGED:
Carla.gui.ProgramChangedCallback.emit(pluginId, value1)
elif action == CALLBACK_MIDI_PROGRAM_CHANGED:
Carla.gui.MidiProgramChangedCallback.emit(pluginId, value1)
elif action == CALLBACK_NOTE_ON:
Carla.gui.NoteOnCallback.emit(pluginId, value1, value2, value3)
elif action == CALLBACK_NOTE_OFF:
Carla.gui.NoteOffCallback.emit(pluginId, value1, value2)
elif action == CALLBACK_SHOW_GUI:
Carla.gui.ShowGuiCallback.emit(pluginId, value1)
elif action == CALLBACK_UPDATE:
Carla.gui.UpdateCallback.emit(pluginId)
elif action == CALLBACK_RELOAD_INFO:
Carla.gui.ReloadInfoCallback.emit(pluginId)
elif action == CALLBACK_RELOAD_PARAMETERS:
Carla.gui.ReloadParametersCallback.emit(pluginId)
elif action == CALLBACK_RELOAD_PROGRAMS:
Carla.gui.ReloadProgramsCallback.emit(pluginId)
elif action == CALLBACK_RELOAD_ALL:
Carla.gui.ReloadAllCallback.emit(pluginId)
elif action == CALLBACK_PATCHBAY_CLIENT_ADDED:
Carla.gui.PatchbayClientAddedCallback.emit(value1, value2, cString(valueStr))
elif action == CALLBACK_PATCHBAY_CLIENT_REMOVED:
Carla.gui.PatchbayClientRemovedCallback.emit(value1, cString(valueStr))
elif action == CALLBACK_PATCHBAY_CLIENT_RENAMED:
Carla.gui.PatchbayClientRenamedCallback.emit(value1, cString(valueStr))
elif action == CALLBACK_PATCHBAY_PORT_ADDED:
Carla.gui.PatchbayPortAddedCallback.emit(value1, value2, int(value3), cString(valueStr))
elif action == CALLBACK_PATCHBAY_PORT_REMOVED:
Carla.gui.PatchbayPortRemovedCallback.emit(value1, value2, cString(valueStr))
elif action == CALLBACK_PATCHBAY_PORT_RENAMED:
Carla.gui.PatchbayPortRenamedCallback.emit(value1, value2, cString(valueStr))
elif action == CALLBACK_PATCHBAY_CONNECTION_ADDED:
Carla.gui.PatchbayConnectionAddedCallback.emit(value1, value2, value3)
elif action == CALLBACK_PATCHBAY_CONNECTION_REMOVED:
Carla.gui.PatchbayConnectionRemovedCallback.emit(value1)
elif action == CALLBACK_PATCHBAY_ICON_CHANGED:
Carla.gui.PatchbayIconChangedCallback.emit(value1, value2)
elif action == CALLBACK_BUFFER_SIZE_CHANGED:
Carla.gui.BufferSizeChangedCallback.emit(value1)
elif action == CALLBACK_SAMPLE_RATE_CHANGED:
Carla.gui.SampleRateChangedCallback.emit(value3)
elif action == CALLBACK_NSM_ANNOUNCE:
Carla.gui.NSM_AnnounceCallback.emit(cString(valueStr))
elif action == CALLBACK_NSM_OPEN:
Carla.gui.NSM_OpenCallback.emit(cString(valueStr))
elif action == CALLBACK_NSM_SAVE:
Carla.gui.NSM_SaveCallback.emit()
elif action == CALLBACK_ERROR:
Carla.gui.ErrorCallback.emit(cString(valueStr))
elif action == CALLBACK_QUIT:
Carla.gui.QuitCallback.emit()

+ 2
- 2
source/carla_patchbay.py View File

@@ -133,9 +133,9 @@ class CarlaPatchbayW(QWidget):
painter.restore() painter.restore()


# ------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------
# ...
# Canvas callback


def canvasCallback(action, value1, value2, valueStr):
def CanvasCallback(action, value1, value2, valueStr):
if action == patchcanvas.ACTION_GROUP_INFO: if action == patchcanvas.ACTION_GROUP_INFO:
pass pass




+ 0
- 15
source/carla_rack.py View File

@@ -94,21 +94,6 @@ class CarlaRackW(QListWidget):
""" % (col1, col2)) """ % (col1, col2))


# ------------------------------------------------------------- # -------------------------------------------------------------
# TESTING

#self.addPlugin(0)
#self.addPlugin(1)
#self.addPlugin(2)
#self.addPlugin(3)
#self.addPlugin(4)

#self.removePlugin(3)

#QTimer.singleShot(3000, self.testRemove)
#QTimer.singleShot(5000, self.removeAllPlugins)

def testRemove(self):
self.removePlugin(0)


def idleFast(self): def idleFast(self):
for i in range(self.fPluginCount): for i in range(self.fPluginCount):


+ 5
- 5
source/carla_settings.py View File

@@ -639,8 +639,8 @@ class CarlaSettingsW(QDialog):
# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# TESTING # TESTING


from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
gui = CarlaSettingsW(None, True)
gui.show()
app.exec_()
#from PyQt5.QtWidgets import QApplication
#app = QApplication(sys.argv)
#gui = CarlaSettingsW(None, True)
#gui.show()
#app.exec_()

+ 45
- 46
source/carla_widgets.py View File

@@ -20,11 +20,11 @@
# Imports (Global) # Imports (Global)


try: try:
from PyQt5.QtCore import QByteArray, QSettings
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QByteArray, QSettings
from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath
from PyQt5.QtWidgets import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget from PyQt5.QtWidgets import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget
except: except:
from PyQt4.QtCore import QByteArray, QSettings
from PyQt4.QtCore import pyqtSignal, pyqtSlot, QByteArray, QSettings
from PyQt4.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath from PyQt4.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath
from PyQt4.QtGui import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget from PyQt4.QtGui import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget


@@ -424,6 +424,10 @@ class PluginEdit(QDialog):
self.ui.dial_b_right.setPixmap(4) self.ui.dial_b_right.setPixmap(4)
self.ui.dial_b_right.setLabel("R") self.ui.dial_b_right.setLabel("R")


self.ui.dial_pan.setCustomPaint(self.ui.dial_b_right.CUSTOM_PAINT_CARLA_R) # FIXME
self.ui.dial_pan.setPixmap(4)
self.ui.dial_pan.setLabel("Pan")

self.ui.keyboard.setMode(self.ui.keyboard.HORIZONTAL) self.ui.keyboard.setMode(self.ui.keyboard.HORIZONTAL)
self.ui.keyboard.setOctaves(10) self.ui.keyboard.setOctaves(10)


@@ -518,54 +522,47 @@ class PluginEdit(QDialog):
pluginType = self.fPluginInfo['type'] pluginType = self.fPluginInfo['type']
pluginHints = self.fPluginInfo['hints'] pluginHints = self.fPluginInfo['hints']


#if pluginType == PLUGIN_INTERNAL:
#self.ui.le_type.setText(self.tr("Internal"))
#elif pluginType == PLUGIN_LADSPA:
#self.ui.le_type.setText("LADSPA")
#elif pluginType == PLUGIN_DSSI:
#self.ui.le_type.setText("DSSI")
#elif pluginType == PLUGIN_LV2:
#self.ui.le_type.setText("LV2")
#elif pluginType == PLUGIN_VST:
#self.ui.le_type.setText("VST")
#elif pluginType == PLUGIN_AU:
#self.ui.le_type.setText("AU")
#elif pluginType == PLUGIN_CSOUND:
#self.ui.le_type.setText("CSOUND")
#elif pluginType == PLUGIN_GIG:
#self.ui.le_type.setText("GIG")
#elif pluginType == PLUGIN_SF2:
#self.ui.le_type.setText("SF2")
#elif pluginType == PLUGIN_SFZ:
#self.ui.le_type.setText("SFZ")
#else:
#self.ui.le_type.setText(self.tr("Unknown"))

#self.ui.le_name.setText(pluginName)
#self.ui.le_name.setToolTip(pluginName)
#self.ui.le_label.setText(self.fPluginInfo['label'])
#self.ui.le_label.setToolTip(self.fPluginInfo['label'])
#self.ui.le_maker.setText(self.fPluginInfo['maker'])
#self.ui.le_maker.setToolTip(self.fPluginInfo['maker'])
#self.ui.le_copyright.setText(self.fPluginInfo['copyright'])
#self.ui.le_copyright.setToolTip(self.fPluginInfo['copyright'])
#self.ui.le_unique_id.setText(str(self.fPluginInfo['uniqueId']))
#self.ui.le_unique_id.setToolTip(str(self.fPluginInfo['uniqueId']))
#self.ui.le_ains.setText(str(audioCountInfo['ins']))
#self.ui.le_aouts.setText(str(audioCountInfo['outs']))
#self.ui.le_params.setText(str(paramCountInfo['ins']))
if pluginType == PLUGIN_INTERNAL:
self.ui.le_type.setText(self.tr("Internal"))
elif pluginType == PLUGIN_LADSPA:
self.ui.le_type.setText("LADSPA")
elif pluginType == PLUGIN_DSSI:
self.ui.le_type.setText("DSSI")
elif pluginType == PLUGIN_LV2:
self.ui.le_type.setText("LV2")
elif pluginType == PLUGIN_VST:
self.ui.le_type.setText("VST")
elif pluginType == PLUGIN_AU:
self.ui.le_type.setText("AU")
elif pluginType == PLUGIN_CSOUND:
self.ui.le_type.setText("CSOUND")
elif pluginType == PLUGIN_GIG:
self.ui.le_type.setText("GIG")
elif pluginType == PLUGIN_SF2:
self.ui.le_type.setText("SF2")
elif pluginType == PLUGIN_SFZ:
self.ui.le_type.setText("SFZ")
else:
self.ui.le_type.setText(self.tr("Unknown"))

self.ui.le_name.setText(pluginName)
self.ui.le_name.setToolTip(pluginName)
self.ui.le_label.setText(self.fPluginInfo['label'])
self.ui.le_label.setToolTip(self.fPluginInfo['label'])
self.ui.le_maker.setText(self.fPluginInfo['maker'])
self.ui.le_maker.setToolTip(self.fPluginInfo['maker'])
self.ui.le_copyright.setText(self.fPluginInfo['copyright'])
self.ui.le_copyright.setToolTip(self.fPluginInfo['copyright'])
self.ui.le_unique_id.setText(str(self.fPluginInfo['uniqueId']))
self.ui.le_unique_id.setToolTip(str(self.fPluginInfo['uniqueId']))
self.ui.label_plugin.setText("\n%s\n" % self.fPluginInfo['name']) self.ui.label_plugin.setText("\n%s\n" % self.fPluginInfo['name'])
self.setWindowTitle(self.fPluginInfo['name']) self.setWindowTitle(self.fPluginInfo['name'])


#if self.fPluginInfo['latency'] > 0:
#self.ui.le_latency.setText("%i samples" % self.fPluginInfo['latency'])
#else:
#self.ui.le_latency.setText(self.tr("None"))

self.ui.dial_drywet.setEnabled(pluginHints & PLUGIN_CAN_DRYWET) self.ui.dial_drywet.setEnabled(pluginHints & PLUGIN_CAN_DRYWET)
self.ui.dial_vol.setEnabled(pluginHints & PLUGIN_CAN_VOLUME) self.ui.dial_vol.setEnabled(pluginHints & PLUGIN_CAN_VOLUME)
self.ui.dial_b_left.setEnabled(pluginHints & PLUGIN_CAN_BALANCE) self.ui.dial_b_left.setEnabled(pluginHints & PLUGIN_CAN_BALANCE)
self.ui.dial_b_right.setEnabled(pluginHints & PLUGIN_CAN_BALANCE) self.ui.dial_b_right.setEnabled(pluginHints & PLUGIN_CAN_BALANCE)
self.ui.dial_pan.setEnabled(pluginHints & PLUGIN_CAN_PANNING)


self.ui.ch_fixed_buffer.setEnabled(self.fPluginInfo['optionsAvailable'] & PLUGIN_OPTION_FIXED_BUFFERS) self.ui.ch_fixed_buffer.setEnabled(self.fPluginInfo['optionsAvailable'] & PLUGIN_OPTION_FIXED_BUFFERS)
self.ui.ch_fixed_buffer.setChecked(self.fPluginInfo['optionsEnabled'] & PLUGIN_OPTION_FIXED_BUFFERS) self.ui.ch_fixed_buffer.setChecked(self.fPluginInfo['optionsEnabled'] & PLUGIN_OPTION_FIXED_BUFFERS)
@@ -587,10 +584,10 @@ class PluginEdit(QDialog):
self.ui.ch_send_all_sound_off.setChecked(self.fPluginInfo['optionsEnabled'] & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) self.ui.ch_send_all_sound_off.setChecked(self.fPluginInfo['optionsEnabled'] & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)


if self.fPluginInfo['type'] != PLUGIN_VST: if self.fPluginInfo['type'] != PLUGIN_VST:
self.ui.tab_programs.setCurrentIndex(1)
self.ui.sw_programs.setCurrentIndex(1)


# Show/hide keyboard # Show/hide keyboard
showKeyboard = (self.fPluginInfo['category'] == PLUGIN_CATEGORY_SYNTH) != 0 or (midiCountInfo['ins'] > 0 < midiCountInfo['outs'])
showKeyboard = (self.fPluginInfo['category'] == PLUGIN_CATEGORY_SYNTH or midiCountInfo['ins'] > 0 < midiCountInfo['outs'])
self.ui.scrollArea.setEnabled(showKeyboard) self.ui.scrollArea.setEnabled(showKeyboard)
self.ui.scrollArea.setVisible(showKeyboard) self.ui.scrollArea.setVisible(showKeyboard)


@@ -807,6 +804,8 @@ class PluginEdit(QDialog):


self.ui.cb_midi_programs.blockSignals(False) self.ui.cb_midi_programs.blockSignals(False)


self.ui.sw_programs.setEnabled(programCount > 0 or midiProgramCount > 0)

if self.fPluginInfo['type'] == PLUGIN_LV2: if self.fPluginInfo['type'] == PLUGIN_LV2:
self.ui.b_load_state.setEnabled(programCount > 0) self.ui.b_load_state.setEnabled(programCount > 0)


@@ -1264,7 +1263,7 @@ class PluginEdit(QDialog):
def _updateCtrlMidiProgram(self): def _updateCtrlMidiProgram(self):
if self.fPluginInfo['type'] not in (PLUGIN_INTERNAL, PLUGIN_SF2): if self.fPluginInfo['type'] not in (PLUGIN_INTERNAL, PLUGIN_SF2):
return return
elif not self.fPluginInfo['hints'] & PLUGIN_IS_SYNTH:
elif self.fPluginInfo['category'] != PLUGIN_CATEGORY_SYNTH:
return return


if self.fControlChannel < 0: if self.fControlChannel < 0:


Loading…
Cancel
Save