Browse Source

Merge branch 'master' of github.com:falkTX/Carla

tags/v1.9.9
falkTX 7 years ago
parent
commit
c3fe8c40a8
13 changed files with 163 additions and 101 deletions
  1. +0
    -7
      resources/ui/carla_settings.ui
  2. +54
    -20
      source/backend/CarlaUtils.cpp
  3. +8
    -7
      source/backend/CarlaUtils.h
  4. +26
    -1
      source/backend/engine/CarlaEngine.cpp
  5. +1
    -1
      source/backend/engine/CarlaEngineData.cpp
  6. +1
    -1
      source/backend/engine/CarlaEngineInternal.cpp
  7. +1
    -1
      source/backend/engine/CarlaEngineInternal.hpp
  8. +24
    -9
      source/carla_database.py
  9. +36
    -30
      source/carla_host.py
  10. +0
    -6
      source/carla_settings.py
  11. +0
    -2
      source/carla_shared.py
  12. +10
    -7
      source/carla_utils.py
  13. +2
    -9
      source/widgets/racklistwidget.py

+ 0
- 7
resources/ui/carla_settings.ui View File

@@ -1793,13 +1793,6 @@
<string>Main</string>
</property>
<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>
<widget class="QCheckBox" name="cb_exp_plugin_bridges">
<property name="text">


+ 54
- 20
source/backend/CarlaUtils.cpp View File

@@ -497,43 +497,77 @@ const char* carla_get_complete_license_text()
return retText;
}

const char* carla_get_supported_file_extensions()
const char* const* 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
"*.carxp;*.carxs"
// MIDI files
";*.mid;*.midi"
"carxp", "carxs",

// plugin files and resources
#ifdef HAVE_FLUIDSYNTH
// fluidsynth (sf2)
";*.sf2"
"sf2",
#endif
#ifdef HAVE_LINUXSAMPLER
// linuxsampler (gig and sfz)
";*.gig;*.sfz"
"gig", "sfz",
#endif
#ifdef HAVE_ZYN_DEPS
// zynaddsubfx presets
";*.xmz;*.xiz"
"xmz", "xiz",
#endif
#if defined(CARLA_OS_MAC)
"vst",
#else
"dll",
"so",
#endif
;

// Audio files
#ifdef HAVE_SNDFILE
retText += ";*.aiff;*.flac;*.oga;*.ogg;*.w64;*.wav";
"aif", "aiff", "bwf", "flac", "oga", "ogg", "w64", "wav",
#endif
#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
}

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;
}

// -------------------------------------------------------------------------------------------------------------------


+ 8
- 7
source/backend/CarlaUtils.h View File

