Browse Source

Cleanup & fix some bridge code

tags/1.9.4
falkTX 10 years ago
parent
commit
6f72000d43
5 changed files with 151 additions and 111 deletions
  1. +1
    -1
      source/backend/CarlaEngine.hpp
  2. +58
    -40
      source/backend/engine/CarlaEngine.cpp
  3. +38
    -30
      source/backend/engine/CarlaEngineOsc.cpp
  4. +2
    -0
      source/backend/plugin/Lv2Plugin.cpp
  5. +52
    -40
      source/utils/CarlaBridgeUtils.hpp

+ 1
- 1
source/backend/CarlaEngine.hpp View File

@@ -1124,7 +1124,7 @@ public:
void oscSend_bridge_parameter_ranges2(const uint32_t index, const float step, const float stepSmall, const float stepLarge) const noexcept;
void oscSend_bridge_parameter_midi_cc(const uint32_t index, const int16_t cc) const noexcept;
void oscSend_bridge_parameter_midi_channel(const uint32_t index, const uint8_t channel) const noexcept;
void oscSend_bridge_parameter_value(const int32_t index, const float value) const noexcept; // may be used for internal params (< 0)
void oscSend_bridge_parameter_value(const uint32_t index, const float value) const noexcept;
void oscSend_bridge_default_value(const uint32_t index, const float value) const noexcept;
void oscSend_bridge_current_program(const int32_t index) const noexcept;
void oscSend_bridge_current_midi_program(const int32_t index) const noexcept;


+ 58
- 40
source/backend/engine/CarlaEngine.cpp View File

@@ -16,7 +16,6 @@
*/

