Mutex protect the envelope when manipulating the amount of nodes from the GUI. Should probably redesign this stuff a bit...Init envelope reset nodes.

This commit is contained in:
xenakios 2018-02-27 15:21:36 +02:00
parent 195a630060
commit 51049e4ae1
5 changed files with 15 additions and 7 deletions

View File

@ -104,6 +104,7 @@ public:
void setPreviewDry(bool b); void setPreviewDry(bool b);
bool isPreviewingDry() const; bool isPreviewingDry() const;
int m_param_change_count = 0; int m_param_change_count = 0;
CriticalSection* getMutex() { return &m_cs; }
private: private:
CircularBuffer<float> m_stretchoutringbuf{ 1024 * 1024 }; CircularBuffer<float> m_stretchoutringbuf{ 1024 * 1024 };
AudioBuffer<float> m_file_inbuf; AudioBuffer<float> m_file_inbuf;

View File

@ -29,8 +29,8 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
: AudioProcessorEditor(&p), : AudioProcessorEditor(&p),
m_wavecomponent(p.m_afm,p.m_thumb.get()), m_wavecomponent(p.m_afm,p.m_thumb.get()),
processor(p), m_perfmeter(&p), processor(p), m_perfmeter(&p),
m_wavefilter_tab(TabbedButtonBar::TabsAtTop) m_wavefilter_tab(TabbedButtonBar::TabsAtTop),
m_free_filter_component(p.getStretchSource()->getMutex())
{ {
//addAndMakeVisible(&m_free_filter_component); //addAndMakeVisible(&m_free_filter_component);
m_free_filter_component.set_envelope(processor.m_free_filter_envelope); m_free_filter_component.set_envelope(processor.m_free_filter_envelope);

View File

@ -82,9 +82,9 @@ PaulstretchpluginAudioProcessor::PaulstretchpluginAudioProcessor()
m_playposinfo.timeInSeconds = 0.0; m_playposinfo.timeInSeconds = 0.0;
m_free_filter_envelope = std::make_shared<breakpoint_envelope>(); m_free_filter_envelope = std::make_shared<breakpoint_envelope>();
m_free_filter_envelope->AddNode({ 0.0,0.5 }); m_free_filter_envelope->AddNode({ 0.0,0.75 });
m_free_filter_envelope->AddNode({ 1.0,0.5 }); m_free_filter_envelope->AddNode({ 1.0,0.75 });
m_free_filter_envelope->set_reset_nodes(m_free_filter_envelope->get_all_nodes());
m_recbuffer.setSize(2, 44100); m_recbuffer.setSize(2, 44100);
m_recbuffer.clear(); m_recbuffer.clear();
if (m_afm->getNumKnownFormats()==0) if (m_afm->getNumKnownFormats()==0)

View File

@ -20,7 +20,7 @@
#include "envelope_component.h" #include "envelope_component.h"
EnvelopeComponent::EnvelopeComponent() EnvelopeComponent::EnvelopeComponent(CriticalSection* cs) : m_cs(cs)
{ {
OnEnvelopeEdited = [](breakpoint_envelope*) {}; OnEnvelopeEdited = [](breakpoint_envelope*) {};
setWantsKeyboardFocus(true); setWantsKeyboardFocus(true);
@ -246,7 +246,9 @@ void EnvelopeComponent::mouseDown(const MouseEvent & ev)
int r = menu.show(); int r = menu.show();
if (r == 1) if (r == 1)
{ {
m_cs->enter();
m_envelope->ResetEnvelope(); m_envelope->ResetEnvelope();
m_cs->exit();
} }
if (r == 2) if (r == 2)
{ {
@ -274,7 +276,9 @@ void EnvelopeComponent::mouseDown(const MouseEvent & ev)
m_bubble.showAt({ ev.x,ev.y, 0,0 }, AttributedString("Can't remove last node"), 3000, false, false); m_bubble.showAt({ ev.x,ev.y, 0,0 }, AttributedString("Can't remove last node"), 3000, false, false);
return; return;
} }
m_cs->enter();
m_envelope->DeleteNode(m_node_to_drag); m_envelope->DeleteNode(m_node_to_drag);
m_cs->exit();
m_node_to_drag = -1; m_node_to_drag = -1;
OnEnvelopeEdited(m_envelope.get()); OnEnvelopeEdited(m_envelope.get());
repaint(); repaint();
@ -293,8 +297,10 @@ void EnvelopeComponent::mouseDown(const MouseEvent & ev)
{ {
double normx = jmap((double)ev.x, 0.0, (double)getWidth(), m_view_start_time, m_view_end_time); double normx = jmap((double)ev.x, 0.0, (double)getWidth(), m_view_start_time, m_view_end_time);
double normy = jmap((double)getHeight() - ev.y, 0.0, (double)getHeight(), m_view_start_value, m_view_end_value); double normy = jmap((double)getHeight() - ev.y, 0.0, (double)getHeight(), m_view_start_value, m_view_end_value);
m_cs->enter();
m_envelope->AddNode ({ normx,normy, 0.5}); m_envelope->AddNode ({ normx,normy, 0.5});
m_envelope->SortNodes(); m_envelope->SortNodes();
m_cs->exit();
m_mouse_down = false; m_mouse_down = false;
OnEnvelopeEdited(m_envelope.get()); OnEnvelopeEdited(m_envelope.get());
repaint(); repaint();

View File

@ -32,7 +32,7 @@ class EnvelopeComponent : public Component,
//public TooltipClient //public TooltipClient
{ {
public: public:
EnvelopeComponent(); EnvelopeComponent(CriticalSection* cs);
~EnvelopeComponent(); ~EnvelopeComponent();
void paint(Graphics& g) override; void paint(Graphics& g) override;
void set_envelope(std::shared_ptr<breakpoint_envelope> env, String name = String()); void set_envelope(std::shared_ptr<breakpoint_envelope> env, String name = String());
@ -72,5 +72,6 @@ private:
String m_last_tip; String m_last_tip;
BubbleMessageComponent m_bubble; BubbleMessageComponent m_bubble;
void show_bubble(int x, int y, const envelope_node &node); void show_bubble(int x, int y, const envelope_node &node);
CriticalSection* m_cs = nullptr;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EnvelopeComponent) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EnvelopeComponent)
}; };