X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_report.h;h=9fdf5c7b4055e2f3db4299ea14498ddc0c8b2795;hb=b68b4d10a2f5a9d630b6ad22674f5fdf39a67aae;hp=06c6076dff8b923817e456de39ab819ffb6dedee;hpb=88bb11f27ebe291e5019f8427a249349f4f8067a;p=ardour.git diff --git a/gtk2_ardour/export_report.h b/gtk2_ardour/export_report.h index 06c6076dff..9fdf5c7b40 100644 --- a/gtk2_ardour/export_report.h +++ b/gtk2_ardour/export_report.h @@ -18,6 +18,7 @@ #include #include +#include #include "gtkmm2ext/cairo_widget.h" #include "gtkmm2ext/gui_thread.h" @@ -32,25 +33,66 @@ public: CimgArea (Cairo::RefPtr sf) : CairoWidget() , _surface(sf) - , _playhead(-1) - , _x0 (0) - , _aw (0) { set_size_request (sf->get_width (), sf->get_height ()); } - virtual void render (cairo_t* cr, cairo_rectangle_t* r) - { - cairo_rectangle (cr, r->x, r->y, r->width, r->height); - cairo_clip (cr); +protected: + virtual void background (cairo_t* cr, cairo_rectangle_t* r) { cairo_set_source_surface (cr, _surface->cobj(), 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_paint (cr); + } + + virtual void overlay (cairo_t* cr, cairo_rectangle_t* r) {} + + virtual void render (Cairo::RefPtr const& ctx, cairo_rectangle_t* r) + { + ctx->rectangle (r->x, r->y, r->width, r->height); + ctx->clip (); + background (ctx->cobj(), r); + overlay (ctx->cobj(), r); + } + + Cairo::RefPtr _surface; +}; + +class CimgPlayheadArea : public CimgArea +{ +public: + CimgPlayheadArea (Cairo::RefPtr sf, float x0, float w, bool h = false) + : CimgArea (sf) + , _playhead(-1) + , _x0 (x0) + , _aw (w) + , _highlight (h) + { + } + void set_playhead (float pos) { + if (rint (_playhead * _aw) == rint (pos * _aw)) { + return; + } + if (_playhead == -1 || pos == -1) { + set_dirty (); + } else { + invalidate (_playhead); + invalidate (pos); + } + _playhead = pos; + } + + sigc::signal seek_playhead; + +protected: + + virtual void overlay (cairo_t* cr, cairo_rectangle_t* r) { if (_playhead > 0 && _playhead < 1.0 && _aw > 0) { - cairo_rectangle (cr, _x0, 0, _aw, _surface->get_height()); - cairo_set_source_rgba (cr, .4, .4, .6, .4); - cairo_fill (cr); + if (_highlight) { + cairo_rectangle (cr, _x0, 0, _aw, _surface->get_height()); + cairo_set_source_rgba (cr, .4, .4, .6, .4); + cairo_fill (cr); + } const float x = _playhead * _aw; const float h = _surface->get_height(); @@ -62,22 +104,81 @@ public: } } - void set_playhead (float pos) { - // TODO re-expose minimal area only, old playhead pos, new playead pos - if (_playhead == pos) { return; } - _playhead = pos; + bool on_button_press_event (GdkEventButton *ev) { + CairoWidget::on_button_press_event (ev); + if (ev->button == 1 && _aw > 0 && ev->x >= _x0 && ev->x <= _x0 + _aw) { + seek_playhead (((float) ev->x - _x0) / (float)_aw); + } + return true; + } + +private: + float _playhead; + float _x0, _aw; + bool _highlight; + + void invalidate (float pos) { + if (pos < 0 || pos > 1) { return; } + const float x = pos * _aw; + cairo_rectangle_t r; + r.y = 0; + r.x = _x0 + x - 1; + r.width = 3; + r.height = _surface->get_height(); + set_dirty (&r); + } +}; + +class CimgWaveArea : public CimgPlayheadArea +{ +public: + CimgWaveArea ( + Cairo::RefPtr sf, + Cairo::RefPtr sf_log, + Cairo::RefPtr sf_rect, + Cairo::RefPtr sf_logrec, + float x0, float w) + : CimgPlayheadArea (sf, x0, w) + , _sf_log (sf_log) + , _sf_rect (sf_rect) + , _sf_logrec (sf_logrec) + , _logscale (false) + , _rectified (false) + { + } + + void set_logscale (bool en) { + _logscale = en; set_dirty (); } - void set_audition_axis (float x0, float w) { - _x0 = x0; - _aw = w; + void set_rectified (bool en) { + _rectified = en; + set_dirty (); + } + +protected: + + virtual void background (cairo_t* cr, cairo_rectangle_t* r) { + if (_logscale && _rectified) { + cairo_set_source_surface (cr, _sf_logrec->cobj(), 0, 0); + } else if (_logscale) { + cairo_set_source_surface (cr, _sf_log->cobj(), 0, 0); + } else if (_rectified) { + cairo_set_source_surface (cr, _sf_rect->cobj(), 0, 0); + } else { + cairo_set_source_surface (cr, _surface->cobj(), 0, 0); + } + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); } private: - Cairo::RefPtr _surface; - float _playhead; - float _x0, _aw; + Cairo::RefPtr _sf_log; + Cairo::RefPtr _sf_rect; + Cairo::RefPtr _sf_logrec; + bool _logscale; + bool _rectified; }; class ExportReport : public ArdourDialog @@ -85,23 +186,46 @@ class ExportReport : public ArdourDialog public: typedef boost::shared_ptr StatusPtr; ExportReport (ARDOUR::Session*, StatusPtr); + ExportReport (const std::string & title, const ARDOUR::AnalysisResults & ar); int run (); + void on_response (int response_id) { + Gtk::Dialog::on_response (response_id); + } + private: + void init (const ARDOUR::AnalysisResults &, bool); + void draw_waveform (Cairo::RefPtr& wave, + ARDOUR::ExportAnalysisPtr, uint32_t, int, size_t, int, int, bool, bool); + void open_folder (std::string); void audition (std::string, unsigned int, int); void stop_audition (); + void play_audition (); void audition_active (bool); - void audition_progress (ARDOUR::framecnt_t, ARDOUR::framecnt_t); + void audition_seek (int, float); + void audition_progress (ARDOUR::samplecnt_t, ARDOUR::samplecnt_t); void on_switch_page (GtkNotebookPage*, guint page_num); + void on_logscale_toggled (Gtk::ToggleButton*); + void on_rectivied_toggled (Gtk::ToggleButton*); - StatusPtr status; Gtk::Notebook pages; ARDOUR::Session* _session; Gtk::Button* stop_btn; + Gtk::Button* play_btn; PBD::ScopedConnectionList auditioner_connections; - std::vector timeline; + struct AuditionInfo { + AuditionInfo (std::string p, unsigned int c) : path (p), channels (c) {} + AuditionInfo () : channels (0) {} + std::string path; + unsigned int channels; + }; + + std::map > timeline; + std::map files; + std::list waves; + int _audition_num; int _page_num; };