@@ -604,15 +604,23 @@ enum CallbackType { | |||||
*/ | */ | ||||
CALLBACK_PATCHBAY_CONNECTION_REMOVED = 25, | CALLBACK_PATCHBAY_CONNECTION_REMOVED = 25, | ||||
/*! | |||||
* Canvas client icon changed | |||||
* | |||||
* \param value1 Client Id | |||||
* \param value2 Client Icon | |||||
*/ | |||||
CALLBACK_PATCHBAY_ICON_CHANGED = 26, | |||||
/*! | /*! | ||||
* Engine buffer-size changed. | * Engine buffer-size changed. | ||||
*/ | */ | ||||
CALLBACK_BUFFER_SIZE_CHANGED = 26, | |||||
CALLBACK_BUFFER_SIZE_CHANGED = 27, | |||||
/*! | /*! | ||||
* Engine sample-rate changed. | * Engine sample-rate changed. | ||||
*/ | */ | ||||
CALLBACK_SAMPLE_RATE_CHANGED = 27, | |||||
CALLBACK_SAMPLE_RATE_CHANGED = 28, | |||||
/*! | /*! | ||||
* Engine process mode changed. | * Engine process mode changed. | ||||
@@ -620,37 +628,37 @@ enum CallbackType { | |||||
* \param value1 New process mode | * \param value1 New process mode | ||||
* \see ProcessMode | * \see ProcessMode | ||||
*/ | */ | ||||
CALLBACK_PROCESS_MODE_CHANGED = 28, | |||||
CALLBACK_PROCESS_MODE_CHANGED = 29, | |||||
/*! | /*! | ||||
* Non-Session-Manager Announce message. | * Non-Session-Manager Announce message. | ||||
*/ | */ | ||||
CALLBACK_NSM_ANNOUNCE = 29, | |||||
CALLBACK_NSM_ANNOUNCE = 30, | |||||
/*! | /*! | ||||
* Non-Session-Manager Open message. | * Non-Session-Manager Open message. | ||||
*/ | */ | ||||
CALLBACK_NSM_OPEN = 30, | |||||
CALLBACK_NSM_OPEN = 31, | |||||
/*! | /*! | ||||
* Non-Session-Manager Save message. | * Non-Session-Manager Save message. | ||||
*/ | */ | ||||
CALLBACK_NSM_SAVE = 31, | |||||
CALLBACK_NSM_SAVE = 32, | |||||
/*! | /*! | ||||
* An error occurred, show \a valueStr as an error to user. | * An error occurred, show \a valueStr as an error to user. | ||||
*/ | */ | ||||
CALLBACK_ERROR = 32, | |||||
CALLBACK_ERROR = 33, | |||||
/*! | /*! | ||||
* Show \a valueStr as info to user. | * Show \a valueStr as info to user. | ||||
*/ | */ | ||||
CALLBACK_INFO = 33, | |||||
CALLBACK_INFO = 34, | |||||
/*! | /*! | ||||
* The engine has crashed or malfunctioned and will no longer work. | * The engine has crashed or malfunctioned and will no longer work. | ||||
*/ | */ | ||||
CALLBACK_QUIT = 34 | |||||
CALLBACK_QUIT = 35 | |||||
}; | }; | ||||
/*! | /*! | ||||
@@ -631,6 +631,7 @@ public: | |||||
fUsedGroupNames.clear(); | fUsedGroupNames.clear(); | ||||
fUsedPortNames.clear(); | fUsedPortNames.clear(); | ||||
fUsedConnections.clear(); | fUsedConnections.clear(); | ||||
fGroupIconsChanged.clear(); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -673,6 +674,7 @@ public: | |||||
fUsedGroupNames.clear(); | fUsedGroupNames.clear(); | ||||
fUsedPortNames.clear(); | fUsedPortNames.clear(); | ||||
fUsedConnections.clear(); | fUsedConnections.clear(); | ||||
fGroupIconsChanged.clear(); | |||||
fClient = jackbridge_client_open(clientName, JackNullOption, nullptr); | fClient = jackbridge_client_open(clientName, JackNullOption, nullptr); | ||||
@@ -682,6 +684,7 @@ public: | |||||
fSampleRate = jackbridge_get_sample_rate(fClient); | fSampleRate = jackbridge_get_sample_rate(fClient); | ||||
jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6); | jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6); | ||||
jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this); | |||||
jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this); | jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this); | ||||
jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this); | jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this); | ||||
@@ -782,10 +785,68 @@ public: | |||||
fUsedGroupNames.clear(); | fUsedGroupNames.clear(); | ||||
fUsedPortNames.clear(); | fUsedPortNames.clear(); | ||||
fUsedConnections.clear(); | fUsedConnections.clear(); | ||||
fGroupIconsChanged.clear(); | |||||
#endif | #endif | ||||
return false; | return false; | ||||
} | } | ||||
void idle() override | |||||
{ | |||||
CarlaEngine::idle(); | |||||
if (fGroupIconsChanged.count() == 0) | |||||
return; | |||||
static bool checkIcons = false; | |||||
if (! checkIcons) | |||||
{ | |||||
checkIcons = true; // check them next time | |||||
return; | |||||
} | |||||
checkIcons = false; | |||||
void* data; | |||||
size_t dataSize; | |||||
QList<int> groupIconsCopy(fGroupIconsChanged); | |||||
fGroupIconsChanged.clear(); | |||||
foreach (const int& groupId, groupIconsCopy) | |||||
{ | |||||
const char* const groupName(getGroupName(groupId)); | |||||
data = nullptr; | |||||
dataSize = 0; | |||||
if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0) | |||||
{ | |||||
const char* const icon((const char*)data); | |||||
CARLA_ASSERT(std::strlen(icon)+1 == dataSize); | |||||
PatchbayIconType groupIcon; | |||||
if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0) | |||||
groupIcon = PATCHBAY_ICON_APPLICATION; | |||||
else if (std::strcmp(icon, "hardware") == 0) | |||||
groupIcon = PATCHBAY_ICON_HARDWARE; | |||||
else if (std::strcmp(icon, "carla") == 0) | |||||
groupIcon = PATCHBAY_ICON_CARLA; | |||||
else if (std::strcmp(icon, "distrho") == 0) | |||||
groupIcon = PATCHBAY_ICON_DISTRHO; | |||||
else if (std::strcmp(icon, "file") == 0) | |||||
groupIcon = PATCHBAY_ICON_FILE; | |||||
else if (std::strcmp(icon, "plugin") == 0) | |||||
groupIcon = PATCHBAY_ICON_PLUGIN; | |||||
else | |||||
groupIcon = PATCHBAY_ICON_APPLICATION; | |||||
callback(CALLBACK_PATCHBAY_ICON_CHANGED, 0, groupId, groupIcon, 0.0f, nullptr); | |||||
} | |||||
} | |||||
} | |||||
bool isRunning() const override | bool isRunning() const override | ||||
{ | { | ||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
@@ -817,6 +878,7 @@ public: | |||||
fSampleRate = jackbridge_get_sample_rate(client); | fSampleRate = jackbridge_get_sample_rate(client); | ||||
jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1); | jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1); | ||||
jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this); | |||||
jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this); | jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this); | ||||
jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this); | jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this); | ||||
@@ -1016,6 +1078,7 @@ public: | |||||
fUsedGroupNames.clear(); | fUsedGroupNames.clear(); | ||||
fUsedPortNames.clear(); | fUsedPortNames.clear(); | ||||
fUsedConnections.clear(); | fUsedConnections.clear(); | ||||
fGroupIconsChanged.clear(); | |||||
initJackPatchbay(jackbridge_get_client_name(fClient)); | initJackPatchbay(jackbridge_get_client_name(fClient)); | ||||
} | } | ||||
@@ -1051,6 +1114,19 @@ public: | |||||
// ------------------------------------- | // ------------------------------------- | ||||
protected: | protected: | ||||
void handleCustomAppearanceCallback(const char* client_name, const char* key, jack_custom_change_t change) | |||||
{ | |||||
if ((change == JackCustomAdded || change == JackCustomReplaced) && std::strcmp(key, URI_CANVAS_ICON) == 0) | |||||
{ | |||||
const int groupId (getGroupId(client_name)); | |||||
if (groupId == -1) | |||||
return; | |||||
fGroupIconsChanged.append(groupId); | |||||
} | |||||
} | |||||
void handleJackBufferSizeCallback(const uint32_t newBufferSize) | void handleJackBufferSizeCallback(const uint32_t newBufferSize) | ||||
{ | { | ||||
if (fBufferSize == newBufferSize) | if (fBufferSize == newBufferSize) | ||||
@@ -1426,33 +1502,9 @@ protected: | |||||
GroupNameToId groupNameToId(groupId, groupName); | GroupNameToId groupNameToId(groupId, groupName); | ||||
fUsedGroupNames.append(groupNameToId); | fUsedGroupNames.append(groupNameToId); | ||||
PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION; | |||||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, PATCHBAY_ICON_APPLICATION, 0.0f, groupName); | |||||
void* data = nullptr; | |||||
size_t dataSize = 0; | |||||
if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0) | |||||
{ | |||||
const char* const icon((const char*)data); | |||||
CARLA_ASSERT(std::strlen(icon)+1 == dataSize); | |||||
if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0) | |||||
groupIcon = PATCHBAY_ICON_APPLICATION; | |||||
else if (std::strcmp(icon, "hardware") == 0) | |||||
groupIcon = PATCHBAY_ICON_HARDWARE; | |||||
else if (std::strcmp(icon, "carla") == 0) | |||||
groupIcon = PATCHBAY_ICON_CARLA; | |||||
else if (std::strcmp(icon, "distrho") == 0) | |||||
groupIcon = PATCHBAY_ICON_DISTRHO; | |||||
else if (std::strcmp(icon, "file") == 0) | |||||
groupIcon = PATCHBAY_ICON_FILE; | |||||
else if (std::strcmp(icon, "plugin") == 0) | |||||
groupIcon = PATCHBAY_ICON_PLUGIN; | |||||
} | |||||
else if (jackPortFlags & JackPortIsPhysical) | |||||
groupIcon = PATCHBAY_ICON_HARDWARE; | |||||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, groupIcon, 0.0f, groupName); | |||||
fGroupIconsChanged.append(groupId); | |||||
} | } | ||||
bool portIsInput = (jackPortFlags & JackPortIsInput); | bool portIsInput = (jackPortFlags & JackPortIsInput); | ||||
@@ -1729,6 +1781,7 @@ private: | |||||
QList<GroupNameToId> fUsedGroupNames; | QList<GroupNameToId> fUsedGroupNames; | ||||
QList<PortNameToId> fUsedPortNames; | QList<PortNameToId> fUsedPortNames; | ||||
QList<ConnectionToId> fUsedConnections; | QList<ConnectionToId> fUsedConnections; | ||||
QList<int> fGroupIconsChanged; | |||||
int getGroupId(const char* const name) | int getGroupId(const char* const name) | ||||
{ | { | ||||
@@ -1746,6 +1799,24 @@ private: | |||||
return -1; | return -1; | ||||
} | } | ||||
const char* getGroupName(const int groupId) | |||||
{ | |||||
CARLA_ASSERT(groupId >= 0); | |||||
static const char fallback[1] = { '\0' }; | |||||
if (groupId < 0) | |||||
return fallback; | |||||
foreach (const GroupNameToId& groupNameId, fUsedGroupNames) | |||||
{ | |||||
if (groupNameId.id == groupId) | |||||
return groupNameId.name; | |||||
} | |||||
return fallback; | |||||
} | |||||
int getPortId(const char* const fullName) | int getPortId(const char* const fullName) | ||||
{ | { | ||||
CARLA_ASSERT(fullName != nullptr); | CARLA_ASSERT(fullName != nullptr); | ||||
@@ -2023,10 +2094,9 @@ private: | |||||
#define handlePtr ((CarlaEngineJack*)arg) | #define handlePtr ((CarlaEngineJack*)arg) | ||||
static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg) | |||||
static void carla_jack_custom_appearance_callback(const char* client_name, const char* key, jack_custom_change_t change, void* arg) | |||||
{ | { | ||||
handlePtr->handleJackSampleRateCallback(newSampleRate); | |||||
return 0; | |||||
handlePtr->handleCustomAppearanceCallback(client_name, key, change); | |||||
} | } | ||||
static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg) | static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg) | ||||
@@ -2035,6 +2105,12 @@ private: | |||||
return 0; | return 0; | ||||
} | } | ||||
static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg) | |||||
{ | |||||
handlePtr->handleJackSampleRateCallback(newSampleRate); | |||||
return 0; | |||||
} | |||||
static void carla_jack_freewheel_callback(int starting, void* arg) | static void carla_jack_freewheel_callback(int starting, void* arg) | ||||
{ | { | ||||
handlePtr->handleJackFreewheelCallback(bool(starting)); | handlePtr->handleJackFreewheelCallback(bool(starting)); | ||||
@@ -883,6 +883,7 @@ class CarlaMainW(QMainWindow): | |||||
self.connect(self, SIGNAL("PatchbayPortRenamedCallback(int, QString)"), SLOT("slot_handlePatchbayPortRenamedCallback(int, QString)")) | self.connect(self, SIGNAL("PatchbayPortRenamedCallback(int, QString)"), SLOT("slot_handlePatchbayPortRenamedCallback(int, QString)")) | ||||
self.connect(self, SIGNAL("PatchbayConnectionAddedCallback(int, int, int)"), SLOT("slot_handlePatchbayConnectionAddedCallback(int, int, int)")) | self.connect(self, SIGNAL("PatchbayConnectionAddedCallback(int, int, int)"), SLOT("slot_handlePatchbayConnectionAddedCallback(int, int, int)")) | ||||
self.connect(self, SIGNAL("PatchbayConnectionRemovedCallback(int)"), SLOT("slot_handlePatchbayConnectionRemovedCallback(int)")) | self.connect(self, SIGNAL("PatchbayConnectionRemovedCallback(int)"), SLOT("slot_handlePatchbayConnectionRemovedCallback(int)")) | ||||
self.connect(self, SIGNAL("PatchbayIconChangedCallback(int, int)"), SLOT("slot_handlePatchbayIconChangedCallback(int, int)")) | |||||
self.connect(self, SIGNAL("BufferSizeChangedCallback(int)"), SLOT("slot_handleBufferSizeChangedCallback(int)")) | self.connect(self, SIGNAL("BufferSizeChangedCallback(int)"), SLOT("slot_handleBufferSizeChangedCallback(int)")) | ||||
self.connect(self, SIGNAL("SampleRateChangedCallback(double)"), SLOT("slot_handleSampleRateChangedCallback(double)")) | self.connect(self, SIGNAL("SampleRateChangedCallback(double)"), SLOT("slot_handleSampleRateChangedCallback(double)")) | ||||
self.connect(self, SIGNAL("NSM_AnnounceCallback(QString)"), SLOT("slot_handleNSM_AnnounceCallback(QString)")) | self.connect(self, SIGNAL("NSM_AnnounceCallback(QString)"), SLOT("slot_handleNSM_AnnounceCallback(QString)")) | ||||
@@ -1909,12 +1910,12 @@ class CarlaMainW(QMainWindow): | |||||
if clientIcon == PATCHBAY_ICON_HARDWARE: | if clientIcon == PATCHBAY_ICON_HARDWARE: | ||||
pcSplit = patchcanvas.SPLIT_YES | pcSplit = patchcanvas.SPLIT_YES | ||||
pcIcon = patchcanvas.ICON_HARDWARE | pcIcon = patchcanvas.ICON_HARDWARE | ||||
elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||||
pcIcon = patchcanvas.ICON_PLUGIN | |||||
elif clientIcon == PATCHBAY_ICON_DISTRHO: | elif clientIcon == PATCHBAY_ICON_DISTRHO: | ||||
pcIcon = patchcanvas.ICON_DISTRHO | pcIcon = patchcanvas.ICON_DISTRHO | ||||
elif clientIcon == PATCHBAY_ICON_FILE: | elif clientIcon == PATCHBAY_ICON_FILE: | ||||
pcIcon = patchcanvas.ICON_FILE | pcIcon = patchcanvas.ICON_FILE | ||||
elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||||
pcIcon = patchcanvas.ICON_PLUGIN | |||||
patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon) | patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon) | ||||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | ||||
@@ -1971,6 +1972,21 @@ class CarlaMainW(QMainWindow): | |||||
patchcanvas.disconnectPorts(connectionId) | patchcanvas.disconnectPorts(connectionId) | ||||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | ||||
@pyqtSlot(int, int) | |||||
def slot_handlePatchbayIconChangedCallback(self, clientId, clientIcon): | |||||
pcIcon = patchcanvas.ICON_APPLICATION | |||||
if clientIcon == PATCHBAY_ICON_HARDWARE: | |||||
pcIcon = patchcanvas.ICON_HARDWARE | |||||
elif clientIcon == PATCHBAY_ICON_DISTRHO: | |||||
pcIcon = patchcanvas.ICON_DISTRHO | |||||
elif clientIcon == PATCHBAY_ICON_FILE: | |||||
pcIcon = patchcanvas.ICON_FILE | |||||
elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||||
pcIcon = patchcanvas.ICON_PLUGIN | |||||
patchcanvas.setGroupIcon(clientId, pcIcon) | |||||
@pyqtSlot(int) | @pyqtSlot(int) | ||||
def slot_handleBufferSizeChangedCallback(self, newBufferSize): | def slot_handleBufferSizeChangedCallback(self, newBufferSize): | ||||
self.fBufferSize = newBufferSize | self.fBufferSize = newBufferSize | ||||
@@ -2286,6 +2302,8 @@ def engineCallback(ptr, action, pluginId, value1, value2, value3, valueStr): | |||||
Carla.gui.emit(SIGNAL("PatchbayConnectionAddedCallback(int, int, int)"), value1, value2, value3) | Carla.gui.emit(SIGNAL("PatchbayConnectionAddedCallback(int, int, int)"), value1, value2, value3) | ||||
elif action == CALLBACK_PATCHBAY_CONNECTION_REMOVED: | elif action == CALLBACK_PATCHBAY_CONNECTION_REMOVED: | ||||
Carla.gui.emit(SIGNAL("PatchbayConnectionRemovedCallback(int)"), value1) | Carla.gui.emit(SIGNAL("PatchbayConnectionRemovedCallback(int)"), value1) | ||||
elif action == CALLBACK_PATCHBAY_ICON_CHANGED: | |||||
Carla.gui.emit(SIGNAL("PatchbayIconChangedCallback(int, int)"), value1, value2) | |||||
elif action == CALLBACK_BUFFER_SIZE_CHANGED: | elif action == CALLBACK_BUFFER_SIZE_CHANGED: | ||||
Carla.gui.emit(SIGNAL("BufferSizeChangedCallback(int)"), value1) | Carla.gui.emit(SIGNAL("BufferSizeChangedCallback(int)"), value1) | ||||
elif action == CALLBACK_SAMPLE_RATE_CHANGED: | elif action == CALLBACK_SAMPLE_RATE_CHANGED: | ||||
@@ -255,15 +255,16 @@ CALLBACK_PATCHBAY_PORT_REMOVED = 22 | |||||
CALLBACK_PATCHBAY_PORT_RENAMED = 23 | CALLBACK_PATCHBAY_PORT_RENAMED = 23 | ||||
CALLBACK_PATCHBAY_CONNECTION_ADDED = 24 | CALLBACK_PATCHBAY_CONNECTION_ADDED = 24 | ||||
CALLBACK_PATCHBAY_CONNECTION_REMOVED = 25 | CALLBACK_PATCHBAY_CONNECTION_REMOVED = 25 | ||||
CALLBACK_BUFFER_SIZE_CHANGED = 26 | |||||
CALLBACK_SAMPLE_RATE_CHANGED = 27 | |||||
CALLBACK_PROCESS_MODE_CHANGED = 28 | |||||
CALLBACK_NSM_ANNOUNCE = 29 | |||||
CALLBACK_NSM_OPEN = 30 | |||||
CALLBACK_NSM_SAVE = 31 | |||||
CALLBACK_ERROR = 32 | |||||
CALLBACK_INFO = 33 | |||||
CALLBACK_QUIT = 34 | |||||
CALLBACK_PATCHBAY_ICON_CHANGED = 26 | |||||
CALLBACK_BUFFER_SIZE_CHANGED = 27 | |||||
CALLBACK_SAMPLE_RATE_CHANGED = 28 | |||||
CALLBACK_PROCESS_MODE_CHANGED = 29 | |||||
CALLBACK_NSM_ANNOUNCE = 30 | |||||
CALLBACK_NSM_OPEN = 31 | |||||
CALLBACK_NSM_SAVE = 32 | |||||
CALLBACK_ERROR = 33 | |||||
CALLBACK_INFO = 34 | |||||
CALLBACK_QUIT = 35 | |||||
# Process Mode | # Process Mode | ||||
PROCESS_MODE_SINGLE_CLIENT = 0 | PROCESS_MODE_SINGLE_CLIENT = 0 | ||||
@@ -325,6 +325,8 @@ const char* CallbackType2Str(const CallbackType& type) | |||||
return "CALLBACK_PATCHBAY_CONNECTION_ADDED"; | return "CALLBACK_PATCHBAY_CONNECTION_ADDED"; | ||||
case CALLBACK_PATCHBAY_CONNECTION_REMOVED: | case CALLBACK_PATCHBAY_CONNECTION_REMOVED: | ||||
return "CALLBACK_PATCHBAY_CONNECTION_REMOVED"; | return "CALLBACK_PATCHBAY_CONNECTION_REMOVED"; | ||||
case CALLBACK_PATCHBAY_ICON_CHANGED: | |||||
return "CALLBACK_PATCHBAY_ICON_CHANGED"; | |||||
case CALLBACK_RELOAD_INFO: | case CALLBACK_RELOAD_INFO: | ||||
return "CALLBACK_RELOAD_INFO"; | return "CALLBACK_RELOAD_INFO"; | ||||
case CALLBACK_RELOAD_PARAMETERS: | case CALLBACK_RELOAD_PARAMETERS: | ||||