ASPiK SDK
Use the ICustomView Pointer

Back in the PluginCore's PluginCore::processMessage( ) function, we add the code to the handler for the PLUGINGUI_TIMERPING message that will pump out the queued audio data and call the repaint message on the custom view object. Note that we are sharing the same lock-free ring buffer that the PluginCore object owns and distributing (copying) data to both custom views:

case PLUGINGUI_TIMERPING:
{
if (waveView || spectrumView)
{
float audioSample = 0.0;
// --- try to get a value from queue
bool success = customViewDataQueue.try_dequeue(audioSample);
// --- if succeeds:
if (success)
{
// --- empty queue into views; the each handle this differently
while (success)
{
if (waveView)
waveView->pushDataValue(audioSample);
if (spectrumView)
spectrumView->pushDataValue(audioSample);
// -- try to get next value until queue is empty
success = customViewDataQueue.try_dequeue(audioSample);
}
}
// --- update and mark view as dirty
if (waveView)
waveView->updateView();
if (spectrumView)
spectrumView->updateView();
return true;
}
return false;
}
//

This is all the code that you need to make the system work. The lock-free ring buffers and the custom view object handle the rest of the work.