From c65812f70948e57f2def4e604b6813ce0e3a3be4 Mon Sep 17 00:00:00 2001 From: xenakios Date: Mon, 12 Feb 2018 20:51:05 +0200 Subject: [PATCH] Performance improvements for painting waveform during capture mode etc --- Source/PluginEditor.cpp | 33 ++++++++++++++++++++++++--------- Source/PluginEditor.h | 5 ++++- paulstretchplugin.jucer | 2 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 2fa1218..74ea489 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -243,6 +243,7 @@ void PaulstretchpluginAudioProcessorEditor::timerCallback(int id) infotext += " (offline rendering)"; if (processor.m_playposinfo.isPlaying) infotext += " "+String(processor.m_playposinfo.timeInSeconds,1); + infotext += " " + String(m_wavecomponent.m_image_init_count) + " " + String(m_wavecomponent.m_image_update_count); m_info_label.setText(infotext, dontSendNotification); m_perfmeter.repaint(); } @@ -394,8 +395,21 @@ WaveformComponent::~WaveformComponent() void WaveformComponent::changeListenerCallback(ChangeBroadcaster * /*cb*/) { - m_waveimage = Image(); - repaint(); + jassert(MessageManager::getInstance()->isThisTheMessageThread()); + m_image_dirty = true; + //repaint(); +} + +void WaveformComponent::updateCachedImage() +{ + Graphics tempg(m_waveimage); + tempg.fillAll(Colours::black); + tempg.setColour(Colours::darkgrey); + double thumblen = m_thumbnail->getTotalLength(); + m_thumbnail->drawChannels(tempg, { 0,0,getWidth(),getHeight() - m_topmargin }, + thumblen*m_view_range.getStart(), thumblen*m_view_range.getEnd(), 1.0f); + m_image_dirty = false; + ++m_image_update_count; } void WaveformComponent::paint(Graphics & g) @@ -425,16 +439,17 @@ void WaveformComponent::paint(Graphics & g) bool m_use_cached_image = true; if (m_use_cached_image == true) { - if (m_waveimage.isValid() == false || m_waveimage.getWidth() != getWidth() + if (m_image_dirty == true || m_waveimage.getWidth() != getWidth() || m_waveimage.getHeight() != getHeight() - m_topmargin) { //Logger::writeToLog("updating cached waveform image"); - m_waveimage = Image(Image::ARGB, getWidth(), getHeight() - m_topmargin, true); - Graphics tempg(m_waveimage); - tempg.fillAll(Colours::black); - tempg.setColour(Colours::darkgrey); - m_thumbnail->drawChannels(tempg, { 0,0,getWidth(),getHeight() - m_topmargin }, - thumblen*m_view_range.getStart(), thumblen*m_view_range.getEnd(), 1.0f); + if (m_waveimage.getWidth() != getWidth() + || m_waveimage.getHeight() != getHeight() - m_topmargin) + { + m_waveimage = Image(Image::ARGB, getWidth(), getHeight() - m_topmargin, true); + ++m_image_init_count; + } + updateCachedImage(); } g.drawImage(m_waveimage, 0, m_topmargin, getWidth(), getHeight() - m_topmargin, 0, 0, getWidth(), getHeight() - m_topmargin); diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 7f5982d..2364086 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -115,6 +115,8 @@ public: void setViewRange(Range rng); Value ShowFileCacheRange; void setRecordingPosition(double pos) { m_rec_pos = pos; } + int m_image_init_count = 0; + int m_image_update_count = 0; private: AudioThumbnail* m_thumbnail = nullptr; Range m_view_range{ 0.0,1.0 }; @@ -128,13 +130,14 @@ private: int m_topmargin = 0; int getTimeSelectionEdge(int x, int y); std::pair, Range> m_file_cached; - + bool m_image_dirty = false; Image m_waveimage; OpenGLContext m_ogl; bool m_use_opengl = false; double m_rec_pos = 0.0; bool m_lock_timesel_set = false; bool m_using_audio_buffer = false; + void updateCachedImage(); }; class SpectralChainEditor : public Component diff --git a/paulstretchplugin.jucer b/paulstretchplugin.jucer index 862d90e..d05769f 100644 --- a/paulstretchplugin.jucer +++ b/paulstretchplugin.jucer @@ -7,7 +7,7 @@ buildVST3="0" buildAU="1" buildAUv3="0" buildRTAS="0" buildAAX="0" buildStandalone="1" enableIAA="0" pluginName="PaulXStretch" pluginDesc="PaulXStretch" pluginManufacturer="Xenakios" pluginManufacturerCode="XenS" pluginCode="Fn1r" - pluginChannelConfigs="{2,2},{2,4}, {2,8}, {8,8}" pluginIsSynth="0" + pluginChannelConfigs="{2,4}, {2,8}, {8,8}, {2,2}" pluginIsSynth="0" pluginWantsMidiIn="0" pluginProducesMidiOut="0" pluginIsMidiEffectPlugin="0" pluginEditorRequiresKeys="0" pluginAUExportPrefix="paulxstretchAU" pluginRTASCategory="" aaxIdentifier="com.yourcompany.paulstretchplugin"