@@ -1,6 +1,6 @@
/*
* 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
* 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();

/*!
* 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.


+ 26
- 1
source/backend/engine/CarlaEngine.cpp View File

@@ -1028,6 +1028,7 @@ bool CarlaEngine::loadFile(const char* const filename)
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")
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))
{


+ 1
- 1
source/backend/engine/CarlaEngineData.cpp View File

@@ -32,7 +32,7 @@ uint8_t EngineControlEvent::convertToMidiData(const uint8_t channel, uint8_t dat
break;

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));



+ 1
- 1
source/backend/engine/CarlaEngineInternal.cpp View File

@@ -1,6 +1,6 @@
/*
* 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
* modify it under the terms of the GNU General Public License as


+ 1
- 1
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -1,6 +1,6 @@
/*
* 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
* modify it under the terms of the GNU General Public License as


+ 24
- 9
source/carla_database.py View File

@@ -830,7 +830,7 @@ class SearchPluginsThread(QThread):
def _pluginLook(self, percent, plugin):
self.pluginLook.emit(percent, plugin)

# ----------------------------------------------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------------------------------
# Plugin Refresh Dialog

class PluginRefreshW(QDialog):
@@ -844,7 +844,7 @@ class PluginRefreshW(QDialog):
# kdevelop likes this :)
self.host = host = CarlaHostNull()

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

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.fIconNo = getIcon("dialog-error").pixmap(16, 16)

# --------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------
# Set-up GUI

self.ui.b_skip.setVisible(False)
@@ -949,12 +949,12 @@ class PluginRefreshW(QDialog):
self.ui.ch_dssi.setEnabled(False)
self.ui.ch_vst.setEnabled(False)

# --------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------
# Load settings

self.loadSettings()

# ----------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------
# Hide bridges if disabled

if not host.showPluginBridges:
@@ -995,12 +995,27 @@ class PluginRefreshW(QDialog):
self.ui.label_win32.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

self.resize(self.minimumSize())

# --------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------
# Set-up connections

self.finished.connect(self.slot_saveSettings)
@@ -1021,12 +1036,12 @@ class PluginRefreshW(QDialog):
self.fThread.pluginLook.connect(self.slot_handlePluginLook)
self.fThread.finished.connect(self.slot_handlePluginThreadFinished)

# --------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------
# Post-connect setup

self.slot_checkTools()

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

def loadSettings(self):
settings = QSettings("falkTX", "CarlaRefresh2")


+ 36
- 30
source/carla_host.py View File

@@ -267,9 +267,11 @@ class HostWindow(QMainWindow):
# ----------------------------------------------------------------------------------------------------
# Set up GUI (disk)

exts = gCarla.utils.get_supported_file_extensions()

self.fDirModel = QFileSystemModel(self)
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.setRootIndex(self.fDirModel.index(HOME))
@@ -306,10 +308,16 @@ class HostWindow(QMainWindow):
self.ui.b_transport_stop.setEnabled(False)
self.ui.b_transport_backwards.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.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.setReadOnly(True)

if MACOS:
if MACOS: # FIXME
self.ui.cb_transport_link.setEnabled(False)

self.ui.w_transport.setEnabled(False)
@@ -511,16 +519,23 @@ class HostWindow(QMainWindow):
self.ui.text_logs.clear()
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
self.ui.tabWidget.blockSignals(True)
self.ui.tabWidget.setCurrentIndex(1)
self.ui.tabWidget.setCurrentIndex(0)
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
if host.processModeForced and host.processMode == ENGINE_PROCESS_MODE_PATCHBAY and not host.isControl:
self.ui.tabWidget.setCurrentIndex(1)
@@ -771,6 +786,7 @@ class HostWindow(QMainWindow):

self.ui.menu_PluginMacros.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_external.blockSignals(True)
@@ -794,7 +810,7 @@ class HostWindow(QMainWindow):
self.ui.act_file_save.setEnabled(canSave)
self.ui.act_engine_start.setEnabled(False)
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:
self.ui.act_file_open.setEnabled(True)
@@ -817,12 +833,12 @@ class HostWindow(QMainWindow):

self.ui.menu_PluginMacros.setEnabled(False)
self.ui.menu_Canvas.setEnabled(False)
self.ui.w_transport.setEnabled(False)

if not (self.host.isControl or self.host.isPlugin):
self.ui.act_file_save.setEnabled(False)
self.ui.act_engine_start.setEnabled(True)
self.ui.act_engine_stop.setEnabled(False)
self.ui.w_transport.setEnabled(False)

if self.host.isPlugin or not self.fSessionManagerName:
self.ui.act_file_open.setEnabled(False)
@@ -1530,29 +1546,15 @@ class HostWindow(QMainWindow):
self.ui.act_add_jack.setVisible(False)

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:
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

@@ -1562,6 +1564,10 @@ class HostWindow(QMainWindow):
# --------------------------------------------------------------------------------------------------------
# Settings (helpers)

def enableTransport(self, enabled):
self.ui.group_transport_controls.setEnabled(enabled)
self.ui.group_transport_settings.setEnabled(enabled)

@pyqtSlot()
def slot_restoreCanvasScrollbarValues(self):
settings = QSettings()


+ 0
- 6
source/carla_settings.py View File

@@ -517,10 +517,6 @@ class CarlaSettingsW(QDialog):
# ----------------------------------------------------------------------------------------------------
# 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,
CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS,
type=bool))
@@ -692,7 +688,6 @@ class CarlaSettingsW(QDialog):
# ----------------------------------------------------------------------------------------------------
# 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_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())
@@ -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.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_exp_transport.setChecked(CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT)

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



+ 0
- 2
source/carla_shared.py View File

@@ -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_SERVER_RT_PRIO = "Wine/ServerRtPrio" # int

CARLA_KEY_EXPERIMENTAL_TRANSPORT = "Experimental/Transport" # bool
CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES = "Experimental/PluginBridges" # bool
CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES = "Experimental/WineBridges" # 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

# Experimental
CARLA_DEFAULT_EXPERIMENTAL_TRANSPORT = False
CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES = False
CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES = False
CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS = False


+ 10
- 7
source/carla_utils.py View File

@@ -165,7 +165,10 @@ class CarlaUtils(object):
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.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.restype = c_uint
@@ -262,13 +265,13 @@ class CarlaUtils(object):
def get_complete_license_text(self):
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):
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.
def get_cached_plugin_count(self, ptype, pluginPath):


+ 2
- 9
source/widgets/racklistwidget.py View File

@@ -194,16 +194,9 @@ class RackListWidget(QListWidget):
host = CarlaHostNull()
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.fWasLastDragValid = False



Loading…
Cancel
Save