| @@ -7,7 +7,7 @@ | |||||
| <x>0</x> | <x>0</x> | ||||
| <y>0</y> | <y>0</y> | ||||
| <width>756</width> | <width>756</width> | ||||
| <height>218</height> | |||||
| <height>283</height> | |||||
| </rect> | </rect> | ||||
| </property> | </property> | ||||
| <property name="windowTitle"> | <property name="windowTitle"> | ||||
| @@ -15,6 +15,140 @@ | |||||
| </property> | </property> | ||||
| <widget class="QWidget" name="centralwidget"> | <widget class="QWidget" name="centralwidget"> | ||||
| <layout class="QVBoxLayout" name="verticalLayout"> | <layout class="QVBoxLayout" name="verticalLayout"> | ||||
| <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>2</number> | |||||
| </property> | |||||
| <item> | |||||
| <widget class="QFrame" name="frame_transport"> | |||||
| <property name="frameShape"> | |||||
| <enum>QFrame::StyledPanel</enum> | |||||
| </property> | |||||
| <property name="frameShadow"> | |||||
| <enum>QFrame::Raised</enum> | |||||
| </property> | |||||
| <layout class="QHBoxLayout" name="horizontalLayout"> | |||||
| <item> | |||||
| <widget class="QLabel" name="label"> | |||||
| <property name="text"> | |||||
| <string>Transport Mode:</string> | |||||
| </property> | |||||
| <property name="alignment"> | |||||
| <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QComboBox" name="ch_transport"/> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="Line" name="line"> | |||||
| <property name="orientation"> | |||||
| <enum>Qt::Vertical</enum> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QPushButton" name="b_transport_play"> | |||||
| <property name="maximumSize"> | |||||
| <size> | |||||
| <width>22</width> | |||||
| <height>22</height> | |||||
| </size> | |||||
| </property> | |||||
| <property name="text"> | |||||
| <string/> | |||||
| </property> | |||||
| <property name="icon"> | |||||
| <iconset resource="../resources.qrc"> | |||||
| <normaloff>:/16x16/media-playback-start.png</normaloff>:/16x16/media-playback-start.png</iconset> | |||||
| </property> | |||||
| <property name="checkable"> | |||||
| <bool>true</bool> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QPushButton" name="b_transport_stop"> | |||||
| <property name="maximumSize"> | |||||
| <size> | |||||
| <width>22</width> | |||||
| <height>22</height> | |||||
| </size> | |||||
| </property> | |||||
| <property name="text"> | |||||
| <string/> | |||||
| </property> | |||||
| <property name="icon"> | |||||
| <iconset resource="../resources.qrc"> | |||||
| <normaloff>:/16x16/media-playback-stop.png</normaloff>:/16x16/media-playback-stop.png</iconset> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QPushButton" name="b_transport_back"> | |||||
| <property name="maximumSize"> | |||||
| <size> | |||||
| <width>22</width> | |||||
| <height>22</height> | |||||
| </size> | |||||
| </property> | |||||
| <property name="text"> | |||||
| <string/> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QPushButton" name="b_transport_forward"> | |||||
| <property name="maximumSize"> | |||||
| <size> | |||||
| <width>22</width> | |||||
| <height>22</height> | |||||
| </size> | |||||
| </property> | |||||
| <property name="text"> | |||||
| <string/> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="Line" name="line_2"> | |||||
| <property name="orientation"> | |||||
| <enum>Qt::Vertical</enum> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <widget class="QLabel" name="label_time"> | |||||
| <property name="text"> | |||||
| <string>TIME (TODO)</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | |||||
| <spacer name="horizontalSpacer"> | |||||
| <property name="orientation"> | |||||
| <enum>Qt::Horizontal</enum> | |||||
| </property> | |||||
| <property name="sizeHint" stdset="0"> | |||||
| <size> | |||||
| <width>40</width> | |||||
| <height>20</height> | |||||
| </size> | |||||
| </property> | |||||
| </spacer> | |||||
| </item> | |||||
| </layout> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | <item> | ||||
| <widget class="QWidget" name="w_plugins" native="true"> | <widget class="QWidget" name="w_plugins" native="true"> | ||||
| <layout class="QVBoxLayout" name="layout"> | <layout class="QVBoxLayout" name="layout"> | ||||
| @@ -226,85 +226,92 @@ enum OptionsType { | |||||
| */ | */ | ||||
| OPTION_PROCESS_MODE = 1, | OPTION_PROCESS_MODE = 1, | ||||
| /*! | |||||
| * Set the engine transport mode.\n | |||||
| * Default is TRANSPORT_MODE_INTERNAL. | |||||
| * \see TransportMode | |||||
| */ | |||||
| OPTION_TRANSPORT_MODE = 2, | |||||
| /*! | /*! | ||||
| * Force mono plugins as stereo, by running 2 instances at the same time. | * Force mono plugins as stereo, by running 2 instances at the same time. | ||||
| * \note Not supported by all plugins. | * \note Not supported by all plugins. | ||||
| */ | */ | ||||
| OPTION_FORCE_STEREO = 2, | |||||
| OPTION_FORCE_STEREO = 3, | |||||
| /*! | /*! | ||||
| * Use plugin bridges whenever possible.\n | * Use plugin bridges whenever possible.\n | ||||
| * Default is no, and not recommended at this point!. | * Default is no, and not recommended at this point!. | ||||
| * EXPERIMENTAL AND INCOMPLETE! | * EXPERIMENTAL AND INCOMPLETE! | ||||
| */ | */ | ||||
| OPTION_PREFER_PLUGIN_BRIDGES = 3, | |||||
| OPTION_PREFER_PLUGIN_BRIDGES = 4, | |||||
| /*! | /*! | ||||
| * Use OSC-UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n | * Use OSC-UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n | ||||
| * Default is yes. | * Default is yes. | ||||
| */ | */ | ||||
| OPTION_PREFER_UI_BRIDGES = 4, | |||||
| OPTION_PREFER_UI_BRIDGES = 5, | |||||
| #ifdef WANT_DSSI | #ifdef WANT_DSSI | ||||
| /*! | /*! | ||||
| * Use (unofficial) dssi-vst chunks feature.\n | * Use (unofficial) dssi-vst chunks feature.\n | ||||
| * Default is no. | * Default is no. | ||||
| */ | */ | ||||
| OPTION_USE_DSSI_VST_CHUNKS = 5, | |||||
| OPTION_USE_DSSI_VST_CHUNKS = 6, | |||||
| #endif | #endif | ||||
| /*! | /*! | ||||
| * Maximum number of parameters allowed.\n | * Maximum number of parameters allowed.\n | ||||
| * Default is MAX_DEFAULT_PARAMETERS. | * Default is MAX_DEFAULT_PARAMETERS. | ||||
| */ | */ | ||||
| OPTION_MAX_PARAMETERS = 6, | |||||
| OPTION_MAX_PARAMETERS = 7, | |||||
| /*! | /*! | ||||
| * Timeout value in ms for how much to wait for OSC-Bridges to respond.\n | * Timeout value in ms for how much to wait for OSC-Bridges to respond.\n | ||||
| * Default is 4000 (4 secs). | * Default is 4000 (4 secs). | ||||
| */ | */ | ||||
| OPTION_OSC_UI_TIMEOUT = 7, | |||||
| OPTION_OSC_UI_TIMEOUT = 8, | |||||
| /*! | /*! | ||||
| * Prefered buffer size. | * Prefered buffer size. | ||||
| */ | */ | ||||
| OPTION_PREFERRED_BUFFER_SIZE = 8, | |||||
| OPTION_PREFERRED_BUFFER_SIZE = 9, | |||||
| /*! | /*! | ||||
| * Prefered sample rate. | * Prefered sample rate. | ||||
| */ | */ | ||||
| OPTION_PREFERRED_SAMPLE_RATE = 9, | |||||
| OPTION_PREFERRED_SAMPLE_RATE = 10, | |||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| /*! | /*! | ||||
| * Set path to the native plugin bridge executable.\n | * Set path to the native plugin bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_NATIVE = 10, | |||||
| OPTION_PATH_BRIDGE_NATIVE = 11, | |||||
| /*! | /*! | ||||
| * Set path to the POSIX 32bit plugin bridge executable.\n | * Set path to the POSIX 32bit plugin bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_POSIX32 = 11, | |||||
| OPTION_PATH_BRIDGE_POSIX32 = 12, | |||||
| /*! | /*! | ||||
| * Set path to the POSIX 64bit plugin bridge executable.\n | * Set path to the POSIX 64bit plugin bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_POSIX64 = 12, | |||||
| OPTION_PATH_BRIDGE_POSIX64 = 13, | |||||
| /*! | /*! | ||||
| * Set path to the Windows 32bit plugin bridge executable.\n | * Set path to the Windows 32bit plugin bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_WIN32 = 13, | |||||
| OPTION_PATH_BRIDGE_WIN32 = 14, | |||||
| /*! | /*! | ||||
| * Set path to the Windows 64bit plugin bridge executable.\n | * Set path to the Windows 64bit plugin bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_WIN64 = 14, | |||||
| OPTION_PATH_BRIDGE_WIN64 = 15, | |||||
| #endif | #endif | ||||
| #ifdef WANT_LV2 | #ifdef WANT_LV2 | ||||
| @@ -312,43 +319,43 @@ enum OptionsType { | |||||
| * Set path to the LV2 Gtk2 UI bridge executable.\n | * Set path to the LV2 Gtk2 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_GTK2 = 15, | |||||
| OPTION_PATH_BRIDGE_LV2_GTK2 = 16, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 Gtk3 UI bridge executable.\n | * Set path to the LV2 Gtk3 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_GTK3 = 16, | |||||
| OPTION_PATH_BRIDGE_LV2_GTK3 = 17, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 Qt4 UI bridge executable.\n | * Set path to the LV2 Qt4 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_QT4 = 17, | |||||
| OPTION_PATH_BRIDGE_LV2_QT4 = 18, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 Qt5 UI bridge executable.\n | * Set path to the LV2 Qt5 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_QT5 = 18, | |||||
| OPTION_PATH_BRIDGE_LV2_QT5 = 19, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 Cocoa UI bridge executable.\n | * Set path to the LV2 Cocoa UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_COCOA = 19, | |||||
| OPTION_PATH_BRIDGE_LV2_COCOA = 20, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 Windows UI bridge executable.\n | * Set path to the LV2 Windows UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_WINDOWS = 20, | |||||
| OPTION_PATH_BRIDGE_LV2_WINDOWS = 21, | |||||
| /*! | /*! | ||||
| * Set path to the LV2 X11 UI bridge executable.\n | * Set path to the LV2 X11 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_LV2_X11 = 21, | |||||
| OPTION_PATH_BRIDGE_LV2_X11 = 22, | |||||
| #endif | #endif | ||||
| #ifdef WANT_VST | #ifdef WANT_VST | ||||
| @@ -356,19 +363,19 @@ enum OptionsType { | |||||
| * Set path to the VST Cocoa UI bridge executable.\n | * Set path to the VST Cocoa UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_VST_COCOA = 22, | |||||
| OPTION_PATH_BRIDGE_VST_COCOA = 23, | |||||
| /*! | /*! | ||||
| * Set path to the VST HWND UI bridge executable.\n | * Set path to the VST HWND UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_VST_HWND = 23, | |||||
| OPTION_PATH_BRIDGE_VST_HWND = 24, | |||||
| /*! | /*! | ||||
| * Set path to the VST X11 UI bridge executable.\n | * Set path to the VST X11 UI bridge executable.\n | ||||
| * Default unset. | * Default unset. | ||||
| */ | */ | ||||
| OPTION_PATH_BRIDGE_VST_X11 = 24 | |||||
| OPTION_PATH_BRIDGE_VST_X11 = 25 | |||||
| #endif | #endif | ||||
| }; | }; | ||||
| @@ -538,6 +545,14 @@ enum ProcessMode { | |||||
| PROCESS_MODE_BRIDGE = 4 //!< Special mode, used in plugin-bridges only. RT buffers come from shared memory in a separate host app. | PROCESS_MODE_BRIDGE = 4 //!< Special mode, used in plugin-bridges only. RT buffers come from shared memory in a separate host app. | ||||
| }; | }; | ||||
| /*! | |||||
| * All the available transport modes | |||||
| */ | |||||
| enum TransportMode { | |||||
| TRANSPORT_MODE_INTERNAL = 0, //!< Internal transport mode. | |||||
| TRANSPORT_MODE_JACK = 1, //!< JACK transport, only available if driver name is "JACK" | |||||
| }; | |||||
| /*! | /*! | ||||
| * Callback function the engine will call when something interesting happens. | * Callback function the engine will call when something interesting happens. | ||||
| * | * | ||||
| @@ -257,7 +257,8 @@ struct EngineDevices { | |||||
| * Engine options. | * Engine options. | ||||
| */ | */ | ||||
| struct EngineOptions { | struct EngineOptions { | ||||
| ProcessMode processMode; | |||||
| ProcessMode processMode; | |||||
| TransportMode transportMode; | |||||
| bool forceStereo; | bool forceStereo; | ||||
| bool preferPluginBridges; | bool preferPluginBridges; | ||||
| @@ -295,6 +296,7 @@ struct EngineOptions { | |||||
| EngineOptions() | EngineOptions() | ||||
| : processMode(PROCESS_MODE_CONTINUOUS_RACK), | : processMode(PROCESS_MODE_CONTINUOUS_RACK), | ||||
| transportMode(TRANSPORT_MODE_INTERNAL), | |||||
| forceStereo(false), | forceStereo(false), | ||||
| preferPluginBridges(false), | preferPluginBridges(false), | ||||
| preferUiBridges(true), | preferUiBridges(true), | ||||
| @@ -852,6 +854,24 @@ public: | |||||
| */ | */ | ||||
| void setCallback(const CallbackFunc func, void* const ptr); | void setCallback(const CallbackFunc func, void* const ptr); | ||||
| // ------------------------------------------------------------------- | |||||
| // Transport | |||||
| /*! | |||||
| * TODO. | |||||
| */ | |||||
| virtual void transportPlay(); | |||||
| /*! | |||||
| * TODO. | |||||
| */ | |||||
| virtual void transportPause(); | |||||
| /*! | |||||
| * TODO. | |||||
| */ | |||||
| virtual void transportRelocate(const uint32_t frame); | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Error handling | // Error handling | ||||
| @@ -661,7 +661,7 @@ public: | |||||
| /*! | /*! | ||||
| * Plugin process callback. | * Plugin process callback. | ||||
| */ | */ | ||||
| virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset = 0); | |||||
| virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames); | |||||
| /*! | /*! | ||||
| * Tell the plugin the current buffer size has changed. | * Tell the plugin the current buffer size has changed. | ||||
| @@ -170,6 +170,10 @@ CARLA_EXPORT void carla_set_engine_option(CarlaOptionsType option, int value, co | |||||
| CARLA_EXPORT bool carla_load_project(const char* filename); | CARLA_EXPORT bool carla_load_project(const char* filename); | ||||
| CARLA_EXPORT bool carla_save_project(const char* filename); | CARLA_EXPORT bool carla_save_project(const char* filename); | ||||
| CARLA_EXPORT void carla_transport_play(); | |||||
| CARLA_EXPORT void carla_transport_pause(); | |||||
| CARLA_EXPORT void carla_transport_relocate(uint32_t frames); | |||||
| CARLA_EXPORT bool carla_add_plugin(CarlaBinaryType btype, CarlaPluginType ptype, const char* filename, const char* name, const char* label, const void* extraPtr); | CARLA_EXPORT bool carla_add_plugin(CarlaBinaryType btype, CarlaPluginType ptype, const char* filename, const char* name, const char* label, const void* extraPtr); | ||||
| CARLA_EXPORT bool carla_remove_plugin(unsigned int pluginId); | CARLA_EXPORT bool carla_remove_plugin(unsigned int pluginId); | ||||
| CARLA_EXPORT void carla_remove_all_plugins(); | CARLA_EXPORT void carla_remove_all_plugins(); | ||||
| @@ -1064,6 +1064,24 @@ void CarlaEngine::setCallback(const CallbackFunc func, void* const ptr) | |||||
| kData->callbackPtr = ptr; | kData->callbackPtr = ptr; | ||||
| } | } | ||||
| // ----------------------------------------------------------------------- | |||||
| // Transport | |||||
| void CarlaEngine::transportPlay() | |||||
| { | |||||
| kData->time.playing = true; | |||||
| } | |||||
| void CarlaEngine::transportPause() | |||||
| { | |||||
| kData->time.playing = false; | |||||
| } | |||||
| void CarlaEngine::transportRelocate(const uint32_t frame) | |||||
| { | |||||
| kData->time.frame = frame; | |||||
| } | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Error handling | // Error handling | ||||
| @@ -1141,6 +1159,13 @@ void CarlaEngine::setOption(const OptionsType option, const int value, const cha | |||||
| fOptions.processMode = static_cast<ProcessMode>(value); | fOptions.processMode = static_cast<ProcessMode>(value); | ||||
| break; | break; | ||||
| case OPTION_TRANSPORT_MODE: | |||||
| if (value < CarlaBackend::TRANSPORT_MODE_INTERNAL || value > CarlaBackend::TRANSPORT_MODE_JACK) | |||||
| return carla_stderr2("carla_set_engine_option(OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr); | |||||
| fOptions.transportMode = static_cast<CarlaBackend::TransportMode>(value); | |||||
| break; | |||||
| case OPTION_MAX_PARAMETERS: | case OPTION_MAX_PARAMETERS: | ||||
| CARLA_ENGINE_SET_OPTION_RUNNING_CHECK | CARLA_ENGINE_SET_OPTION_RUNNING_CHECK | ||||
| @@ -1324,6 +1349,15 @@ void CarlaEngine::proccessPendingEvents() | |||||
| break; | break; | ||||
| } | } | ||||
| if (kData->time.playing) | |||||
| kData->time.frame += fBufferSize; | |||||
| if (fOptions.transportMode == CarlaBackend::TRANSPORT_MODE_INTERNAL) | |||||
| { | |||||
| fTimeInfo.playing = kData->time.playing; | |||||
| fTimeInfo.frame = kData->time.frame; | |||||
| } | |||||
| for (unsigned int i=0; i < kData->curPluginCount; i++) | for (unsigned int i=0; i < kData->curPluginCount; i++) | ||||
| { | { | ||||
| // TODO - peak values? | // TODO - peak values? | ||||
| @@ -176,6 +176,15 @@ struct CarlaEngineProtectedData { | |||||
| out(nullptr) {} | out(nullptr) {} | ||||
| } rack; | } rack; | ||||
| struct Time { | |||||
| bool playing; | |||||
| uint32_t frame; | |||||
| Time() | |||||
| : playing(false), | |||||
| frame(0) {} | |||||
| } time; | |||||
| EnginePluginData* plugins; | EnginePluginData* plugins; | ||||
| CarlaEngineProtectedData(CarlaEngine* const engine) | CarlaEngineProtectedData(CarlaEngine* const engine) | ||||
| @@ -15,7 +15,7 @@ | |||||
| * For a full copy of the GNU General Public License see the GPL.txt file | * For a full copy of the GNU General Public License see the GPL.txt file | ||||
| */ | */ | ||||
| #ifdef WANT_JACK | |||||
| #if 1//def WANT_JACK | |||||
| #include "CarlaEngineInternal.hpp" | #include "CarlaEngineInternal.hpp" | ||||
| #include "CarlaBackendUtils.hpp" | #include "CarlaBackendUtils.hpp" | ||||
| @@ -694,6 +694,33 @@ public: | |||||
| return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client); | return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client); | ||||
| } | } | ||||
| // ------------------------------------------------------------------- | |||||
| // Transport | |||||
| void transportPlay() | |||||
| { | |||||
| if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL) | |||||
| CarlaEngine::transportPlay(); | |||||
| else if (fClient != nullptr) | |||||
| jackbridge_transport_start(fClient); | |||||
| } | |||||
| void transportPause() | |||||
| { | |||||
| if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL) | |||||
| CarlaEngine::transportPause(); | |||||
| else if (fClient != nullptr) | |||||
| jackbridge_transport_stop(fClient); | |||||
| } | |||||
| void transportRelocate(const uint32_t frame) | |||||
| { | |||||
| if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL) | |||||
| CarlaEngine::transportRelocate(frame); | |||||
| else if (fClient != nullptr) | |||||
| jackbridge_transport_locate(fClient, frame); | |||||
| } | |||||
| // ------------------------------------- | // ------------------------------------- | ||||
| protected: | protected: | ||||
| @@ -724,6 +751,9 @@ protected: | |||||
| void saveTransportInfo() | void saveTransportInfo() | ||||
| { | { | ||||
| if (fOptions.transportMode != TRANSPORT_MODE_JACK) | |||||
| return; | |||||
| fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate | fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate | ||||
| fTransportState = jackbridge_transport_query(fClient, &fTransportPos); | fTransportState = jackbridge_transport_query(fClient, &fTransportPos); | ||||
| @@ -427,10 +427,6 @@ protected: | |||||
| //fMidiOut.sendMessage(); | //fMidiOut.sendMessage(); | ||||
| } | } | ||||
| // TESTING | |||||
| fTimeInfo.playing = true; | |||||
| fTimeInfo.frame += nframes; | |||||
| proccessPendingEvents(); | proccessPendingEvents(); | ||||
| return; | return; | ||||
| @@ -70,7 +70,7 @@ debug: | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| %.cpp.o: %.cpp ../CarlaEngine.hpp CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp | |||||
| %.cpp.o: %.cpp ../CarlaPlugin.hpp ../CarlaEngine.hpp CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp | |||||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | ||||
| $(SHARED): $(OBJS) $(LIBS) | $(SHARED): $(OBJS) $(LIBS) | ||||
| @@ -908,7 +908,7 @@ void CarlaPlugin::prepareForSave() | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void CarlaPlugin::process(float** const, float** const, const uint32_t, const uint32_t) | |||||
| void CarlaPlugin::process(float** const, float** const, const uint32_t) | |||||
| { | { | ||||
| } | } | ||||
| @@ -871,7 +871,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| @@ -987,7 +987,7 @@ public: | |||||
| { | { | ||||
| const EngineEvent& event = kData->event.portIn->getEvent(i); | const EngineEvent& event = kData->event.portIn->getEvent(i); | ||||
| time = event.time - framesOffset; | |||||
| time = event.time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1424,7 +1424,7 @@ public: | |||||
| if (kData->param.data[k].midiCC > 0) | if (kData->param.data[k].midiCC > 0) | ||||
| { | { | ||||
| value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | ||||
| kData->event.portOut->writeControlEvent(framesOffset, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| kData->event.portOut->writeControlEvent(0, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| } | } | ||||
| } | } | ||||
| @@ -871,7 +871,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| @@ -948,7 +948,7 @@ public: | |||||
| { | { | ||||
| const EngineEvent& event = kData->event.portIn->getEvent(i); | const EngineEvent& event = kData->event.portIn->getEvent(i); | ||||
| time = event.time - framesOffset; | |||||
| time = event.time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1264,7 +1264,7 @@ public: | |||||
| if (kData->param.data[k].midiCC > 0) | if (kData->param.data[k].midiCC > 0) | ||||
| { | { | ||||
| double value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | double value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | ||||
| kData->event.portOut->writeControlEvent(framesOffset, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| kData->event.portOut->writeControlEvent(0, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| } | } | ||||
| } // End of Control Output | } // End of Control Output | ||||
| @@ -748,7 +748,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| @@ -813,7 +813,7 @@ public: | |||||
| { | { | ||||
| const EngineEvent& event = kData->event.portIn->getEvent(i); | const EngineEvent& event = kData->event.portIn->getEvent(i); | ||||
| time = event.time - framesOffset; | |||||
| time = event.time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1095,7 +1095,7 @@ public: | |||||
| if (kData->param.data[k].midiCC > 0) | if (kData->param.data[k].midiCC > 0) | ||||
| { | { | ||||
| value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]); | ||||
| kData->event.portOut->writeControlEvent(framesOffset, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| kData->event.portOut->writeControlEvent(0, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| } | } | ||||
| } | } | ||||
| @@ -433,7 +433,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| uint32_t midiEventCount = 0; | uint32_t midiEventCount = 0; | ||||
| @@ -463,7 +463,7 @@ public: | |||||
| if (! cinEvent) | if (! cinEvent) | ||||
| continue; | continue; | ||||
| time = cinEvent->time - framesOffset; | |||||
| time = cinEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -658,7 +658,7 @@ public: | |||||
| if (! minEvent) | if (! minEvent) | ||||
| continue; | continue; | ||||
| time = minEvent->time - framesOffset; | |||||
| time = minEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1916,7 +1916,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| uint32_t midiEventCount = 0; | uint32_t midiEventCount = 0; | ||||
| @@ -2024,7 +2024,7 @@ public: | |||||
| if (! cinEvent) | if (! cinEvent) | ||||
| continue; | continue; | ||||
| time = cinEvent->time - framesOffset; | |||||
| time = cinEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -2260,7 +2260,7 @@ public: | |||||
| if (! minEvent) | if (! minEvent) | ||||
| continue; | continue; | ||||
| time = minEvent->time - framesOffset; | |||||
| time = minEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -2359,7 +2359,7 @@ public: | |||||
| } | } | ||||
| LV2_Atom_Event* const aev = getLv2AtomEvent(evIn.data[i].atom, evInAtomOffsets[i]); | LV2_Atom_Event* const aev = getLv2AtomEvent(evIn.data[i].atom, evInAtomOffsets[i]); | ||||
| aev->time.frames = framesOffset; | |||||
| aev->time.frames = 0; | |||||
| aev->body.type = lv2Pos->type; | aev->body.type = lv2Pos->type; | ||||
| aev->body.size = lv2Pos->size; | aev->body.size = lv2Pos->size; | ||||
| memcpy(LV2_ATOM_BODY(&aev->body), LV2_ATOM_BODY(lv2Pos), lv2Pos->size); | memcpy(LV2_ATOM_BODY(&aev->body), LV2_ATOM_BODY(lv2Pos), lv2Pos->size); | ||||
| @@ -2390,7 +2390,7 @@ public: | |||||
| } | } | ||||
| LV2_Atom_Event* const aev = getLv2AtomEvent(evIn.data[i].atom, evInAtomOffsets[i]); | LV2_Atom_Event* const aev = getLv2AtomEvent(evIn.data[i].atom, evInAtomOffsets[i]); | ||||
| aev->time.frames = framesOffset; | |||||
| aev->time.frames = 0; | |||||
| aev->body.type = atom->type; | aev->body.type = atom->type; | ||||
| aev->body.size = atom->size; | aev->body.size = atom->size; | ||||
| memcpy(LV2_ATOM_BODY(&aev->body), LV2_ATOM_BODY(atom), atom->size); | memcpy(LV2_ATOM_BODY(&aev->body), LV2_ATOM_BODY(atom), atom->size); | ||||
| @@ -2698,7 +2698,7 @@ public: | |||||
| if (param.data[k].midiCC > 0) | if (param.data[k].midiCC > 0) | ||||
| { | { | ||||
| value = (paramBuffers[k] - param.ranges[k].min) / (param.ranges[k].max - param.ranges[k].min); | value = (paramBuffers[k] - param.ranges[k].min) / (param.ranges[k].max - param.ranges[k].min); | ||||
| param.portCout->writeEvent(CarlaEngineParameterChangeEvent, framesOffset, param.data[k].midiChannel, param.data[k].midiCC, value); | |||||
| param.portCout->writeEvent(CarlaEngineParameterChangeEvent, 0, param.data[k].midiChannel, param.data[k].midiCC, value); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -55,7 +55,7 @@ debug: | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| %.cpp.o: %.cpp ../CarlaPlugin.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp | |||||
| %.cpp.o: %.cpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp | |||||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | ||||
| $(SHARED): $(OBJS) $(LIBS) | $(SHARED): $(OBJS) $(LIBS) | ||||
| @@ -954,7 +954,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| @@ -1091,7 +1091,7 @@ public: | |||||
| { | { | ||||
| const EngineEvent& event = kData->event.portIn->getEvent(i); | const EngineEvent& event = kData->event.portIn->getEvent(i); | ||||
| time = event.time - framesOffset; | |||||
| time = event.time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1451,7 +1451,7 @@ public: | |||||
| if (kData->param.data[k].midiCC > 0) | if (kData->param.data[k].midiCC > 0) | ||||
| { | { | ||||
| value = kData->param.ranges[k].normalizeValue(curValue); | value = kData->param.ranges[k].normalizeValue(curValue); | ||||
| kData->event.portOut->writeControlEvent(framesOffset, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| kData->event.portOut->writeControlEvent(0, kData->param.data[k].midiChannel, kEngineControlEventTypeParameter, kData->param.data[k].midiCC, value); | |||||
| } | } | ||||
| } | } | ||||
| @@ -893,12 +893,12 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin processing | // Plugin processing | ||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset) | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames) | |||||
| { | { | ||||
| uint32_t i, k; | uint32_t i, k; | ||||
| uint32_t midiEventCount = 0; | uint32_t midiEventCount = 0; | ||||
| vstTimeOffset = framesOffset; | |||||
| vstTimeOffset = 0; | |||||
| double aInsPeak[2] = { 0.0 }; | double aInsPeak[2] = { 0.0 }; | ||||
| double aOutsPeak[2] = { 0.0 }; | double aOutsPeak[2] = { 0.0 }; | ||||
| @@ -954,7 +954,7 @@ public: | |||||
| if (! cinEvent) | if (! cinEvent) | ||||
| continue; | continue; | ||||
| time = cinEvent->time - framesOffset; | |||||
| time = cinEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -1147,7 +1147,7 @@ public: | |||||
| if (! minEvent) | if (! minEvent) | ||||
| continue; | continue; | ||||
| time = minEvent->time - framesOffset; | |||||
| time = minEvent->time; | |||||
| if (time >= frames) | if (time >= frames) | ||||
| continue; | continue; | ||||
| @@ -223,12 +223,13 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||||
| standalone.engine->setCallback(standalone.callback, nullptr); | standalone.engine->setCallback(standalone.callback, nullptr); | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| standalone.engine->setOption(CarlaBackend::OPTION_PROCESS_MODE, static_cast<int>(standalone.options.processMode), nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_FORCE_STEREO, standalone.options.forceStereo ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_PREFER_PLUGIN_BRIDGES, standalone.options.preferPluginBridges ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_PREFER_UI_BRIDGES, standalone.options.preferUiBridges ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_PROCESS_MODE, static_cast<int>(standalone.options.processMode), nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_TRANSPORT_MODE, static_cast<int>(standalone.options.transportMode), nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_FORCE_STEREO, standalone.options.forceStereo ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_PREFER_PLUGIN_BRIDGES, standalone.options.preferPluginBridges ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_PREFER_UI_BRIDGES, standalone.options.preferUiBridges ? 1 : 0, nullptr); | |||||
| # ifdef WANT_DSSI | # ifdef WANT_DSSI | ||||
| standalone.engine->setOption(CarlaBackend::OPTION_USE_DSSI_VST_CHUNKS, standalone.options.useDssiVstChunks ? 1 : 0, nullptr); | |||||
| standalone.engine->setOption(CarlaBackend::OPTION_USE_DSSI_VST_CHUNKS, standalone.options.useDssiVstChunks ? 1 : 0, nullptr); | |||||
| # endif | # endif | ||||
| standalone.engine->setOption(CarlaBackend::OPTION_MAX_PARAMETERS, static_cast<int>(standalone.options.maxParameters), nullptr); | standalone.engine->setOption(CarlaBackend::OPTION_MAX_PARAMETERS, static_cast<int>(standalone.options.maxParameters), nullptr); | ||||
| standalone.engine->setOption(CarlaBackend::OPTION_PREFERRED_BUFFER_SIZE, static_cast<int>(standalone.options.preferredBufferSize), nullptr); | standalone.engine->setOption(CarlaBackend::OPTION_PREFERRED_BUFFER_SIZE, static_cast<int>(standalone.options.preferredBufferSize), nullptr); | ||||
| @@ -353,6 +354,13 @@ void carla_set_engine_option(CarlaBackend::OptionsType option, int value, const | |||||
| standalone.options.processMode = static_cast<CarlaBackend::ProcessMode>(value); | standalone.options.processMode = static_cast<CarlaBackend::ProcessMode>(value); | ||||
| break; | break; | ||||
| case CarlaBackend::OPTION_TRANSPORT_MODE: | |||||
| if (value < CarlaBackend::TRANSPORT_MODE_INTERNAL || value > CarlaBackend::TRANSPORT_MODE_JACK) | |||||
| return carla_stderr2("carla_set_engine_option(OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr); | |||||
| standalone.options.transportMode = static_cast<CarlaBackend::TransportMode>(value); | |||||
| break; | |||||
| case CarlaBackend::OPTION_FORCE_STEREO: | case CarlaBackend::OPTION_FORCE_STEREO: | ||||
| standalone.options.forceStereo = (value != 0); | standalone.options.forceStereo = (value != 0); | ||||
| break; | break; | ||||
| @@ -471,6 +479,35 @@ bool carla_save_project(const char* filename) | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| void carla_transport_play() | |||||
| { | |||||
| carla_debug("carla_transport_play()"); | |||||
| CARLA_ASSERT(standalone.engine != nullptr); | |||||
| if (standalone.engine != nullptr) | |||||
| return standalone.engine->transportPlay(); | |||||
| } | |||||
| void carla_transport_pause() | |||||
| { | |||||
| carla_debug("carla_transport_pause()"); | |||||
| CARLA_ASSERT(standalone.engine != nullptr); | |||||
| if (standalone.engine != nullptr) | |||||
| return standalone.engine->transportPause(); | |||||
| } | |||||
| void carla_transport_relocate(uint32_t frames) | |||||
| { | |||||
| carla_debug("carla_transport_relocate(%i)", frames); | |||||
| CARLA_ASSERT(standalone.engine != nullptr); | |||||
| if (standalone.engine != nullptr) | |||||
| return standalone.engine->transportRelocate(frames); | |||||
| } | |||||
| // ------------------------------------------------------------------------------------------------------------------- | |||||
| bool carla_add_plugin(CarlaBackend::BinaryType btype, CarlaBackend::PluginType ptype, const char* filename, const char* const name, const char* label, const void* extraStuff) | bool carla_add_plugin(CarlaBackend::BinaryType btype, CarlaBackend::PluginType ptype, const char* filename, const char* const name, const char* label, const void* extraStuff) | ||||
| { | { | ||||
| carla_debug("carla_add_plugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", CarlaBackend::BinaryType2Str(btype), CarlaBackend::PluginType2Str(ptype), filename, name, label, extraStuff); | carla_debug("carla_add_plugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", CarlaBackend::BinaryType2Str(btype), CarlaBackend::PluginType2Str(ptype), filename, name, label, extraStuff); | ||||
| @@ -75,7 +75,7 @@ debug: | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| %.cpp.o: %.cpp | |||||
| %.cpp.o: %.cpp ../CarlaEngine.hpp ../CarlaPlugin.hpp | |||||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | ||||
| $(SHARED): $(OBJS) $(LIBS) | $(SHARED): $(OBJS) $(LIBS) | ||||
| @@ -568,6 +568,10 @@ class CarlaMainW(QMainWindow): | |||||
| self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCarla()")) | self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCarla()")) | ||||
| self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) | self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) | ||||
| self.connect(self.ui.ch_transport, SIGNAL("currentIndexChanged(int)"), SLOT("slot_transportModeChanged(int)")) | |||||
| self.connect(self.ui.b_transport_play, SIGNAL("clicked(bool)"), SLOT("slot_transportPlayPause(bool)")) | |||||
| self.connect(self.ui.b_transport_stop, SIGNAL("clicked()"), SLOT("slot_transportStop()")) | |||||
| self.connect(self, SIGNAL("SIGUSR1()"), SLOT("slot_handleSIGUSR1()")) | self.connect(self, SIGNAL("SIGUSR1()"), SLOT("slot_handleSIGUSR1()")) | ||||
| self.connect(self, SIGNAL("SIGTERM()"), SLOT("slot_handleSIGTERM()")) | self.connect(self, SIGNAL("SIGTERM()"), SLOT("slot_handleSIGTERM()")) | ||||
| @@ -611,6 +615,7 @@ class CarlaMainW(QMainWindow): | |||||
| Carla.processMode = settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) | Carla.processMode = settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) | ||||
| Carla.maxParameters = settings.value("Engine/MaxParameters", MAX_DEFAULT_PARAMETERS, type=int) | Carla.maxParameters = settings.value("Engine/MaxParameters", MAX_DEFAULT_PARAMETERS, type=int) | ||||
| transportMode = settings.value("Engine/TransportMode", TRANSPORT_MODE_JACK, type=int) | |||||
| forceStereo = settings.value("Engine/ForceStereo", False, type=bool) | forceStereo = settings.value("Engine/ForceStereo", False, type=bool) | ||||
| preferPluginBridges = settings.value("Engine/PreferPluginBridges", False, type=bool) | preferPluginBridges = settings.value("Engine/PreferPluginBridges", False, type=bool) | ||||
| preferUiBridges = settings.value("Engine/PreferUiBridges", True, type=bool) | preferUiBridges = settings.value("Engine/PreferUiBridges", True, type=bool) | ||||
| @@ -667,9 +672,22 @@ class CarlaMainW(QMainWindow): | |||||
| else: | else: | ||||
| maxCount = MAX_DEFAULT_PLUGINS | maxCount = MAX_DEFAULT_PLUGINS | ||||
| self.ui.ch_transport.blockSignals(True) | |||||
| self.ui.ch_transport.addItem(self.tr("Internal")) | |||||
| if audioDriver == "JACK": | |||||
| self.ui.ch_transport.addItem(self.tr("JACK")) | |||||
| elif transportMode == TRANSPORT_MODE_JACK: | |||||
| transportMode = TRANSPORT_MODE_INTERNAL | |||||
| self.ui.ch_transport.setCurrentIndex(transportMode) | |||||
| self.ui.ch_transport.blockSignals(False) | |||||
| for x in range(maxCount): | for x in range(maxCount): | ||||
| self.fPluginList.append(None) | self.fPluginList.append(None) | ||||
| Carla.host.set_engine_option(OPTION_TRANSPORT_MODE, transportMode, "") | |||||
| # Peaks | # Peaks | ||||
| self.fIdleTimerFast = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]) | self.fIdleTimerFast = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]) | ||||
| # LEDs and edit dialog parameters | # LEDs and edit dialog parameters | ||||
| @@ -695,6 +713,12 @@ class CarlaMainW(QMainWindow): | |||||
| self.killTimer(self.fIdleTimerFast) | self.killTimer(self.fIdleTimerFast) | ||||
| self.killTimer(self.fIdleTimerSlow) | self.killTimer(self.fIdleTimerSlow) | ||||
| settings = QSettings() | |||||
| settings.setValue("Engine/TransportMode", self.ui.ch_transport.currentIndex()) | |||||
| self.ui.ch_transport.blockSignals(True) | |||||
| self.ui.ch_transport.clear() | |||||
| self.ui.ch_transport.blockSignals(False) | |||||
| def loadProject(self, filename): | def loadProject(self, filename): | ||||
| self.fProjectFilename = filename | self.fProjectFilename = filename | ||||
| self.setWindowTitle("Carla - %s" % os.path.basename(filename)) | self.setWindowTitle("Carla - %s" % os.path.basename(filename)) | ||||
| @@ -795,6 +819,8 @@ class CarlaMainW(QMainWindow): | |||||
| self.ui.act_file_open.setEnabled(check) | self.ui.act_file_open.setEnabled(check) | ||||
| self.ui.act_engine_start.setEnabled(not check) | self.ui.act_engine_start.setEnabled(not check) | ||||
| self.ui.act_engine_stop.setEnabled(check) | self.ui.act_engine_stop.setEnabled(check) | ||||
| self.ui.act_engine_configure.setEnabled(not check) | |||||
| self.ui.frame_transport.setEnabled(check) | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def slot_engineStop(self): | def slot_engineStop(self): | ||||
| @@ -803,6 +829,7 @@ class CarlaMainW(QMainWindow): | |||||
| self.ui.act_file_open.setEnabled(check) | self.ui.act_file_open.setEnabled(check) | ||||
| self.ui.act_engine_start.setEnabled(not check) | self.ui.act_engine_start.setEnabled(not check) | ||||
| self.ui.act_engine_stop.setEnabled(check) | self.ui.act_engine_stop.setEnabled(check) | ||||
| self.ui.frame_transport.setEnabled(check) | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def slot_pluginAdd(self): | def slot_pluginAdd(self): | ||||
| @@ -819,6 +846,26 @@ class CarlaMainW(QMainWindow): | |||||
| def slot_pluginRemoveAll(self): | def slot_pluginRemoveAll(self): | ||||
| self.removeAllPlugins() | self.removeAllPlugins() | ||||
| self.connect(self.ui.ch_transport, SIGNAL("currentIndexChanged(int)"), SLOT("(int)")) | |||||
| self.connect(self.ui.b_transport_play, SIGNAL("clicked(bool)"), SLOT("(bool)")) | |||||
| self.connect(self.ui.b_transport_stop, SIGNAL("clicked()"), SLOT("()")) | |||||
| @pyqtSlot(int) | |||||
| def slot_transportModeChanged(self, newMode): | |||||
| Carla.host.set_engine_option(OPTION_TRANSPORT_MODE, newMode, "") | |||||
| @pyqtSlot(bool) | |||||
| def slot_transportPlayPause(self, toggled): | |||||
| if toggled: | |||||
| Carla.host.transport_play() | |||||
| else: | |||||
| Carla.host.transport_pause() | |||||
| @pyqtSlot() | |||||
| def slot_transportStop(self): | |||||
| Carla.host.transport_pause() | |||||
| Carla.host.transport_relocate(0) | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def slot_aboutCarla(self): | def slot_aboutCarla(self): | ||||
| CarlaAboutW(self).exec_() | CarlaAboutW(self).exec_() | ||||
| @@ -191,6 +191,15 @@ class Host(object): | |||||
| self.lib.carla_save_project.argtypes = [c_char_p] | self.lib.carla_save_project.argtypes = [c_char_p] | ||||
| self.lib.carla_save_project.restype = c_bool | self.lib.carla_save_project.restype = c_bool | ||||
| self.lib.carla_transport_play.argtypes = None | |||||
| self.lib.carla_transport_play.restype = None | |||||
| self.lib.carla_transport_pause.argtypes = None | |||||
| self.lib.carla_transport_pause.restype = None | |||||
| self.lib.carla_transport_relocate.argtypes = [c_uint32] | |||||
| self.lib.carla_transport_relocate.restype = None | |||||
| self.lib.carla_add_plugin.argtypes = [c_enum, c_enum, c_char_p, c_char_p, c_char_p, c_void_p] | self.lib.carla_add_plugin.argtypes = [c_enum, c_enum, c_char_p, c_char_p, c_char_p, c_void_p] | ||||
| self.lib.carla_add_plugin.restype = c_bool | self.lib.carla_add_plugin.restype = c_bool | ||||
| @@ -395,6 +404,15 @@ class Host(object): | |||||
| def save_project(self, filename): | def save_project(self, filename): | ||||
| return self.lib.carla_save_project(filename.encode("utf-8")) | return self.lib.carla_save_project(filename.encode("utf-8")) | ||||
| def transport_play(self): | |||||
| self.lib.carla_transport_play() | |||||
| def transport_pause(self): | |||||
| self.lib.carla_transport_pause() | |||||
| def transport_relocate(self, frames): | |||||
| self.lib.carla_transport_relocate(frames) | |||||
| def add_plugin(self, btype, ptype, filename, name, label, extraStuff): | def add_plugin(self, btype, ptype, filename, name, label, extraStuff): | ||||
| cname = name.encode("utf-8") if name else c_nullptr | cname = name.encode("utf-8") if name else c_nullptr | ||||
| return self.lib.carla_add_plugin(btype, ptype, filename.encode("utf-8"), cname, label.encode("utf-8"), cast(extraStuff, c_void_p)) | return self.lib.carla_add_plugin(btype, ptype, filename.encode("utf-8"), cname, label.encode("utf-8"), cast(extraStuff, c_void_p)) | ||||
| @@ -249,29 +249,30 @@ PARAMETER_MAX = -9 | |||||
| # Options Type | # Options Type | ||||
| OPTION_PROCESS_NAME = 0 | OPTION_PROCESS_NAME = 0 | ||||
| OPTION_PROCESS_MODE = 1 | OPTION_PROCESS_MODE = 1 | ||||
| OPTION_FORCE_STEREO = 2 | |||||
| OPTION_PREFER_PLUGIN_BRIDGES = 3 | |||||
| OPTION_PREFER_UI_BRIDGES = 4 | |||||
| OPTION_USE_DSSI_VST_CHUNKS = 5 | |||||
| OPTION_MAX_PARAMETERS = 6 | |||||
| OPTION_OSC_UI_TIMEOUT = 7 | |||||
| OPTION_PREFERRED_BUFFER_SIZE = 8 | |||||
| OPTION_PREFERRED_SAMPLE_RATE = 9 | |||||
| OPTION_PATH_BRIDGE_NATIVE = 10 | |||||
| OPTION_PATH_BRIDGE_POSIX32 = 11 | |||||
| OPTION_PATH_BRIDGE_POSIX64 = 12 | |||||
| OPTION_PATH_BRIDGE_WIN32 = 13 | |||||
| OPTION_PATH_BRIDGE_WIN64 = 14 | |||||
| OPTION_PATH_BRIDGE_LV2_GTK2 = 15 | |||||
| OPTION_PATH_BRIDGE_LV2_GTK3 = 16 | |||||
| OPTION_PATH_BRIDGE_LV2_QT4 = 17 | |||||
| OPTION_PATH_BRIDGE_LV2_QT5 = 18 | |||||
| OPTION_PATH_BRIDGE_LV2_COCOA = 19 | |||||
| OPTION_PATH_BRIDGE_LV2_WINDOWS = 20 | |||||
| OPTION_PATH_BRIDGE_LV2_X11 = 21 | |||||
| OPTION_PATH_BRIDGE_VST_COCOA = 22 | |||||
| OPTION_PATH_BRIDGE_VST_HWND = 23 | |||||
| OPTION_PATH_BRIDGE_VST_X11 = 24 | |||||
| OPTION_TRANSPORT_MODE = 2 | |||||
| OPTION_FORCE_STEREO = 3 | |||||
| OPTION_PREFER_PLUGIN_BRIDGES = 4 | |||||
| OPTION_PREFER_UI_BRIDGES = 5 | |||||
| OPTION_USE_DSSI_VST_CHUNKS = 6 | |||||
| OPTION_MAX_PARAMETERS = 7 | |||||
| OPTION_OSC_UI_TIMEOUT = 8 | |||||
| OPTION_PREFERRED_BUFFER_SIZE = 9 | |||||
| OPTION_PREFERRED_SAMPLE_RATE = 10 | |||||
| OPTION_PATH_BRIDGE_NATIVE = 11 | |||||
| OPTION_PATH_BRIDGE_POSIX32 = 12 | |||||
| OPTION_PATH_BRIDGE_POSIX64 = 13 | |||||
| OPTION_PATH_BRIDGE_WIN32 = 14 | |||||
| OPTION_PATH_BRIDGE_WIN64 = 15 | |||||
| OPTION_PATH_BRIDGE_LV2_GTK2 = 16 | |||||
| OPTION_PATH_BRIDGE_LV2_GTK3 = 17 | |||||
| OPTION_PATH_BRIDGE_LV2_QT4 = 18 | |||||
| OPTION_PATH_BRIDGE_LV2_QT5 = 19 | |||||
| OPTION_PATH_BRIDGE_LV2_COCOA = 20 | |||||
| OPTION_PATH_BRIDGE_LV2_WINDOWS = 21 | |||||
| OPTION_PATH_BRIDGE_LV2_X11 = 22 | |||||
| OPTION_PATH_BRIDGE_VST_COCOA = 23 | |||||
| OPTION_PATH_BRIDGE_VST_HWND = 24 | |||||
| OPTION_PATH_BRIDGE_VST_X11 = 25 | |||||
| # Callback Type | # Callback Type | ||||
| CALLBACK_DEBUG = 0 | CALLBACK_DEBUG = 0 | ||||
| @@ -298,12 +299,16 @@ CALLBACK_NSM_SAVE = 20 | |||||
| CALLBACK_ERROR = 21 | CALLBACK_ERROR = 21 | ||||
| CALLBACK_QUIT = 22 | CALLBACK_QUIT = 22 | ||||
| # Process Mode Type | |||||
| # Process Mode | |||||
| PROCESS_MODE_SINGLE_CLIENT = 0 | PROCESS_MODE_SINGLE_CLIENT = 0 | ||||
| PROCESS_MODE_MULTIPLE_CLIENTS = 1 | PROCESS_MODE_MULTIPLE_CLIENTS = 1 | ||||
| PROCESS_MODE_CONTINUOUS_RACK = 2 | PROCESS_MODE_CONTINUOUS_RACK = 2 | ||||
| PROCESS_MODE_PATCHBAY = 3 | PROCESS_MODE_PATCHBAY = 3 | ||||
| # Transport Mode | |||||
| TRANSPORT_MODE_INTERNAL = 0 | |||||
| TRANSPORT_MODE_JACK = 1 | |||||
| # Set BINARY_NATIVE | # Set BINARY_NATIVE | ||||
| if HAIKU or LINUX or MACOS: | if HAIKU or LINUX or MACOS: | ||||
| BINARY_NATIVE = BINARY_POSIX64 if kIs64bit else BINARY_POSIX32 | BINARY_NATIVE = BINARY_POSIX64 if kIs64bit else BINARY_POSIX32 | ||||
| @@ -248,6 +248,15 @@ int jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const ja | |||||
| // ----------------------------------------------------------------------------- | // ----------------------------------------------------------------------------- | ||||
| int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame) | |||||
| { | |||||
| #ifndef JACKBRIDGE_DUMMY | |||||
| return jack_transport_locate(client, frame); | |||||
| #else | |||||
| return 0; | |||||
| #endif | |||||
| } | |||||
| jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos) | jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos) | ||||
| { | { | ||||
| #ifndef JACKBRIDGE_DUMMY | #ifndef JACKBRIDGE_DUMMY | ||||
| @@ -256,3 +265,17 @@ jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, j | |||||
| return JackTransportStopped; | return JackTransportStopped; | ||||
| #endif | #endif | ||||
| } | } | ||||
| void jackbridge_transport_start(jack_client_t* client) | |||||
| { | |||||
| #ifndef JACKBRIDGE_DUMMY | |||||
| jack_transport_start(client); | |||||
| #endif | |||||
| } | |||||
| void jackbridge_transport_stop(jack_client_t* client) | |||||
| { | |||||
| #ifndef JACKBRIDGE_DUMMY | |||||
| jack_transport_stop(client); | |||||
| #endif | |||||
| } | |||||
| @@ -67,7 +67,10 @@ BRIDGE_EXPORT void jackbridge_midi_clear_buffer(void* port_buffer); | |||||
| BRIDGE_EXPORT jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size); | BRIDGE_EXPORT jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size); | ||||
| BRIDGE_EXPORT int jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size); | BRIDGE_EXPORT int jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size); | ||||
| BRIDGE_EXPORT int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame); | |||||
| BRIDGE_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos); | BRIDGE_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos); | ||||
| BRIDGE_EXPORT void jackbridge_transport_start(jack_client_t* client); | |||||
| BRIDGE_EXPORT void jackbridge_transport_stop(jack_client_t* client); | |||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| @@ -103,7 +106,10 @@ BRIDGE_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_clien | |||||
| #define jackbridge_midi_event_reserve jack_midi_event_reserve | #define jackbridge_midi_event_reserve jack_midi_event_reserve | ||||
| #define jackbridge_midi_event_write jack_midi_event_write | #define jackbridge_midi_event_write jack_midi_event_write | ||||
| #define jackbridge_transport_locate jack_transport_locate | |||||
| #define jackbridge_transport_query jack_transport_query | #define jackbridge_transport_query jack_transport_query | ||||
| #define jackbridge_transport_start jack_transport_start | |||||
| #define jackbridge_transport_stop jack_transport_stop | |||||
| #endif // JACKBRIDGE_EXPORT | #endif // JACKBRIDGE_EXPORT | ||||
| @@ -204,6 +204,8 @@ const char* OptionsType2Str(const OptionsType& type) | |||||
| return "OPTION_PROCESS_NAME"; | return "OPTION_PROCESS_NAME"; | ||||
| case OPTION_PROCESS_MODE: | case OPTION_PROCESS_MODE: | ||||
| return "OPTION_PROCESS_MODE"; | return "OPTION_PROCESS_MODE"; | ||||
| case OPTION_TRANSPORT_MODE: | |||||
| return "OPTION_TRANSPORT_MODE"; | |||||
| case OPTION_FORCE_STEREO: | case OPTION_FORCE_STEREO: | ||||
| return "OPTION_FORCE_STEREO"; | return "OPTION_FORCE_STEREO"; | ||||
| case OPTION_PREFER_PLUGIN_BRIDGES: | case OPTION_PREFER_PLUGIN_BRIDGES: | ||||