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.

224 lines
6.8KB

  1. /*
  2. Copyright (C) 2006-2011 Nasca Octavian Paul
  3. Author: Nasca Octavian Paul
  4. Copyright (C) 2017 Xenakios
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of version 2 of the GNU General Public License
  7. as published by the Free Software Foundation.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License (version 2) for more details.
  12. You should have received a copy of the GNU General Public License (version 2)
  13. along with this program; if not, write to the Free Software Foundation,
  14. Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  15. */
  16. #pragma once
  17. #include "../JuceLibraryCode/JuceHeader.h"
  18. #include "PluginProcessor.h"
  19. #include <memory>
  20. #include <vector>
  21. class zoom_scrollbar : public Component
  22. {
  23. public:
  24. enum hot_area
  25. {
  26. ha_none,
  27. ha_left_edge,
  28. ha_right_edge,
  29. ha_handle
  30. };
  31. void mouseDown(const MouseEvent& e) override;
  32. void mouseMove(const MouseEvent& e) override;
  33. void mouseDrag(const MouseEvent& e) override;
  34. void mouseEnter(const MouseEvent &event) override;
  35. void mouseExit(const MouseEvent &event) override;
  36. void paint(Graphics &g) override;
  37. std::function<void(Range<double>)> RangeChanged;
  38. Range<double> get_range() const { return m_therange; }
  39. void setRange(Range<double> rng, bool docallback);
  40. private:
  41. Range<double> m_therange{ 0.0,1.0 };
  42. hot_area m_hot_area = ha_none;
  43. hot_area get_hot_area(int x, int y);
  44. int m_drag_start_x = 0;
  45. };
  46. class SpectralVisualizer : public Component
  47. {
  48. public:
  49. SpectralVisualizer();
  50. void setState(const ProcessParameters& pars, int nfreqs, double samplerate);
  51. void paint(Graphics& g) override;
  52. private:
  53. Image m_img;
  54. std::vector<REALTYPE> m_insamples,m_freqs1, m_freqs2, m_freqs3;
  55. std::unique_ptr<FFT> m_fft;
  56. int m_nfreqs = 0;
  57. double m_elapsed = 0.0;
  58. };
  59. class MySlider : public Slider
  60. {
  61. public:
  62. MySlider() {}
  63. MySlider(NormalisableRange<float>* range);
  64. double proportionOfLengthToValue(double x) override;
  65. double valueToProportionOfLength(double x) override;
  66. private:
  67. NormalisableRange<float>* m_range = nullptr;
  68. };
  69. class ParameterComponent : public Component,
  70. public Slider::Listener, public Button::Listener
  71. {
  72. public:
  73. ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease);
  74. void resized() override;
  75. void sliderValueChanged(Slider* slid) override;
  76. void sliderDragStarted(Slider* slid) override;
  77. void sliderDragEnded(Slider* slid) override;
  78. void buttonClicked(Button* but) override;
  79. void updateComponent();
  80. void setHighLighted(bool b);
  81. int m_group_id = -1;
  82. private:
  83. Label m_label;
  84. AudioProcessorParameter* m_par = nullptr;
  85. std::unique_ptr<MySlider> m_slider;
  86. std::unique_ptr<ComboBox> m_combobox;
  87. std::unique_ptr<ToggleButton> m_togglebut;
  88. bool m_notify_only_on_release = false;
  89. bool m_dragging = false;
  90. Colour m_labeldefcolor;
  91. };
  92. class PerfMeterComponent : public Component
  93. {
  94. public:
  95. PerfMeterComponent(PaulstretchpluginAudioProcessor* p);
  96. void paint(Graphics& g) override;
  97. void mouseDown(const MouseEvent& ev) override;
  98. PaulstretchpluginAudioProcessor* m_proc = nullptr;
  99. private:
  100. ColourGradient m_gradient;
  101. };
  102. class MyThumbCache : public AudioThumbnailCache
  103. {
  104. public:
  105. MyThumbCache() : AudioThumbnailCache(200) { /*Logger::writeToLog("Constructed AudioThumbNailCache");*/ }
  106. ~MyThumbCache() { /*Logger::writeToLog("Destructed AudioThumbNailCache");*/ }
  107. };
  108. class WaveformComponent : public Component, public ChangeListener, public Timer
  109. {
  110. public:
  111. WaveformComponent(AudioFormatManager* afm, AudioThumbnail* thumb);
  112. ~WaveformComponent();
  113. void changeListenerCallback(ChangeBroadcaster* cb) override;
  114. void paint(Graphics& g) override;
  115. void timerCallback() override;
  116. std::function<double()> CursorPosCallback;
  117. std::function<void(double)> SeekCallback;
  118. std::function<void(Range<double>, int)> TimeSelectionChangedCallback;
  119. std::function<File()> GetFileCallback;
  120. void mouseDown(const MouseEvent& e) override;
  121. void mouseUp(const MouseEvent& e) override;
  122. void mouseDrag(const MouseEvent& e) override;
  123. void mouseMove(const MouseEvent& e) override;
  124. void mouseDoubleClick(const MouseEvent& e) override;
  125. Range<double> getTimeSelection();
  126. void setTimeSelection(Range<double> rng);
  127. void setFileCachedRange(std::pair<Range<double>, Range<double>> rng);
  128. void setTimerEnabled(bool b);
  129. void setViewRange(Range<double> rng);
  130. Value ShowFileCacheRange;
  131. void setRecordingPosition(double pos) { m_rec_pos = pos; }
  132. int m_image_init_count = 0;
  133. int m_image_update_count = 0;
  134. private:
  135. AudioThumbnail* m_thumbnail = nullptr;
  136. Range<double> m_view_range{ 0.0,1.0 };
  137. int m_time_sel_drag_target = 0;
  138. double m_time_sel_start = -1.0;
  139. double m_time_sel_end = -1.0;
  140. double m_drag_time_start = 0.0;
  141. bool m_mousedown = false;
  142. bool m_didseek = false;
  143. bool m_didchangetimeselection = false;
  144. int m_topmargin = 0;
  145. int getTimeSelectionEdge(int x, int y);
  146. std::pair<Range<double>, Range<double>> m_file_cached;
  147. bool m_image_dirty = false;
  148. Image m_waveimage;
  149. OpenGLContext m_ogl;
  150. bool m_use_opengl = false;
  151. double m_rec_pos = 0.0;
  152. bool m_lock_timesel_set = false;
  153. bool m_using_audio_buffer = false;
  154. void updateCachedImage();
  155. };
  156. class SpectralChainEditor : public Component
  157. {
  158. public:
  159. SpectralChainEditor() {}
  160. void paint(Graphics& g) override;
  161. void setSource(StretchAudioSource* src);
  162. void mouseDown(const MouseEvent& ev) override;
  163. void mouseDrag(const MouseEvent& ev) override;
  164. void mouseUp(const MouseEvent& ev) override;
  165. std::function<void(int)> ModuleSelectedCallback;
  166. std::function<void(void)> ModuleOrderOrEnabledChangedCallback;
  167. private:
  168. StretchAudioSource * m_src = nullptr;
  169. bool m_did_drag = false;
  170. int m_cur_index = -1;
  171. int m_drag_x = 0;
  172. std::vector<SpectrumProcess> m_order;
  173. void drawBox(Graphics& g, int index, int x, int y, int w, int h);
  174. };
  175. class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor,
  176. public MultiTimer, public FileDragAndDropTarget, public DragAndDropContainer
  177. {
  178. public:
  179. PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&);
  180. ~PaulstretchpluginAudioProcessorEditor();
  181. void paint (Graphics&) override;
  182. void resized() override;
  183. void timerCallback(int id) override;
  184. bool isInterestedInFileDrag(const StringArray &files) override;
  185. void filesDropped(const StringArray &files, int x, int y) override;
  186. WaveformComponent m_wavecomponent;
  187. private:
  188. PaulstretchpluginAudioProcessor& processor;
  189. std::vector<std::shared_ptr<ParameterComponent>> m_parcomps;
  190. //SpectralVisualizer m_specvis;
  191. PerfMeterComponent m_perfmeter;
  192. TextButton m_import_button;
  193. TextButton m_settings_button;
  194. Label m_info_label;
  195. SpectralChainEditor m_spec_order_ed;
  196. void chooseFile();
  197. void showSettingsMenu();
  198. String m_last_err;
  199. zoom_scrollbar m_zs;
  200. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
  201. };