You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
7.5KB

  1. /*
  2. ==============================================================================
  3. This file was auto-generated!
  4. It contains the basic framework code for a JUCE plugin editor.
  5. ==============================================================================
  6. */
  7. #pragma once
  8. #include "../JuceLibraryCode/JuceHeader.h"
  9. #include "PluginProcessor.h"
  10. #include <memory>
  11. #include <vector>
  12. inline void attachCallback(Button& button, std::function<void()> callback)
  13. {
  14. struct ButtonCallback : public Button::Listener,
  15. private ComponentListener
  16. {
  17. ButtonCallback(Button& b, std::function<void()> f) : target(b), fn(f)
  18. {
  19. target.addListener(this);
  20. target.addComponentListener(this);
  21. }
  22. ~ButtonCallback()
  23. {
  24. target.removeListener(this);
  25. }
  26. void componentBeingDeleted(Component&) override { delete this; }
  27. void buttonClicked(Button*) override { fn(); }
  28. Button& target;
  29. std::function<void()> fn;
  30. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ButtonCallback)
  31. };
  32. new ButtonCallback(button, callback);
  33. }
  34. class MySlider : public Slider
  35. {
  36. public:
  37. MySlider(NormalisableRange<float>* range) : m_range(range)
  38. {
  39. }
  40. double proportionOfLengthToValue(double x) override
  41. {
  42. return m_range->convertFrom0to1(x);
  43. }
  44. double valueToProportionOfLength(double x) override
  45. {
  46. return m_range->convertTo0to1(x);
  47. }
  48. private:
  49. NormalisableRange<float>* m_range = nullptr;
  50. };
  51. class ParameterComponent : public Component,
  52. public Slider::Listener, public Button::Listener
  53. {
  54. public:
  55. ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease) : m_par(par)
  56. {
  57. addAndMakeVisible(&m_label);
  58. m_label.setText(par->getName(50),dontSendNotification);
  59. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(par);
  60. if (floatpar)
  61. {
  62. m_slider = std::make_unique<MySlider>(&floatpar->range);
  63. m_notify_only_on_release = notifyOnlyOnRelease;
  64. m_slider->setRange(floatpar->range.start, floatpar->range.end, floatpar->range.interval);
  65. m_slider->setValue(*floatpar, dontSendNotification);
  66. m_slider->addListener(this);
  67. addAndMakeVisible(m_slider.get());
  68. }
  69. AudioParameterChoice* choicepar = dynamic_cast<AudioParameterChoice*>(par);
  70. if (choicepar)
  71. {
  72. }
  73. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(par);
  74. if (boolpar)
  75. {
  76. m_togglebut = std::make_unique<ToggleButton>();
  77. m_togglebut->setToggleState(*boolpar, dontSendNotification);
  78. m_togglebut->addListener(this);
  79. addAndMakeVisible(m_togglebut.get());
  80. }
  81. }
  82. void resized() override
  83. {
  84. m_label.setBounds(0, 0, 200, 24);
  85. if (m_slider)
  86. m_slider->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
  87. if (m_togglebut)
  88. m_togglebut->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
  89. }
  90. void sliderValueChanged(Slider* slid) override
  91. {
  92. if (m_notify_only_on_release == true)
  93. return;
  94. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  95. *floatpar = slid->getValue();
  96. }
  97. void sliderDragStarted(Slider* slid) override
  98. {
  99. m_dragging = true;
  100. }
  101. void sliderDragEnded(Slider* slid) override
  102. {
  103. m_dragging = false;
  104. if (m_notify_only_on_release == false)
  105. return;
  106. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  107. *floatpar = slid->getValue();
  108. }
  109. void buttonClicked(Button* but) override
  110. {
  111. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
  112. if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
  113. {
  114. *boolpar = m_togglebut->getToggleState();
  115. }
  116. }
  117. void updateComponent()
  118. {
  119. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  120. if (m_slider != nullptr && m_dragging == false && (float)m_slider->getValue() != *floatpar)
  121. {
  122. m_slider->setValue(*floatpar, dontSendNotification);
  123. }
  124. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
  125. if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
  126. {
  127. m_togglebut->setToggleState(*boolpar, dontSendNotification);
  128. }
  129. }
  130. private:
  131. Label m_label;
  132. AudioProcessorParameter* m_par = nullptr;
  133. std::unique_ptr<MySlider> m_slider;
  134. std::unique_ptr<ComboBox> m_combobox;
  135. std::unique_ptr<ToggleButton> m_togglebut;
  136. bool m_notify_only_on_release = false;
  137. bool m_dragging = false;
  138. };
  139. class MyThumbCache : public AudioThumbnailCache
  140. {
  141. public:
  142. MyThumbCache() : AudioThumbnailCache(100) { /*Logger::writeToLog("Constructed AudioThumbNailCache");*/ }
  143. ~MyThumbCache() { /*Logger::writeToLog("Destructed AudioThumbNailCache");*/ }
  144. };
  145. class WaveformComponent : public Component, public ChangeListener, public Timer
  146. {
  147. public:
  148. WaveformComponent(AudioFormatManager* afm);
  149. ~WaveformComponent();
  150. void changeListenerCallback(ChangeBroadcaster* cb) override;
  151. void paint(Graphics& g) override;
  152. void setAudioFile(File f);
  153. const File& getAudioFile() const { return m_curfile; }
  154. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  155. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  156. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  157. void timerCallback() override;
  158. std::function<double()> CursorPosCallback;
  159. std::function<void(double)> SeekCallback;
  160. std::function<void(Range<double>, int)> TimeSelectionChangedCallback;
  161. void mouseDown(const MouseEvent& e) override;
  162. void mouseUp(const MouseEvent& e) override;
  163. void mouseDrag(const MouseEvent& e) override;
  164. void mouseMove(const MouseEvent& e) override;
  165. Range<double> getTimeSelection()
  166. {
  167. if (m_time_sel_start >= 0.0 && m_time_sel_end>m_time_sel_start + 0.001)
  168. return { m_time_sel_start, m_time_sel_end };
  169. return { 0.0, 1.0 };
  170. }
  171. void setTimeSelection(Range<double> rng)
  172. {
  173. if (m_lock_timesel_set == true)
  174. return;
  175. if (rng.isEmpty())
  176. rng = { -1.0,1.0 };
  177. m_time_sel_start = rng.getStart();
  178. m_time_sel_end = rng.getEnd();
  179. repaint();
  180. }
  181. void setFileCachedRange(std::pair<Range<double>, Range<double>> rng);
  182. void setTimerEnabled(bool b);
  183. void setViewRange(Range<double> rng);
  184. Value ShowFileCacheRange;
  185. void setRecordingPosition(double pos) { m_rec_pos = pos; }
  186. private:
  187. SharedResourcePointer<MyThumbCache> m_thumbcache;
  188. std::unique_ptr<AudioThumbnail> m_thumb;
  189. Range<double> m_view_range{ 0.0,1.0 };
  190. int m_time_sel_drag_target = 0;
  191. double m_time_sel_start = -1.0;
  192. double m_time_sel_end = -1.0;
  193. double m_drag_time_start = 0.0;
  194. bool m_mousedown = false;
  195. bool m_didseek = false;
  196. bool m_didchangetimeselection = false;
  197. int m_topmargin = 0;
  198. int getTimeSelectionEdge(int x, int y);
  199. std::pair<Range<double>, Range<double>> m_file_cached;
  200. File m_curfile;
  201. Image m_waveimage;
  202. OpenGLContext m_ogl;
  203. bool m_use_opengl = false;
  204. double m_rec_pos = 0.0;
  205. bool m_lock_timesel_set = false;
  206. };
  207. class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor,
  208. public MultiTimer
  209. {
  210. public:
  211. PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&);
  212. ~PaulstretchpluginAudioProcessorEditor();
  213. void paint (Graphics&) override;
  214. void resized() override;
  215. void timerCallback(int id) override;
  216. void setAudioFile(File f);
  217. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  218. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  219. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  220. WaveformComponent m_wavecomponent;
  221. private:
  222. PaulstretchpluginAudioProcessor& processor;
  223. std::vector<std::shared_ptr<ParameterComponent>> m_parcomps;
  224. ToggleButton m_rec_enable;
  225. TextButton m_import_button;
  226. Label m_info_label;
  227. void chooseFile();
  228. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
  229. };