/* TODO:
* - add more checks to oscSend_* stuff
* - complete processRack(): carefully add to input, sorted events
* - implement processPatchbay()
* - implement oscSend_control_switch_plugins()
@@ -35,6 +34,7 @@

#include "CarlaMIDI.h"

#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QTextStream>
@@ -746,38 +746,56 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons

CarlaPlugin* plugin = nullptr;

#if 0 //ndef BUILD_BRIDGE
const char* bridgeBinary;
#ifndef BUILD_BRIDGE
CarlaString bridgeBinary(pData->options.binaryDir);

switch (btype)
if (bridgeBinary.isNotEmpty())
{
case BINARY_POSIX32:
bridgeBinary = pData->options.bridge_posix32.isNotEmpty() ? (const char*)pData->options.bridge_posix32 : nullptr;
break;
case BINARY_POSIX64:
bridgeBinary = pData->options.bridge_posix64.isNotEmpty() ? (const char*)pData->options.bridge_posix64 : nullptr;
break;
case BINARY_WIN32:
bridgeBinary = pData->options.bridge_win32.isNotEmpty() ? (const char*)pData->options.bridge_win32 : nullptr;
break;
case BINARY_WIN64:
bridgeBinary = pData->options.bridge_win64.isNotEmpty() ? (const char*)pData->options.bridge_win64 : nullptr;
break;
default:
bridgeBinary = nullptr;
break;
}
# ifdef CARLA_OS_LINUX
// test for local build
if (bridgeBinary.endsWith("/source/backend/"))
bridgeBinary += "../bridges/";
# endif

# ifndef CARLA_OS_WIN
if (btype == BINARY_NATIVE && pData->options.bridge_native.isNotEmpty())
bridgeBinary = (const char*)pData->options.bridge_native;
if (btype == BINARY_NATIVE)
{
bridgeBinary += "carla-bridge-native";
}
else
# endif
{
switch (btype)
{
case BINARY_POSIX32:
bridgeBinary += "carla-bridge-posix32";
break;
case BINARY_POSIX64:
bridgeBinary += "carla-bridge-posix64";
break;
case BINARY_WIN32:
bridgeBinary += "carla-bridge-win32.exe";
break;
case BINARY_WIN64:
bridgeBinary += "carla-bridge-win64.exe";
break;
default:
bridgeBinary.clear();
break;
}
}

if (btype != BINARY_NATIVE || (pData->options.preferPluginBridges && bridgeBinary != nullptr))
QFile file(bridgeBinary.getBuffer());

if (! file.exists())
bridgeBinary.clear();
}

if (btype != BINARY_NATIVE || (pData->options.preferPluginBridges && bridgeBinary.isNotEmpty()))
{
if (bridgeBinary != nullptr)
{
plugin = CarlaPlugin::newBridge(init, btype, ptype, bridgeBinary);
plugin = CarlaPlugin::newBridge(initializer, btype, ptype, bridgeBinary.getBuffer());
}
# ifdef CARLA_OS_LINUX
else if (btype == BINARY_WIN32)
@@ -812,7 +830,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
}
}
else
#endif // BUILD_BRIDGE
#endif // ! BUILD_BRIDGE
{
bool use16Outs;
setLastError("Invalid or unsupported plugin type");
@@ -829,22 +847,22 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
}
else if (std::strcmp(label, "FluidSynth") == 0)
{
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newFluidSynth(initializer, use16Outs);
}
else if (std::strcmp(label, "LinuxSampler (GIG)") == 0)
{
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newLinuxSampler(initializer, "GIG", use16Outs);
}
else if (std::strcmp(label, "LinuxSampler (SF2)") == 0)
{
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newLinuxSampler(initializer, "SF2", use16Outs);
}
else if (std::strcmp(label, "LinuxSampler (SFZ)") == 0)
{
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newLinuxSampler(initializer, "SFZ", use16Outs);
}
else
@@ -878,12 +896,12 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
break;

case PLUGIN_FILE_GIG:
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newFileGIG(initializer, use16Outs);
break;

case PLUGIN_FILE_SF2:
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true"));
use16Outs = (extra != nullptr && std::strcmp((const char*)extra, "true") == 0);
plugin = CarlaPlugin::newFileSF2(initializer, use16Outs);
break;

@@ -2170,7 +2188,7 @@ void CarlaEngine::oscSend_bridge_audio_count(const uint32_t ins, const uint32_t
char targetPath[std::strlen(pData->oscData->path)+20];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_audio_count");
try_lo_send(pData->oscData->target, targetPath, "iii", static_cast<int32_t>(ins), static_cast<int32_t>(outs));
try_lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(ins), static_cast<int32_t>(outs));
}

void CarlaEngine::oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs) const noexcept
@@ -2206,7 +2224,7 @@ void CarlaEngine::oscSend_bridge_program_count(const uint32_t count) const noexc
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_program_count(%i)", count);

char targetPath[std::strlen(pData->oscData->path)+22];
char targetPath[std::strlen(pData->oscData->path)+23];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_program_count");
try_lo_send(pData->oscData->target, targetPath, "i", static_cast<int32_t>(count));
@@ -2292,7 +2310,7 @@ void CarlaEngine::oscSend_bridge_parameter_midi_channel(const uint32_t index, co
try_lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(index), static_cast<int32_t>(channel));
}

void CarlaEngine::oscSend_bridge_parameter_value(const int32_t index, const float value) const noexcept
void CarlaEngine::oscSend_bridge_parameter_value(const uint32_t index, const float value) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',);
@@ -2303,7 +2321,7 @@ void CarlaEngine::oscSend_bridge_parameter_value(const int32_t index, const floa
char targetPath[std::strlen(pData->oscData->path)+24];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_parameter_value");
try_lo_send(pData->oscData->target, targetPath, "if", index, value);
try_lo_send(pData->oscData->target, targetPath, "if", static_cast<int32_t>(index), value);
}

void CarlaEngine::oscSend_bridge_default_value(const uint32_t index, const float value) const noexcept
@@ -2326,7 +2344,7 @@ void CarlaEngine::oscSend_bridge_current_program(const int32_t index) const noex
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_current_program(%i)", index);

char targetPath[std::strlen(pData->oscData->path)+20];
char targetPath[std::strlen(pData->oscData->path)+24];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_current_program");
try_lo_send(pData->oscData->target, targetPath, "i", index);
@@ -2339,7 +2357,7 @@ void CarlaEngine::oscSend_bridge_current_midi_program(const int32_t index) const
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_current_midi_program(%i)", index);

char targetPath[std::strlen(pData->oscData->path)+25];
char targetPath[std::strlen(pData->oscData->path)+30];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_current_midi_program");
try_lo_send(pData->oscData->target, targetPath, "i", index);
@@ -2392,6 +2410,9 @@ void CarlaEngine::oscSend_bridge_set_custom_data(const char* const type, const c
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
CARLA_SAFE_ASSERT_RETURN(type != nullptr && type[0] != '\0',);
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);
CARLA_SAFE_ASSERT_RETURN(value != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_set_custom_data(\"%s\", \"%s\", \"%s\")", type, key, value);

char targetPath[std::strlen(pData->oscData->path)+24];
@@ -2414,9 +2435,6 @@ void CarlaEngine::oscSend_bridge_set_chunk_data(const char* const chunkFile) con
try_lo_send(pData->oscData->target, targetPath, "s", chunkFile);
}

// TODO?
//void oscSend_bridge_set_peaks() const;

#else
void CarlaEngine::oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const noexcept
{


+ 38
- 30
source/backend/engine/CarlaEngineOsc.cpp View File

@@ -316,45 +316,53 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons
// Plugin Bridges
if ((plugin->getHints() & PLUGIN_IS_BRIDGE) != 0 && std::strlen(method) > 11 && std::strncmp(method, "bridge_", 7) == 0)
{
if (std::strcmp(method+7, "audio_count") == 0)
const char* const bmethod(method+7);

if (std::strcmp(bmethod, "plugin_info1") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgePluginInfo1, argc, argv, types);
if (std::strcmp(bmethod, "plugin_info2") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgePluginInfo2, argc, argv, types);
if (std::strcmp(bmethod, "audio_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeAudioCount, argc, argv, types);
if (std::strcmp(method+7, "midi_count") == 0)
if (std::strcmp(bmethod, "midi_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiCount, argc, argv, types);
if (std::strcmp(method+7, "parameter_count") == 0)
if (std::strcmp(bmethod, "parameter_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterCount, argc, argv, types);
if (std::strcmp(method+7, "program_count") == 0)
if (std::strcmp(bmethod, "program_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeProgramCount, argc, argv, types);
if (std::strcmp(method+7, "midi_program_count") == 0)
if (std::strcmp(bmethod, "midi_program_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiProgramCount, argc, argv, types);
if (std::strcmp(method+7, "plugin_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgePluginInfo, argc, argv, types);
if (std::strcmp(method+7, "parameter_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterInfo, argc, argv, types);
if (std::strcmp(method+7, "parameter_data") == 0)
if (std::strcmp(bmethod, "parameter_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterData, argc, argv, types);
if (std::strcmp(method+7, "parameter_ranges") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterRanges, argc, argv, types);
if (std::strcmp(method+7, "program_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeProgramInfo, argc, argv, types);
if (std::strcmp(method+7, "midi_program_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiProgramInfo, argc, argv, types);
if (std::strcmp(method+7, "configure") == 0)
if (std::strcmp(bmethod, "parameter_ranges1") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterRanges1, argc, argv, types);
if (std::strcmp(bmethod, "parameter_ranges2") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterRanges2, argc, argv, types);
if (std::strcmp(bmethod, "parameter_midi_cc") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterMidiCC, argc, argv, types);
if (std::strcmp(bmethod, "parameter_midi_channel") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterMidiChannel, argc, argv, types);
if (std::strcmp(bmethod, "parameter_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterValue, argc, argv, types);
if (std::strcmp(bmethod, "default_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeDefaultValue, argc, argv, types);
if (std::strcmp(bmethod, "current_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeCurrentProgram, argc, argv, types);
if (std::strcmp(bmethod, "current_midi_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeCurrentMidiProgram, argc, argv, types);
if (std::strcmp(bmethod, "program_name") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeProgramName, argc, argv, types);
if (std::strcmp(bmethod, "midi_program_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiProgramData, argc, argv, types);
if (std::strcmp(bmethod, "configure") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeConfigure, argc, argv, types);
if (std::strcmp(method+7, "set_parameter_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetParameterValue, argc, argv, types);
if (std::strcmp(method+7, "set_default_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetDefaultValue, argc, argv, types);
if (std::strcmp(method+7, "set_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetProgram, argc, argv, types);
if (std::strcmp(method+7, "set_midi_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetMidiProgram, argc, argv, types);
if (std::strcmp(method+7, "set_custom_data") == 0)
if (std::strcmp(bmethod, "set_custom_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetCustomData, argc, argv, types);
if (std::strcmp(method+7, "set_chunk_data") == 0)
if (std::strcmp(bmethod, "set_chunk_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetChunkData, argc, argv, types);
if (std::strcmp(method+7, "update") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeUpdateNow, argc, argv, types);
if (std::strcmp(method+7, "error") == 0)
if (std::strcmp(bmethod, "update") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeUpdate, argc, argv, types);
if (std::strcmp(bmethod, "error") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeError, argc, argv, types);
}
#endif


+ 2
- 0
source/backend/plugin/Lv2Plugin.cpp View File

@@ -3681,9 +3681,11 @@ public:
if (bridgeBinary.isEmpty())
return nullptr;

#ifdef CARLA_OS_LINUX
// test for local build
if (bridgeBinary.endsWith("/source/backend/"))
bridgeBinary += "../bridges/";
#endif

switch (type)
{


+ 52
- 40
source/utils/CarlaBridgeUtils.hpp View File

@@ -23,26 +23,30 @@
// -----------------------------------------------------------------------

enum PluginBridgeInfoType {
kPluginBridgeAudioCount = 0,
kPluginBridgeMidiCount,
kPluginBridgeParameterCount,
kPluginBridgeProgramCount,
kPluginBridgeMidiProgramCount,
kPluginBridgePluginInfo,
kPluginBridgeParameterInfo,
kPluginBridgeParameterData,
kPluginBridgeParameterRanges,
kPluginBridgeProgramInfo,
kPluginBridgeMidiProgramInfo,
kPluginBridgeConfigure,
kPluginBridgeSetParameterValue,
kPluginBridgeSetDefaultValue,
kPluginBridgeSetProgram,
kPluginBridgeSetMidiProgram,
kPluginBridgeSetCustomData,
kPluginBridgeSetChunkData,
kPluginBridgeUpdateNow,
kPluginBridgeError
kPluginBridgeNull = 0,
kPluginBridgePluginInfo1, // uuh => category, hints, uniqueId
kPluginBridgePluginInfo2, // ssss => realName, label, maker, copyright
kPluginBridgeAudioCount, // uu => ins, outs
kPluginBridgeMidiCount, // uu => ins, outs
kPluginBridgeParameterCount, // uu => ins, outs
kPluginBridgeProgramCount, // u => count
kPluginBridgeMidiProgramCount, // u => count
kPluginBridgeParameterData, // uiuuss => index, rindex, type, hints, name, unit
kPluginBridgeParameterRanges1, // ufff => index, def, min, max
kPluginBridgeParameterRanges2, // ufff => index, step, stepSmall, stepLarge
kPluginBridgeParameterMidiCC, // ui => index, cc
kPluginBridgeParameterMidiChannel, // uu => index, channel
kPluginBridgeParameterValue, // uf => index, value
kPluginBridgeDefaultValue, // uf => index, value
kPluginBridgeCurrentProgram, // i => index
kPluginBridgeCurrentMidiProgram, // i => index
kPluginBridgeProgramName, // us => index, name
kPluginBridgeMidiProgramData, // uuus => index, bank, program, name
kPluginBridgeConfigure, // ss => key, value
kPluginBridgeSetCustomData, // sss => type, key, value
kPluginBridgeSetChunkData, // s => chunkFile
kPluginBridgeUpdate, //
kPluginBridgeError //
};

enum PluginBridgeOpcode {
@@ -89,6 +93,12 @@ const char* PluginBridgeInfoType2str(const PluginBridgeInfoType type) noexcept
{
switch (type)
{
case kPluginBridgeNull:
return "kPluginBridgeNull";
case kPluginBridgePluginInfo1:
return "kPluginBridgePluginInfo1";
case kPluginBridgePluginInfo2:
return "kPluginBridgePluginInfo2";
case kPluginBridgeAudioCount:
return "kPluginBridgeAudioCount";
case kPluginBridgeMidiCount:
@@ -99,34 +109,36 @@ const char* PluginBridgeInfoType2str(const PluginBridgeInfoType type) noexcept
return "kPluginBridgeProgramCount";
case kPluginBridgeMidiProgramCount:
return "kPluginBridgeMidiProgramCount";
case kPluginBridgePluginInfo:
return "kPluginBridgePluginInfo";
case kPluginBridgeParameterInfo:
return "kPluginBridgeParameterInfo";
case kPluginBridgeParameterData:
return "kPluginBridgeParameterData";
case kPluginBridgeParameterRanges:
return "kPluginBridgeParameterRanges";
case kPluginBridgeProgramInfo:
return "kPluginBridgeProgramInfo";
case kPluginBridgeMidiProgramInfo:
return "kPluginBridgeMidiProgramInfo";
case kPluginBridgeParameterRanges1:
return "kPluginBridgeParameterRanges1";
case kPluginBridgeParameterRanges2:
return "kPluginBridgeParameterRanges2";
case kPluginBridgeParameterMidiCC:
return "kPluginBridgeParameterMidiCC";
case kPluginBridgeParameterMidiChannel:
return "kPluginBridgeParameterMidiChannel";
case kPluginBridgeParameterValue:
return "kPluginBridgeParameterValue";
case kPluginBridgeDefaultValue:
return "kPluginBridgeDefaultValue";
case kPluginBridgeCurrentProgram:
return "kPluginBridgeCurrentProgram";
case kPluginBridgeCurrentMidiProgram:
return "kPluginBridgeCurrentMidiProgram";
case kPluginBridgeProgramName:
return "kPluginBridgeProgramName";
case kPluginBridgeMidiProgramData:
return "kPluginBridgeMidiProgramData";
case kPluginBridgeConfigure:
return "kPluginBridgeConfigure";
case kPluginBridgeSetParameterValue:
return "kPluginBridgeSetParameterValue";
case kPluginBridgeSetDefaultValue:
return "kPluginBridgeSetDefaultValue";
case kPluginBridgeSetProgram:
return "kPluginBridgeSetProgram";
case kPluginBridgeSetMidiProgram:
return "kPluginBridgeSetMidiProgram";
case kPluginBridgeSetCustomData:
return "kPluginBridgeSetCustomData";
case kPluginBridgeSetChunkData:
return "kPluginBridgeSetChunkData";
case kPluginBridgeUpdateNow:
return "kPluginBridgeUpdateNow";
case kPluginBridgeUpdate:
return "kPluginBridgeUpdate";
case kPluginBridgeError:
return "kPluginBridgeError";
}


Loading…
Cancel
Save