1 /* 2 * Copyright (C) 2008-2011 Paul Davis <paul@linuxaudiosystems.com> 3 * Copyright (C) 2009 David Robillard <d@drobilla.net> 4 * Copyright (C) 2016 Robin Gareus <robin@gareus.org> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License along 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 */ 20 21 #ifndef __ardour_fft_graph_h 22 #define __ardour_fft_graph_h 23 24 #include "ardour/types.h" 25 #include <fftw3.h> 26 27 #include <gtkmm/drawingarea.h> 28 #include <gtkmm/treemodel.h> 29 #include <gdkmm/color.h> 30 31 #include <glibmm/refptr.h> 32 33 #include <string> 34 35 #include "fft_result.h" 36 37 class AnalysisWindow; 38 39 class FFTGraph : public Gtk::DrawingArea 40 { 41 public: 42 43 FFTGraph (int windowSize); 44 ~FFTGraph (); 45 46 void set_analysis_window (AnalysisWindow *a_window); 47 windowSize()48 int windowSize () const { return _windowSize; } 49 void setWindowSize (int windowSize); 50 51 void redraw (); 52 bool on_expose_event (GdkEventExpose* event); 53 bool on_motion_notify_event (GdkEventMotion*); 54 bool on_leave_notify_event (GdkEventCrossing*); on_button_press_event(GdkEventButton *)55 bool on_button_press_event (GdkEventButton*) { return true; } 56 57 void on_size_request (Gtk::Requisition* requisition); 58 void on_size_allocate (Gtk::Allocation & alloc); 59 FFTResult *prepareResult (Gdk::Color color, std::string trackname); 60 set_show_minmax(bool v)61 void set_show_minmax (bool v) { _show_minmax = v; redraw (); } set_show_normalized(bool v)62 void set_show_normalized (bool v) { _show_normalized = v; redraw (); } set_show_proportioanl(bool v)63 void set_show_proportioanl(bool v) { _show_proportional = v; redraw (); } 64 65 private: 66 67 void update_size (); 68 69 void setWindowSize_internal (int windowSize); 70 71 int draw_scales (cairo_t*); 72 73 static const int minScaleWidth = 512; 74 static const int minScaleHeight = 420; 75 76 static const int hl_margin = 40; // this should scale with font (dBFS labels) 77 static const int hr_margin = 12; 78 static const int v_margin = 12; 79 80 int currentScaleWidth; 81 82 int width; 83 int height; 84 85 int _yoff; 86 int _ann_x; 87 int _ann_y; 88 cairo_rectangle_t _ann_area; 89 90 unsigned int _windowSize; 91 unsigned int _dataSize; 92 93 Glib::RefPtr<Pango::Layout> layout; 94 cairo_surface_t* _surface; 95 96 AnalysisWindow *_a_window; 97 98 fftwf_plan _plan; 99 100 float* _out; 101 float* _in; 102 float* _hanning; 103 int* _logScale; 104 105 bool _show_minmax; 106 bool _show_normalized; 107 bool _show_proportional; 108 109 float _fft_start; 110 float _fft_end; 111 float _fft_log_base; 112 113 friend class FFTResult; 114 }; 115 116 #endif /* __ardour_fft_graph_h */ 117