Also process OSC in idle callback

This commit is contained in:
Jean Pierre Cimalando 2020-11-24 08:24:39 +01:00
parent ae1c4e2245
commit 41dae2fe24
2 changed files with 46 additions and 2 deletions

View file

@ -18,12 +18,14 @@ static ViewRect sfizzUiViewRect { 0, 0, Editor::viewWidth, Editor::viewHeight };
enum { enum {
kOscTempSize = 8192, kOscTempSize = 8192,
kOscQueueSize = 65536,
}; };
SfizzVstEditor::SfizzVstEditor(SfizzVstController* controller) SfizzVstEditor::SfizzVstEditor(SfizzVstController* controller)
: VSTGUIEditor(controller, &sfizzUiViewRect), : VSTGUIEditor(controller, &sfizzUiViewRect),
oscTemp_(new uint8_t[kOscTempSize]) oscTemp_(new uint8_t[kOscTempSize])
{ {
oscQueue_.reserve(kOscQueueSize);
} }
SfizzVstEditor::~SfizzVstEditor() SfizzVstEditor::~SfizzVstEditor()
@ -57,6 +59,8 @@ bool PLUGIN_API SfizzVstEditor::open(void* parent, const VSTGUI::PlatformType& p
mustRedisplayState_ = true; mustRedisplayState_ = true;
mustRedisplayUiState_ = true; mustRedisplayUiState_ = true;
mustRedisplayPlayState_ = true; mustRedisplayPlayState_ = true;
flushOscQueue();
updateStateDisplay(); updateStateDisplay();
if (!frame->open(parent, platformType, config)) { if (!frame->open(parent, platformType, config)) {
@ -81,6 +85,8 @@ void PLUGIN_API SfizzVstEditor::close()
frame->close(); frame->close();
this->frame = nullptr; this->frame = nullptr;
} }
flushOscQueue();
} }
/// ///
@ -105,8 +111,10 @@ CMessageResult SfizzVstEditor::notify(CBaseObject* sender, const char* message)
} }
#endif #endif
if (message == CVSTGUITimer::kMsgTimer) if (message == CVSTGUITimer::kMsgTimer) {
processOscQueue();
updateStateDisplay(); updateStateDisplay();
}
return result; return result;
} }
@ -140,13 +148,44 @@ SfizzUiState SfizzVstEditor::getCurrentUiState() const
void SfizzVstEditor::receiveMessage(const void* data, uint32_t size) void SfizzVstEditor::receiveMessage(const void* data, uint32_t size)
{ {
if (!frame) {
// only accumulate if message processing is active
return;
}
std::lock_guard<std::recursive_mutex> lock(stateMutex_);
std::copy(
reinterpret_cast<const uint8_t*>(data),
reinterpret_cast<const uint8_t*>(data) + size,
std::back_inserter(oscQueue_));
}
void SfizzVstEditor::processOscQueue()
{
std::lock_guard<std::recursive_mutex> lock(stateMutex_);
const uint8_t* oscData = oscQueue_.data();
size_t oscSize = oscQueue_.size();
const char* path; const char* path;
const char* sig; const char* sig;
const sfizz_arg_t* args; const sfizz_arg_t* args;
uint8_t buffer[1024]; uint8_t buffer[1024];
if (sfizz_extract_message(data, size, buffer, sizeof(buffer), &path, &sig, &args) > 0) uint32_t msgSize;
while ((msgSize = sfizz_extract_message(oscData, oscSize, buffer, sizeof(buffer), &path, &sig, &args)) > 0) {
uiReceiveMessage(path, sig, args); uiReceiveMessage(path, sig, args);
oscData += msgSize;
oscSize -= msgSize;
}
oscQueue_.clear();
}
void SfizzVstEditor::flushOscQueue()
{
std::lock_guard<std::recursive_mutex> lock(stateMutex_);
oscQueue_.clear();
} }
/// ///

View file

@ -41,6 +41,10 @@ public:
SfizzUiState getCurrentUiState() const; SfizzUiState getCurrentUiState() const;
void receiveMessage(const void* data, uint32_t size); void receiveMessage(const void* data, uint32_t size);
private:
void processOscQueue();
void flushOscQueue();
protected: protected:
// EditorController // EditorController
void uiSendValue(EditId id, const EditValue& v) override; void uiSendValue(EditId id, const EditValue& v) override;
@ -75,4 +79,5 @@ private:
volatile bool mustRedisplayState_ = false; volatile bool mustRedisplayState_ = false;
volatile bool mustRedisplayUiState_ = false; volatile bool mustRedisplayUiState_ = false;
volatile bool mustRedisplayPlayState_ = false; volatile bool mustRedisplayPlayState_ = false;
std::vector<uint8_t> oscQueue_;
}; };