| @@ -1793,13 +1793,6 @@ | |||||
| <string>Main</string> | <string>Main</string> | ||||
| </property> | </property> | ||||
| <layout class="QVBoxLayout" name="verticalLayout_17"> | <layout class="QVBoxLayout" name="verticalLayout_17"> | ||||
| <item> | |||||
| <widget class="QCheckBox" name="ch_exp_transport"> | |||||
| <property name="text"> | |||||
| <string>Enable transport controls</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item> | <item> | ||||
| <widget class="QCheckBox" name="cb_exp_plugin_bridges"> | <widget class="QCheckBox" name="cb_exp_plugin_bridges"> | ||||
| <property name="text"> | <property name="text"> | ||||
| @@ -497,43 +497,77 @@ const char* carla_get_complete_license_text() | |||||
| return retText; | return retText; | ||||
| } | } | ||||
| const char* carla_get_supported_file_extensions() | |||||
| const char* const* carla_get_supported_file_extensions() | |||||
| { | { | ||||
| carla_debug("carla_get_supported_file_extensions()"); | carla_debug("carla_get_supported_file_extensions()"); | ||||
| static CarlaString retText; | |||||
| if (retText.isEmpty()) | |||||
| { | |||||
| retText = | |||||
| // NOTE: please keep in sync with CarlaEngine::loadFile!! | |||||
| static const char* const extensions[] = { | |||||
| // Base types | // Base types | ||||
| "*.carxp;*.carxs" | |||||
| // MIDI files | |||||
| ";*.mid;*.midi" | |||||
| "carxp", "carxs", | |||||
| // plugin files and resources | |||||
| #ifdef HAVE_FLUIDSYNTH | #ifdef HAVE_FLUIDSYNTH | ||||
| // fluidsynth (sf2) | |||||
| ";*.sf2" | |||||
| "sf2", | |||||
| #endif | #endif | ||||
| #ifdef HAVE_LINUXSAMPLER | #ifdef HAVE_LINUXSAMPLER | ||||
| // linuxsampler (gig and sfz) | |||||
| ";*.gig;*.sfz" | |||||
| "gig", "sfz", | |||||
| #endif | #endif | ||||
| #ifdef HAVE_ZYN_DEPS | #ifdef HAVE_ZYN_DEPS | ||||
| // zynaddsubfx presets | |||||
| ";*.xmz;*.xiz" | |||||
| "xmz", "xiz", | |||||
| #endif | |||||
| #if defined(CARLA_OS_MAC) | |||||
| "vst", | |||||
| #else | |||||
| "dll", | |||||
| "so", | |||||
| #endif | #endif | ||||
| ; | |||||
| // Audio files | // Audio files | ||||
| #ifdef HAVE_SNDFILE | #ifdef HAVE_SNDFILE | ||||
| retText += ";*.aiff;*.flac;*.oga;*.ogg;*.w64;*.wav"; | |||||
| "aif", "aiff", "bwf", "flac", "oga", "ogg", "w64", "wav", | |||||
| #endif | #endif | ||||
| #ifdef HAVE_FFMPEG | #ifdef HAVE_FFMPEG | ||||
| retText += ";*.3g2;*.3gp;*.aac;*.ac3;*.amr;*.ape;*.mp2;*.mp3;*.mpc;*.wma"; | |||||
| "3g2", "3gp", "aac", "ac3", "amr", "ape", "mp2", "mp3", "mpc", "wma", | |||||
| #endif | #endif | ||||
| } | |||||
| return retText; | |||||
| // MIDI files | |||||
| "mid", "midi", | |||||
| // terminator | |||||
| nullptr | |||||
| }; | |||||
| return extensions; | |||||
| } | |||||
| const char* const* carla_get_supported_features() | |||||
| { | |||||
| carla_debug("carla_get_supported_features()"); | |||||
| static const char* const features[] = { | |||||
| #ifdef HAVE_FLUIDSYNTH | |||||
| "sf2", | |||||
| #endif | |||||
| #ifdef HAVE_HYLIA | |||||
| "link", | |||||
| #endif | |||||
| #ifdef HAVE_LIBLO | |||||
| "osc", | |||||
| #endif | |||||
| #if defined(HAVE_LIBMAGIC) || defined(CARLA_OS_WIN) | |||||
| "bridges", | |||||
| #endif | |||||
| #ifdef HAVE_LINUXSAMPLER | |||||
| "gig", "sfz", | |||||
| #endif | |||||
| #ifdef HAVE_PYQT | |||||
| "gui", | |||||
| #endif | |||||
| nullptr | |||||
| }; | |||||
| return features; | |||||
| } | } | ||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla Plugin Host | * Carla Plugin Host | ||||
| * Copyright (C) 2011-2014 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
| @@ -130,13 +130,14 @@ typedef struct _CarlaCachedPluginInfo { | |||||
| CARLA_EXPORT const char* carla_get_complete_license_text(); | CARLA_EXPORT const char* carla_get_complete_license_text(); | ||||
| /*! | /*! | ||||
| * Get all the supported file extensions in carla_load_file(). | |||||
| * Returned string uses this syntax: | |||||
| * @code | |||||
| * "*.ext1;*.ext2;*.ext3" | |||||
| * @endcode | |||||
| * Get the list of supported file extensions in carla_load_file(). | |||||
| */ | */ | ||||
| CARLA_EXPORT const char* carla_get_supported_file_extensions(); | |||||
| CARLA_EXPORT const char* const* carla_get_supported_file_extensions(); | |||||
| /*! | |||||
| * Get the list of supported features in the current Carla build. | |||||
| */ | |||||
| CARLA_EXPORT const char* const* carla_get_supported_features(); | |||||
| /*! | /*! | ||||
| * Get how many cached plugins are available. | * Get how many cached plugins are available. | ||||
| @@ -1028,6 +1028,7 @@ bool CarlaEngine::loadFile(const char* const filename) | |||||
| const uint curPluginId(pData->nextPluginId < pData->curPluginCount ? pData->nextPluginId : pData->curPluginCount); | const uint curPluginId(pData->nextPluginId < pData->curPluginCount ? pData->nextPluginId : pData->curPluginCount); | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // NOTE: please keep in sync with carla_get_supported_file_extensions!! | |||||
| if (extension == "carxp" || extension == "carxs") | if (extension == "carxp" || extension == "carxs") | ||||
| return loadProject(filename); | return loadProject(filename); | ||||
| @@ -1045,7 +1046,31 @@ bool CarlaEngine::loadFile(const char* const filename) | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| if (extension == "aif" || extension == "aiff" || extension == "bwf" || extension == "flac" || extension == "ogg" || extension == "wav") | |||||
| if ( | |||||
| #ifdef HAVE_SNDFILE | |||||
| extension == "aif" || | |||||
| extension == "aiff" || | |||||
| extension == "bwf" || | |||||
| extension == "flac" || | |||||
| extension == "oga" || | |||||
| extension == "ogg" || | |||||
| extension == "w64" || | |||||
| extension == "wav" || | |||||
| #endif | |||||
| #ifdef HAVE_FFMPEG | |||||
| extension == "3g2" || | |||||
| extension == "3gp" || | |||||
| extension == "aac" || | |||||
| extension == "ac3" || | |||||
| extension == "amr" || | |||||
| extension == "ape" || | |||||
| extension == "mp2" || | |||||
| extension == "mp3" || | |||||
| extension == "mpc" || | |||||
| extension == "wma" || | |||||
| #endif | |||||
| false | |||||
| ) | |||||
| { | { | ||||
| if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr)) | if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr)) | ||||
| { | { | ||||
| @@ -32,7 +32,7 @@ uint8_t EngineControlEvent::convertToMidiData(const uint8_t channel, uint8_t dat | |||||
| break; | break; | ||||
| case kEngineControlEventTypeParameter: | case kEngineControlEventTypeParameter: | ||||
| CARLA_SAFE_ASSERT_RETURN(param >= MAX_MIDI_VALUE, 0); | |||||
| CARLA_SAFE_ASSERT_RETURN(param < MAX_MIDI_VALUE, 0); | |||||
| data[0] = static_cast<uint8_t>(MIDI_STATUS_CONTROL_CHANGE | (channel & MIDI_CHANNEL_BIT)); | data[0] = static_cast<uint8_t>(MIDI_STATUS_CONTROL_CHANGE | (channel & MIDI_CHANNEL_BIT)); | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla Plugin Host | * Carla Plugin Host | ||||
| * Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla Plugin Host | * Carla Plugin Host | ||||
| * Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
| @@ -830,7 +830,7 @@ class SearchPluginsThread(QThread): | |||||
| def _pluginLook(self, percent, plugin): | def _pluginLook(self, percent, plugin): | ||||
| self.pluginLook.emit(percent, plugin) | self.pluginLook.emit(percent, plugin) | ||||
| # ---------------------------------------------------------------------------------------------------------------------- | |||||
| # --------------------------------------------------------------------------------------------------------------------- | |||||
| # Plugin Refresh Dialog | # Plugin Refresh Dialog | ||||
| class PluginRefreshW(QDialog): | class PluginRefreshW(QDialog): | ||||
| @@ -844,7 +844,7 @@ class PluginRefreshW(QDialog): | |||||
| # kdevelop likes this :) | # kdevelop likes this :) | ||||
| self.host = host = CarlaHostNull() | self.host = host = CarlaHostNull() | ||||
| # -------------------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Internal stuff | # Internal stuff | ||||
| hasNative = os.path.exists(os.path.join(self.host.pathBinaries, "carla-discovery-native")) | hasNative = os.path.exists(os.path.join(self.host.pathBinaries, "carla-discovery-native")) | ||||
| @@ -857,7 +857,7 @@ class PluginRefreshW(QDialog): | |||||
| self.fIconYes = getIcon("dialog-ok-apply").pixmap(16, 16) | self.fIconYes = getIcon("dialog-ok-apply").pixmap(16, 16) | ||||
| self.fIconNo = getIcon("dialog-error").pixmap(16, 16) | self.fIconNo = getIcon("dialog-error").pixmap(16, 16) | ||||
| # -------------------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Set-up GUI | # Set-up GUI | ||||
| self.ui.b_skip.setVisible(False) | self.ui.b_skip.setVisible(False) | ||||
| @@ -949,12 +949,12 @@ class PluginRefreshW(QDialog): | |||||
| self.ui.ch_dssi.setEnabled(False) | self.ui.ch_dssi.setEnabled(False) | ||||
| self.ui.ch_vst.setEnabled(False) | self.ui.ch_vst.setEnabled(False) | ||||
| # -------------------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Load settings | # Load settings | ||||
| self.loadSettings() | self.loadSettings() | ||||
| # ---------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Hide bridges if disabled | # Hide bridges if disabled | ||||
| if not host.showPluginBridges: | if not host.showPluginBridges: | ||||
| @@ -995,12 +995,27 @@ class PluginRefreshW(QDialog): | |||||
| self.ui.label_win32.hide() | self.ui.label_win32.hide() | ||||
| self.ui.label_win64.hide() | self.ui.label_win64.hide() | ||||
| # ---------------------------------------------------------------------------------------------------- | |||||
| # Disable non-supported features | |||||
| features = gCarla.utils.get_supported_features() | |||||
| if "gig" not in features: | |||||
| self.ui.ch_gig.setChecked(False) | |||||
| self.ui.ch_gig.setEnabled(False) | |||||
| if "sf2" not in features: | |||||
| self.ui.ch_sf2.setChecked(False) | |||||
| self.ui.ch_sf2.setEnabled(False) | |||||
| if "sfz" not in features: | |||||
| self.ui.ch_sfz.setChecked(False) | |||||
| self.ui.ch_sfz.setEnabled(False) | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Resize to minimum size, as it's very likely UI stuff was hidden | # Resize to minimum size, as it's very likely UI stuff was hidden | ||||
| self.resize(self.minimumSize()) | self.resize(self.minimumSize()) | ||||
| # -------------------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Set-up connections | # Set-up connections | ||||
| self.finished.connect(self.slot_saveSettings) | self.finished.connect(self.slot_saveSettings) | ||||
| @@ -1021,12 +1036,12 @@ class PluginRefreshW(QDialog): | |||||
| self.fThread.pluginLook.connect(self.slot_handlePluginLook) | self.fThread.pluginLook.connect(self.slot_handlePluginLook) | ||||
| self.fThread.finished.connect(self.slot_handlePluginThreadFinished) | self.fThread.finished.connect(self.slot_handlePluginThreadFinished) | ||||
| # -------------------------------------------------------------------------------------------------------------- | |||||
| # ------------------------------------------------------------------------------------------------------------- | |||||
| # Post-connect setup | # Post-connect setup | ||||
| self.slot_checkTools() | self.slot_checkTools() | ||||
| # ------------------------------------------------------------------------------------------------------------------ | |||||
| # ----------------------------------------------------------------------------------------------------------------- | |||||
| def loadSettings(self): | def loadSettings(self): | ||||
| settings = QSettings("falkTX", "CarlaRefresh2") | settings = QSettings("falkTX", "CarlaRefresh2") | ||||
| @@ -267,9 +267,11 @@ class HostWindow(QMainWindow): | |||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| # Set up GUI (disk) | # Set up GUI (disk) | ||||
| exts = gCarla.utils.get_supported_file_extensions() | |||||
| self.fDirModel = QFileSystemModel(self) | self.fDirModel = QFileSystemModel(self) | ||||
| self.fDirModel.setRootPath(HOME) | self.fDirModel.setRootPath(HOME) | ||||
| self.fDirModel.setNameFilters(gCarla.utils.get_supported_file_extensions().split(";")) | |||||
| self.fDirModel.setNameFilters(tuple(("*." + i) for i in exts)) | |||||
| self.ui.fileTreeView.setModel(self.fDirModel) | self.ui.fileTreeView.setModel(self.fDirModel) | ||||
| self.ui.fileTreeView.setRootIndex(self.fDirModel.index(HOME)) | self.ui.fileTreeView.setRootIndex(self.fDirModel.index(HOME)) | ||||
| @@ -306,10 +308,16 @@ class HostWindow(QMainWindow): | |||||
| self.ui.b_transport_stop.setEnabled(False) | self.ui.b_transport_stop.setEnabled(False) | ||||
| self.ui.b_transport_backwards.setEnabled(False) | self.ui.b_transport_backwards.setEnabled(False) | ||||
| self.ui.b_transport_forwards.setEnabled(False) | self.ui.b_transport_forwards.setEnabled(False) | ||||
| self.ui.group_transport_controls.setEnabled(False) | |||||
| self.ui.group_transport_controls.setVisible(False) | |||||
| self.ui.cb_transport_link.setEnabled(False) | self.ui.cb_transport_link.setEnabled(False) | ||||
| self.ui.cb_transport_link.setVisible(False) | |||||
| self.ui.cb_transport_jack.setEnabled(False) | |||||
| self.ui.cb_transport_jack.setVisible(False) | |||||
| self.ui.dsb_transport_bpm.setEnabled(False) | self.ui.dsb_transport_bpm.setEnabled(False) | ||||
| self.ui.dsb_transport_bpm.setReadOnly(True) | |||||
| if MACOS: | |||||
| if MACOS: # FIXME | |||||
| self.ui.cb_transport_link.setEnabled(False) | self.ui.cb_transport_link.setEnabled(False) | ||||
| self.ui.w_transport.setEnabled(False) | self.ui.w_transport.setEnabled(False) | ||||
| @@ -511,16 +519,23 @@ class HostWindow(QMainWindow): | |||||
| self.ui.text_logs.clear() | self.ui.text_logs.clear() | ||||
| self.setProperWindowTitle() | self.setProperWindowTitle() | ||||
| # Disable non-supported features | |||||
| features = gCarla.utils.get_supported_features() | |||||
| if "link" not in features: | |||||
| self.ui.cb_transport_link.setEnabled(False) | |||||
| self.ui.cb_transport_link.setVisible(False) | |||||
| # Plugin needs to have timers always running so it receives messages | |||||
| if self.host.isPlugin: | |||||
| self.startTimers() | |||||
| # Qt needs this so it properly creates & resizes the canvas | # Qt needs this so it properly creates & resizes the canvas | ||||
| self.ui.tabWidget.blockSignals(True) | self.ui.tabWidget.blockSignals(True) | ||||
| self.ui.tabWidget.setCurrentIndex(1) | self.ui.tabWidget.setCurrentIndex(1) | ||||
| self.ui.tabWidget.setCurrentIndex(0) | self.ui.tabWidget.setCurrentIndex(0) | ||||
| self.ui.tabWidget.blockSignals(False) | self.ui.tabWidget.blockSignals(False) | ||||
| # Plugin needs to have timers always running so it receives messages | |||||
| if self.host.isPlugin: | |||||
| self.startTimers() | |||||
| # Start in patchbay tab if using forced patchbay mode | # Start in patchbay tab if using forced patchbay mode | ||||
| if host.processModeForced and host.processMode == ENGINE_PROCESS_MODE_PATCHBAY and not host.isControl: | if host.processModeForced and host.processMode == ENGINE_PROCESS_MODE_PATCHBAY and not host.isControl: | ||||
| self.ui.tabWidget.setCurrentIndex(1) | self.ui.tabWidget.setCurrentIndex(1) | ||||
| @@ -771,6 +786,7 @@ class HostWindow(QMainWindow): | |||||
| self.ui.menu_PluginMacros.setEnabled(True) | self.ui.menu_PluginMacros.setEnabled(True) | ||||
| self.ui.menu_Canvas.setEnabled(True) | self.ui.menu_Canvas.setEnabled(True) | ||||
| self.ui.w_transport.setEnabled(True) | |||||
| self.ui.act_canvas_show_internal.blockSignals(True) | self.ui.act_canvas_show_internal.blockSignals(True) | ||||
| self.ui.act_canvas_show_external.blockSignals(True) | self.ui.act_canvas_show_external.blockSignals(True) | ||||
| @@ -794,7 +810,7 @@ class HostWindow(QMainWindow): | |||||
| self.ui.act_file_save.setEnabled(canSave) | self.ui.act_file_save.setEnabled(canSave) | ||||
| self.ui.act_engine_start.setEnabled(False) | self.ui.act_engine_start.setEnabled(False) | ||||
| self.ui.act_engine_stop.setEnabled(True) | self.ui.act_engine_stop.setEnabled(True) | ||||
| self.ui.w_transport.setEnabled(transportMode != ENGINE_TRANSPORT_MODE_DISABLED) | |||||
| self.enableTransport(transportMode != ENGINE_TRANSPORT_MODE_DISABLED) | |||||
| if self.host.isPlugin or not self.fSessionManagerName: | if self.host.isPlugin or not self.fSessionManagerName: | ||||
| self.ui.act_file_open.setEnabled(True) | self.ui.act_file_open.setEnabled(True) | ||||
| @@ -817,12 +833,12 @@ class HostWindow(QMainWindow): | |||||
| self.ui.menu_PluginMacros.setEnabled(False) | self.ui.menu_PluginMacros.setEnabled(False) | ||||
| self.ui.menu_Canvas.setEnabled(False) | self.ui.menu_Canvas.setEnabled(False) | ||||
| self.ui.w_transport.setEnabled(False) | |||||
| if not (self.host.isControl or self.host.isPlugin): | if not (self.host.isControl or self.host.isPlugin): | ||||
| self.ui.act_file_save.setEnabled(False) | self.ui.act_file_save.setEnabled(False) | ||||
| self.ui.act_engine_start.setEnabled(True) | self.ui.act_engine_start.setEnabled(True) | ||||
| self.ui.act_engine_stop.setEnabled(False) | self.ui.act_engine_stop.setEnabled(False) | ||||
| self.ui.w_transport.setEnabled(False) | |||||
| if self.host.isPlugin or not self.fSessionManagerName: | if self.host.isPlugin or not self.fSessionManagerName: | ||||
| self.ui.act_file_open.setEnabled(False) | self.ui.act_file_open.setEnabled(False) | ||||
| @@ -1530,29 +1546,15 @@ class HostWindow(QMainWindow): | |||||
| self.ui.act_add_jack.setVisible(False) | self.ui.act_add_jack.setVisible(False) | ||||
| if not (self.host.isControl or self.host.isPlugin): | if not (self.host.isControl or self.host.isPlugin): | ||||
| if self.host.experimental: | |||||
| if settings.value(CARLA_KEY_EXPERIMENTAL_TRANSPORT, CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT, type=bool): | |||||
| if self.ui.cb_transport_jack.isChecked(): | |||||
| transportMode = ENGINE_TRANSPORT_MODE_JACK | |||||
| else: | |||||
| transportMode = ENGINE_TRANSPORT_MODE_INTERNAL | |||||
| transportExtra = ":link:" if self.ui.cb_transport_link.isChecked() else "" | |||||
| else: | |||||
| # Stop transport if becoming disabled | |||||
| if self.ui.w_transport.isEnabled() and self.host.is_engine_running(): | |||||
| self.host.transport_pause() | |||||
| self.host.transport_relocate(0) | |||||
| self.host.transport_pause() | |||||
| transportMode = ENGINE_TRANSPORT_MODE_DISABLED | |||||
| transportExtra = "" | |||||
| self.ui.w_transport.setEnabled(transportMode != ENGINE_TRANSPORT_MODE_DISABLED) | |||||
| self.host.transportMode = transportMode | |||||
| self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, transportMode, transportExtra) | |||||
| if self.ui.cb_transport_jack.isChecked(): | |||||
| transportMode = ENGINE_TRANSPORT_MODE_JACK | |||||
| else: | else: | ||||
| self.ui.w_transport.setEnabled(False) | |||||
| transportMode = ENGINE_TRANSPORT_MODE_INTERNAL | |||||
| transportExtra = ":link:" if self.ui.cb_transport_link.isChecked() else "" | |||||
| self.enableTransport(transportMode != ENGINE_TRANSPORT_MODE_DISABLED) | |||||
| self.host.transportMode = transportMode | |||||
| self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, transportMode, transportExtra) | |||||
| self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY] else 0 | self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY] else 0 | ||||
| @@ -1562,6 +1564,10 @@ class HostWindow(QMainWindow): | |||||
| # -------------------------------------------------------------------------------------------------------- | # -------------------------------------------------------------------------------------------------------- | ||||
| # Settings (helpers) | # Settings (helpers) | ||||
| def enableTransport(self, enabled): | |||||
| self.ui.group_transport_controls.setEnabled(enabled) | |||||
| self.ui.group_transport_settings.setEnabled(enabled) | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def slot_restoreCanvasScrollbarValues(self): | def slot_restoreCanvasScrollbarValues(self): | ||||
| settings = QSettings() | settings = QSettings() | ||||
| @@ -517,10 +517,6 @@ class CarlaSettingsW(QDialog): | |||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| # Experimental | # Experimental | ||||
| self.ui.ch_exp_transport.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_TRANSPORT, | |||||
| CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT, | |||||
| type=bool)) | |||||
| self.ui.ch_exp_jack_apps.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_JACK_APPS, | self.ui.ch_exp_jack_apps.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_JACK_APPS, | ||||
| CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS, | CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS, | ||||
| type=bool)) | type=bool)) | ||||
| @@ -692,7 +688,6 @@ class CarlaSettingsW(QDialog): | |||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| # Experimental | # Experimental | ||||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_TRANSPORT, self.ui.ch_exp_transport.isChecked()) | |||||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_JACK_APPS, self.ui.ch_exp_jack_apps.isChecked()) | settings.setValue(CARLA_KEY_EXPERIMENTAL_JACK_APPS, self.ui.ch_exp_jack_apps.isChecked()) | ||||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked()) | settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked()) | ||||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked()) | settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked()) | ||||
| @@ -846,7 +841,6 @@ class CarlaSettingsW(QDialog): | |||||
| self.ui.cb_canvas_render_hq_aa.setChecked(CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING and self.ui.cb_canvas_render_hq_aa.isEnabled()) | self.ui.cb_canvas_render_hq_aa.setChecked(CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING and self.ui.cb_canvas_render_hq_aa.isEnabled()) | ||||
| self.ui.ch_engine_force_stereo.setChecked(CARLA_DEFAULT_FORCE_STEREO) | self.ui.ch_engine_force_stereo.setChecked(CARLA_DEFAULT_FORCE_STEREO) | ||||
| self.ui.ch_engine_prefer_plugin_bridges.setChecked(CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES) | self.ui.ch_engine_prefer_plugin_bridges.setChecked(CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES) | ||||
| self.ui.ch_exp_transport.setChecked(CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT) | |||||
| # -------------------------------------------------------------------------------------------------------- | # -------------------------------------------------------------------------------------------------------- | ||||
| @@ -233,7 +233,6 @@ CARLA_KEY_WINE_RT_PRIO_ENABLED = "Wine/RtPrioEnabled" # bool | |||||
| CARLA_KEY_WINE_BASE_RT_PRIO = "Wine/BaseRtPrio" # int | CARLA_KEY_WINE_BASE_RT_PRIO = "Wine/BaseRtPrio" # int | ||||
| CARLA_KEY_WINE_SERVER_RT_PRIO = "Wine/ServerRtPrio" # int | CARLA_KEY_WINE_SERVER_RT_PRIO = "Wine/ServerRtPrio" # int | ||||
| CARLA_KEY_EXPERIMENTAL_TRANSPORT = "Experimental/Transport" # bool | |||||
| CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES = "Experimental/PluginBridges" # bool | CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES = "Experimental/PluginBridges" # bool | ||||
| CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES = "Experimental/WineBridges" # bool | CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES = "Experimental/WineBridges" # bool | ||||
| CARLA_KEY_EXPERIMENTAL_JACK_APPS = "Experimental/JackApplications" # bool | CARLA_KEY_EXPERIMENTAL_JACK_APPS = "Experimental/JackApplications" # bool | ||||
| @@ -306,7 +305,6 @@ CARLA_DEFAULT_WINE_BASE_RT_PRIO = 15 | |||||
| CARLA_DEFAULT_WINE_SERVER_RT_PRIO = 10 | CARLA_DEFAULT_WINE_SERVER_RT_PRIO = 10 | ||||
| # Experimental | # Experimental | ||||
| CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT = False | |||||
| CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES = False | CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES = False | ||||
| CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES = False | CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES = False | ||||
| CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS = False | CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS = False | ||||
| @@ -165,7 +165,10 @@ class CarlaUtils(object): | |||||
| self.lib.carla_get_complete_license_text.restype = c_char_p | self.lib.carla_get_complete_license_text.restype = c_char_p | ||||
| self.lib.carla_get_supported_file_extensions.argtypes = None | self.lib.carla_get_supported_file_extensions.argtypes = None | ||||
| self.lib.carla_get_supported_file_extensions.restype = c_char_p | |||||
| self.lib.carla_get_supported_file_extensions.restype = POINTER(c_char_p) | |||||
| self.lib.carla_get_supported_features.argtypes = None | |||||
| self.lib.carla_get_supported_features.restype = POINTER(c_char_p) | |||||
| self.lib.carla_get_cached_plugin_count.argtypes = [c_enum, c_char_p] | self.lib.carla_get_cached_plugin_count.argtypes = [c_enum, c_char_p] | ||||
| self.lib.carla_get_cached_plugin_count.restype = c_uint | self.lib.carla_get_cached_plugin_count.restype = c_uint | ||||
| @@ -262,13 +265,13 @@ class CarlaUtils(object): | |||||
| def get_complete_license_text(self): | def get_complete_license_text(self): | ||||
| return charPtrToString(self.lib.carla_get_complete_license_text()) | return charPtrToString(self.lib.carla_get_complete_license_text()) | ||||
| # Get all the supported file extensions in carla_load_file(). | |||||
| # Returned string uses this syntax: | |||||
| # @code | |||||
| # "*.ext1;*.ext2;*.ext3" | |||||
| # @endcode | |||||
| # Get the list of supported file extensions in carla_load_file(). | |||||
| def get_supported_file_extensions(self): | def get_supported_file_extensions(self): | ||||
| return charPtrToString(self.lib.carla_get_supported_file_extensions()) | |||||
| return charPtrPtrToStringList(self.lib.carla_get_supported_file_extensions()) | |||||
| # Get the list of supported features in the current Carla build. | |||||
| def get_supported_features(self): | |||||
| return charPtrPtrToStringList(self.lib.carla_get_supported_features()) | |||||
| # Get how many internal plugins are available. | # Get how many internal plugins are available. | ||||
| def get_cached_plugin_count(self, ptype, pluginPath): | def get_cached_plugin_count(self, ptype, pluginPath): | ||||
| @@ -194,16 +194,9 @@ class RackListWidget(QListWidget): | |||||
| host = CarlaHostNull() | host = CarlaHostNull() | ||||
| self.host = host | self.host = host | ||||
| exts = gCarla.utils.get_supported_file_extensions().split(";") | |||||
| exts = gCarla.utils.get_supported_file_extensions() | |||||
| if WINDOWS or (LINUX and not MACOS): | |||||
| # FIXME not for disabled bridges | |||||
| exts.append(".dll") | |||||
| if not (MACOS or WINDOWS): | |||||
| exts.append(".so") | |||||
| self.fSupportedExtensions = tuple(i.replace("*","").lower() for i in exts) | |||||
| self.fSupportedExtensions = tuple(("." + i) for i in exts) | |||||
| self.fLastSelectedItem = None | self.fLastSelectedItem = None | ||||
| self.fWasLastDragValid = False | self.fWasLastDragValid = False | ||||