@@ -0,0 +1,168 @@ | |||
/* | |||
* Carla Plugin Host | |||
* Copyright (C) 2011-2014 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#include "CarlaHost.h" | |||
#include "CarlaString.hpp" | |||
#include "juce_audio_formats.h" | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
const char* carla_get_complete_license_text() | |||
{ | |||
carla_debug("carla_get_complete_license_text()"); | |||
static CarlaString retText; | |||
if (retText.isEmpty()) | |||
{ | |||
retText = | |||
"<p>This current Carla build is using the following features and 3rd-party code:</p>" | |||
"<ul>" | |||
// Plugin formats | |||
"<li>LADSPA plugin support</li>" | |||
"<li>DSSI plugin support</li>" | |||
"<li>LV2 plugin support</li>" | |||
#ifdef VESTIGE_HEADER | |||
"<li>VST plugin support using VeSTige header by Javier Serrano Polo</li>" | |||
#else | |||
"<li>VST plugin support using official VST SDK 2.4 [1]</li>" | |||
#endif | |||
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | |||
"<li>VST3 plugin support using official VST SDK 3.6 [1]</li>" | |||
#endif | |||
#ifdef CARLA_OS_MAC | |||
"<li>AU plugin support</li>" | |||
#endif | |||
// Sample kit libraries | |||
#ifdef HAVE_FLUIDSYNTH | |||
"<li>FluidSynth library for SF2 support</li>" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
"<li>LinuxSampler library for GIG and SFZ support [2]</li>" | |||
#endif | |||
// Internal plugins | |||
"<li>NekoFilter plugin code based on lv2fil by Nedko Arnaudov and Fons Adriaensen</li>" | |||
#ifdef WANT_ZYNADDSUBFX | |||
"<li>ZynAddSubFX plugin code</li>" | |||
#endif | |||
// misc libs | |||
"<li>base64 utilities based on code by Ren\u00E9 Nyffenegger</li>" | |||
#ifdef CARLA_OS_MAC | |||
"<li>sem_timedwait for Mac OS by Keith Shortridge</li>" | |||
#endif | |||
"<li>liblo library for OSC support</li>" | |||
"<li>rtmempool library by Nedko Arnaudov" | |||
"<li>serd, sord, sratom and lilv libraries for LV2 discovery</li>" | |||
#if ! (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) | |||
"<li>RtAudio and RtMidi libraries for extra Audio and MIDI support</li>" | |||
#endif | |||
// end | |||
"</ul>" | |||
"<p>" | |||
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) || ! defined(VESTIGE_HEADER) | |||
// Required by VST SDK | |||
" [1] Trademark of Steinberg Media Technologies GmbH.<br/>" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
// LinuxSampler GPL exception | |||
" [2] Using LinuxSampler code in commercial hardware or software products is not allowed without prior written authorization by the authors." | |||
#endif | |||
"</p>" | |||
; | |||
} | |||
return retText; | |||
} | |||
const char* carla_get_juce_version() | |||
{ | |||
carla_debug("carla_get_juce_version()"); | |||
static CarlaString retVersion; | |||
if (retVersion.isEmpty()) | |||
{ | |||
if (const char* const version = juce::SystemStats::getJUCEVersion().toRawUTF8()) | |||
retVersion = version+6; | |||
else | |||
retVersion = "3.0"; | |||
} | |||
return retVersion; | |||
} | |||
const char* carla_get_supported_file_extensions() | |||
{ | |||
carla_debug("carla_get_supported_file_extensions()"); | |||
static CarlaString retText; | |||
if (retText.isEmpty()) | |||
{ | |||
retText = | |||
// Base types | |||
"*.carxp;*.carxs" | |||
// MIDI files | |||
";*.mid;*.midi" | |||
#ifdef HAVE_FLUIDSYNTH | |||
// fluidsynth (sf2) | |||
";*.sf2" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
// linuxsampler (gig and sfz) | |||
";*.gig;*.sfz" | |||
#endif | |||
#ifdef WANT_ZYNADDSUBFX | |||
// zynaddsubfx presets | |||
";*.xmz;*.xiz" | |||
#endif | |||
; | |||
#ifndef BUILD_BRIDGE | |||
// Audio files | |||
{ | |||
using namespace juce; | |||
AudioFormatManager afm; | |||
afm.registerBasicFormats(); | |||
String juceFormats; | |||
for (AudioFormat **it=afm.begin(), **end=afm.end(); it != end; ++it) | |||
{ | |||
const StringArray& exts((*it)->getFileExtensions()); | |||
for (String *eit=exts.begin(), *eend=exts.end(); eit != eend; ++eit) | |||
juceFormats += String(";*" + (*eit)).toRawUTF8(); | |||
} | |||
retText += juceFormats.toRawUTF8(); | |||
} | |||
#endif | |||
} | |||
return retText; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- |
@@ -445,151 +445,6 @@ _CarlaTransportInfo::_CarlaTransportInfo() noexcept | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
// API | |||
const char* carla_get_complete_license_text() | |||
{ | |||
carla_debug("carla_get_complete_license_text()"); | |||
static CarlaString retText; | |||
if (retText.isEmpty()) | |||
{ | |||
retText = | |||
"<p>This current Carla build is using the following features and 3rd-party code:</p>" | |||
"<ul>" | |||
// Plugin formats | |||
"<li>LADSPA plugin support</li>" | |||
"<li>DSSI plugin support</li>" | |||
"<li>LV2 plugin support</li>" | |||
#ifdef VESTIGE_HEADER | |||
"<li>VST plugin support using VeSTige header by Javier Serrano Polo</li>" | |||
#else | |||
"<li>VST plugin support using official VST SDK 2.4 [1]</li>" | |||
#endif | |||
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | |||
"<li>VST3 plugin support using official VST SDK 3.6 [1]</li>" | |||
#endif | |||
#ifdef CARLA_OS_MAC | |||
"<li>AU plugin support</li>" | |||
#endif | |||
// Sample kit libraries | |||
#ifdef HAVE_FLUIDSYNTH | |||
"<li>FluidSynth library for SF2 support</li>" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
"<li>LinuxSampler library for GIG and SFZ support [2]</li>" | |||
#endif | |||
// Internal plugins | |||
"<li>NekoFilter plugin code based on lv2fil by Nedko Arnaudov and Fons Adriaensen</li>" | |||
#ifdef WANT_ZYNADDSUBFX | |||
"<li>ZynAddSubFX plugin code</li>" | |||
#endif | |||
// misc libs | |||
"<li>base64 utilities based on code by Ren\u00E9 Nyffenegger</li>" | |||
#ifdef CARLA_OS_MAC | |||
"<li>sem_timedwait for Mac OS by Keith Shortridge</li>" | |||
#endif | |||
"<li>liblo library for OSC support</li>" | |||
"<li>rtmempool library by Nedko Arnaudov" | |||
"<li>serd, sord, sratom and lilv libraries for LV2 discovery</li>" | |||
#if ! (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) | |||
"<li>RtAudio and RtMidi libraries for extra Audio and MIDI support</li>" | |||
#endif | |||
// end | |||
"</ul>" | |||
"<p>" | |||
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) || ! defined(VESTIGE_HEADER) | |||
// Required by VST SDK | |||
" [1] Trademark of Steinberg Media Technologies GmbH.<br/>" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
// LinuxSampler GPL exception | |||
" [2] Using LinuxSampler code in commercial hardware or software products is not allowed without prior written authorization by the authors." | |||
#endif | |||
"</p>" | |||
; | |||
} | |||
return retText; | |||
} | |||
const char* carla_get_juce_version() | |||
{ | |||
carla_debug("carla_get_juce_version()"); | |||
static CarlaString retVersion; | |||
if (retVersion.isEmpty()) | |||
{ | |||
if (const char* const version = juce::SystemStats::getJUCEVersion().toRawUTF8()) | |||
retVersion = version+6; | |||
else | |||
retVersion = "3.0"; | |||
} | |||
return retVersion; | |||
} | |||
const char* carla_get_supported_file_extensions() | |||
{ | |||
carla_debug("carla_get_supported_file_extensions()"); | |||
static CarlaString retText; | |||
if (retText.isEmpty()) | |||
{ | |||
retText = | |||
// Base types | |||
"*.carxp;*.carxs" | |||
// MIDI files | |||
";*.mid;*.midi" | |||
#ifdef HAVE_FLUIDSYNTH | |||
// fluidsynth (sf2) | |||
";*.sf2" | |||
#endif | |||
#ifdef HAVE_LINUXSAMPLER | |||
// linuxsampler (gig and sfz) | |||
";*.gig;*.sfz" | |||
#endif | |||
#ifdef WANT_ZYNADDSUBFX | |||
// zynaddsubfx presets | |||
";*.xmz;*.xiz" | |||
#endif | |||
; | |||
#ifndef BUILD_BRIDGE | |||
// Audio files | |||
{ | |||
using namespace juce; | |||
AudioFormatManager afm; | |||
afm.registerBasicFormats(); | |||
String juceFormats; | |||
for (AudioFormat **it=afm.begin(), **end=afm.end(); it != end; ++it) | |||
{ | |||
const StringArray& exts((*it)->getFileExtensions()); | |||
for (String *eit=exts.begin(), *eend=exts.end(); eit != eend; ++eit) | |||
juceFormats += String(";*" + (*eit)).toRawUTF8(); | |||
} | |||
retText += juceFormats.toRawUTF8(); | |||
} | |||
#endif | |||
} | |||
return retText; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
uint carla_get_engine_driver_count() | |||
{ | |||
carla_debug("carla_get_engine_driver_count()"); | |||
@@ -2478,6 +2333,7 @@ const char* carla_get_library_folder() | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
#include "CarlaHostCommon.cpp" | |||
#include "CarlaPluginUI.cpp" | |||
#include "CarlaDssiUtils.cpp" | |||
#include "CarlaStateUtils.cpp" | |||
@@ -946,6 +946,23 @@ protected: | |||
fUiServer.writeAndFixMsg(valueStr); | |||
} | |||
void uiServerInfo() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fIsRunning,); | |||
CARLA_SAFE_ASSERT_RETURN(fUiServer.isOk(),); | |||
const CarlaMutexLocker cml(fUiServer.getWriteLock()); | |||
fUiServer.writeAndFixMsg("carla-complete-license"); | |||
fUiServer.writeAndFixMsg(carla_get_complete_license_text()); | |||
fUiServer.writeAndFixMsg("carla-juce-version"); | |||
fUiServer.writeAndFixMsg(carla_get_juce_version()); | |||
fUiServer.writeAndFixMsg("carla-file-exts"); | |||
fUiServer.writeAndFixMsg(carla_get_supported_file_extensions()); | |||
} | |||
void uiServerOptions() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fIsRunning,); | |||
@@ -1366,6 +1383,7 @@ protected: | |||
fUiServer.setData(path, pData->sampleRate, pHost->uiName); | |||
fUiServer.start(false); | |||
uiServerInfo(); | |||
uiServerOptions(); | |||
fUiServer.show(); | |||
@@ -1760,6 +1778,7 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const uint, cons | |||
CARLA_BACKEND_END_NAMESPACE | |||
#include "CarlaHostCommon.cpp" | |||
#include "CarlaPluginUI.cpp" | |||
#include "CarlaDssiUtils.cpp" | |||
#include "CarlaStateUtils.cpp" | |||
@@ -2891,12 +2891,12 @@ class CarlaHostPlugin(CarlaHostMeta): | |||
self.processModeForced = True | |||
# text data to return when requested | |||
self.fCompleteLicentText = "" | |||
self.fJuceVersion = "" | |||
self.fSupportedFileExts = "" | |||
self.fLastError = "" | |||
self.fOscUrlTCP = "" | |||
self.fOscUrlUDP = "" | |||
self.fCompleteLicenseText = "" | |||
self.fJuceVersion = "" | |||
self.fSupportedFileExts = "" | |||
self.fLastError = "" | |||
self.fOscUrlTCP = "" | |||
self.fOscUrlUDP = "" | |||
# plugin info | |||
self.fPluginsInfo = [] | |||
@@ -2934,7 +2934,7 @@ class CarlaHostPlugin(CarlaHostMeta): | |||
# -------------------------------------------------------------------------------------------------------- | |||
def get_complete_license_text(self): | |||
return self.fCompleteLicentText | |||
return self.fCompleteLicenseText | |||
def get_juce_version(self): | |||
return self.fJuceVersion | |||
@@ -3200,6 +3200,11 @@ class CarlaHostPlugin(CarlaHostMeta): | |||
# -------------------------------------------------------------------------------------------------------- | |||
def _set_info(self, license, juceversion, fileexts): | |||
self.fCompleteLicenseText = license; | |||
self.fJuceVersion = juceversion | |||
self.fSupportedFileExts = fileexts | |||
def _add(self, pluginId): | |||
if len(self.fPluginsInfo) != pluginId: | |||
return | |||
@@ -79,79 +79,86 @@ class CarlaAboutW(QDialog): | |||
"<br>Copyright (C) 2011-2014 falkTX<br>" | |||
"" % (VERSION, extraInfo))) | |||
if host.isControl or host.isPlugin: | |||
if host.isControl: | |||
self.ui.l_extended.hide() | |||
self.ui.tabWidget.removeTab(2) | |||
self.ui.tabWidget.removeTab(1) | |||
else: | |||
self.ui.l_extended.setText(host.get_complete_license_text()) | |||
elif host.isPlugin: | |||
self.ui.tabWidget.removeTab(2) | |||
if host.is_engine_running(): | |||
self.ui.le_osc_url_tcp.setText(host.get_host_osc_url_tcp()) | |||
self.ui.le_osc_url_udp.setText(host.get_host_osc_url_udp()) | |||
else: | |||
self.ui.le_osc_url_tcp.setText(self.tr("(Engine not running)")) | |||
self.ui.le_osc_url_udp.setText(self.tr("(Engine not running)")) | |||
self.ui.l_osc_cmds.setText("" | |||
" /set_active <i-value>\n" | |||
" /set_drywet <f-value>\n" | |||
" /set_volume <f-value>\n" | |||
" /set_balance_left <f-value>\n" | |||
" /set_balance_right <f-value>\n" | |||
" /set_panning <f-value>\n" | |||
" /set_parameter_value <i-index> <f-value>\n" | |||
" /set_parameter_midi_cc <i-index> <i-cc>\n" | |||
" /set_parameter_midi_channel <i-index> <i-channel>\n" | |||
" /set_program <i-index>\n" | |||
" /set_midi_program <i-index>\n" | |||
" /note_on <i-note> <i-velo>\n" | |||
" /note_off <i-note>\n" | |||
) | |||
self.ui.l_example.setText("/Carla/2/set_parameter_value 5 1.0") | |||
self.ui.l_example_help.setText("<i>(as in this example, \"2\" is the plugin number and \"5\" the parameter)</i>") | |||
self.ui.l_ladspa.setText(self.tr("Everything! (Including LRDF)")) | |||
self.ui.l_dssi.setText(self.tr("Everything! (Including CustomData/Chunks)")) | |||
self.ui.l_lv2.setText(self.tr("About 95% complete (using custom extensions)<br/>" | |||
"Implemented Feature/Extensions:" | |||
"<ul>" | |||
"<li>http://lv2plug.in/ns/ext/atom</li>" | |||
"<li>http://lv2plug.in/ns/ext/buf-size</li>" | |||
"<li>http://lv2plug.in/ns/ext/data-access</li>" | |||
#"<li>http://lv2plug.in/ns/ext/dynmanifest</li>" | |||
"<li>http://lv2plug.in/ns/ext/event</li>" | |||
"<li>http://lv2plug.in/ns/ext/instance-access</li>" | |||
"<li>http://lv2plug.in/ns/ext/log</li>" | |||
"<li>http://lv2plug.in/ns/ext/midi</li>" | |||
#"<li>http://lv2plug.in/ns/ext/morph</li>" | |||
"<li>http://lv2plug.in/ns/ext/options</li>" | |||
"<li>http://lv2plug.in/ns/ext/parameters</li>" | |||
#"<li>http://lv2plug.in/ns/ext/patch</li>" | |||
#"<li>http://lv2plug.in/ns/ext/port-groups</li>" | |||
"<li>http://lv2plug.in/ns/ext/port-props</li>" | |||
"<li>http://lv2plug.in/ns/ext/presets</li>" | |||
"<li>http://lv2plug.in/ns/ext/resize-port</li>" | |||
"<li>http://lv2plug.in/ns/ext/state</li>" | |||
"<li>http://lv2plug.in/ns/ext/time</li>" | |||
"<li>http://lv2plug.in/ns/ext/uri-map</li>" | |||
"<li>http://lv2plug.in/ns/ext/urid</li>" | |||
"<li>http://lv2plug.in/ns/ext/worker</li>" | |||
"<li>http://lv2plug.in/ns/extensions/ui</li>" | |||
"<li>http://lv2plug.in/ns/extensions/units</li>" | |||
"<li>http://home.gna.org/lv2dynparam/rtmempool/v1</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/external-ui</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/programs</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/props</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/rtmempool</li>" | |||
"<li>http://ll-plugins.nongnu.org/lv2/ext/midimap</li>" | |||
"<li>http://ll-plugins.nongnu.org/lv2/ext/miditype</li>" | |||
"</ul>")) | |||
self.ui.l_vst.setText(self.tr("<p>About 85% complete (missing vst bank/presets and some minor stuff)</p>")) | |||
self.ui.l_extended.setText(host.get_complete_license_text()) | |||
if host.is_engine_running() and not (host.isControl or host.isPlugin): | |||
self.ui.le_osc_url_tcp.setText(host.get_host_osc_url_tcp()) | |||
self.ui.le_osc_url_udp.setText(host.get_host_osc_url_udp()) | |||
else: | |||
self.ui.le_osc_url_tcp.setText(self.tr("(Engine not running)")) | |||
self.ui.le_osc_url_udp.setText(self.tr("(Engine not running)")) | |||
self.ui.l_osc_cmds.setText("" | |||
" /set_active <i-value>\n" | |||
" /set_drywet <f-value>\n" | |||
" /set_volume <f-value>\n" | |||
" /set_balance_left <f-value>\n" | |||
" /set_balance_right <f-value>\n" | |||
" /set_panning <f-value>\n" | |||
" /set_parameter_value <i-index> <f-value>\n" | |||
" /set_parameter_midi_cc <i-index> <i-cc>\n" | |||
" /set_parameter_midi_channel <i-index> <i-channel>\n" | |||
" /set_program <i-index>\n" | |||
" /set_midi_program <i-index>\n" | |||
" /note_on <i-note> <i-velo>\n" | |||
" /note_off <i-note>\n" | |||
) | |||
self.ui.l_example.setText("/Carla/2/set_parameter_value 5 1.0") | |||
self.ui.l_example_help.setText("<i>(as in this example, \"2\" is the plugin number and \"5\" the parameter)</i>") | |||
self.ui.l_ladspa.setText(self.tr("Everything! (Including LRDF)")) | |||
self.ui.l_dssi.setText(self.tr("Everything! (Including CustomData/Chunks)")) | |||
self.ui.l_lv2.setText(self.tr("About 95% complete (using custom extensions)<br/>" | |||
"Implemented Feature/Extensions:" | |||
"<ul>" | |||
"<li>http://lv2plug.in/ns/ext/atom</li>" | |||
"<li>http://lv2plug.in/ns/ext/buf-size</li>" | |||
"<li>http://lv2plug.in/ns/ext/data-access</li>" | |||
#"<li>http://lv2plug.in/ns/ext/dynmanifest</li>" | |||
"<li>http://lv2plug.in/ns/ext/event</li>" | |||
"<li>http://lv2plug.in/ns/ext/instance-access</li>" | |||
"<li>http://lv2plug.in/ns/ext/log</li>" | |||
"<li>http://lv2plug.in/ns/ext/midi</li>" | |||
#"<li>http://lv2plug.in/ns/ext/morph</li>" | |||
"<li>http://lv2plug.in/ns/ext/options</li>" | |||
"<li>http://lv2plug.in/ns/ext/parameters</li>" | |||
#"<li>http://lv2plug.in/ns/ext/patch</li>" | |||
#"<li>http://lv2plug.in/ns/ext/port-groups</li>" | |||
"<li>http://lv2plug.in/ns/ext/port-props</li>" | |||
"<li>http://lv2plug.in/ns/ext/presets</li>" | |||
"<li>http://lv2plug.in/ns/ext/resize-port</li>" | |||
"<li>http://lv2plug.in/ns/ext/state</li>" | |||
"<li>http://lv2plug.in/ns/ext/time</li>" | |||
"<li>http://lv2plug.in/ns/ext/uri-map</li>" | |||
"<li>http://lv2plug.in/ns/ext/urid</li>" | |||
"<li>http://lv2plug.in/ns/ext/worker</li>" | |||
"<li>http://lv2plug.in/ns/extensions/ui</li>" | |||
"<li>http://lv2plug.in/ns/extensions/units</li>" | |||
"<li>http://home.gna.org/lv2dynparam/rtmempool/v1</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/external-ui</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/programs</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/props</li>" | |||
"<li>http://kxstudio.sf.net/ns/lv2ext/rtmempool</li>" | |||
"<li>http://ll-plugins.nongnu.org/lv2/ext/midimap</li>" | |||
"<li>http://ll-plugins.nongnu.org/lv2/ext/miditype</li>" | |||
"</ul>")) | |||
self.ui.l_vst.setText(self.tr("<p>About 85% complete (missing vst bank/presets and some minor stuff)</p>")) | |||
# 2nd tab is usually longer than the 1st | |||
# adjust appropriately | |||
self.ui.tabWidget.setCurrentIndex(1) | |||
self.adjustSize() | |||
self.ui.tabWidget.setCurrentIndex(0) | |||
self.setFixedSize(self.size()) | |||
if WINDOWS: | |||
@@ -308,6 +308,18 @@ class CarlaMiniW(ExternalUI, HostWindow): | |||
name = self.readlineblock().replace("\r", "\n") | |||
self.host._set_midiProgramData(pluginId, midiProgId, {'bank': bank, 'program': program, 'name': name}) | |||
elif msg == "carla-complete-license": | |||
license = self.readlineblock().replace("\r", "\n") | |||
self.host.fCompleteLicenseText = license | |||
elif msg == "carla-juce-version": | |||
version = self.readlineblock().replace("\r", "\n") | |||
self.host.fJuceVersion = version | |||
elif msg == "carla-file-exts": | |||
exts = self.readlineblock().replace("\r", "\n") | |||
self.host.fSupportedFileExts = exts | |||
elif msg == "error": | |||
error = self.readlineblock().replace("\r", "\n") | |||
engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0.0, error) | |||