2021-12-02 11:50:19 -05:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2021 Paul Davis <paul@linuxaudiosystems.com>
|
|
|
|
* Copyright (C) 2021 Ben Loftis <ben@harrisonconsoles.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
|
2024-09-25 20:38:59 -04:00
|
|
|
#pragma once
|
2021-12-02 11:50:19 -05:00
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
#include <gtkmm/box.h>
|
|
|
|
#include <gtkmm/label.h>
|
|
|
|
#include <gtkmm/table.h>
|
|
|
|
|
|
|
|
#include "ardour/ardour.h"
|
|
|
|
#include "ardour/session_handle.h"
|
2021-12-21 15:38:22 -05:00
|
|
|
#include "ardour/triggerbox.h"
|
2021-12-12 07:43:40 -05:00
|
|
|
#include "ardour/types.h"
|
2021-12-02 11:50:19 -05:00
|
|
|
|
2021-12-10 17:15:16 -05:00
|
|
|
#include "gtkmm2ext/actions.h"
|
|
|
|
#include "gtkmm2ext/bindings.h"
|
2021-12-02 11:50:19 -05:00
|
|
|
#include "gtkmm2ext/cairo_packer.h"
|
|
|
|
|
2021-12-10 14:50:44 -05:00
|
|
|
#include "widgets/ardour_button.h"
|
|
|
|
|
2021-12-02 11:50:19 -05:00
|
|
|
#include "canvas/canvas.h"
|
2021-12-10 11:47:56 -05:00
|
|
|
#include "canvas/container.h"
|
|
|
|
#include "canvas/line.h"
|
2021-12-10 17:15:16 -05:00
|
|
|
#include "canvas/rectangle.h"
|
2021-12-11 01:16:20 -05:00
|
|
|
#include "canvas/ruler.h"
|
2021-12-10 17:15:16 -05:00
|
|
|
#include "canvas/scroll_group.h"
|
2021-12-02 11:50:19 -05:00
|
|
|
|
|
|
|
#include "audio_clock.h"
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
namespace ARDOUR
|
|
|
|
{
|
2021-12-02 11:50:19 -05:00
|
|
|
class Session;
|
|
|
|
class Location;
|
2021-12-13 00:49:29 -05:00
|
|
|
class Trigger;
|
2021-12-02 11:50:19 -05:00
|
|
|
}
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
namespace ArdourCanvas
|
|
|
|
{
|
2021-12-02 11:50:19 -05:00
|
|
|
class Text;
|
|
|
|
class Polygon;
|
2021-12-12 07:43:40 -05:00
|
|
|
}
|
2021-12-11 01:16:20 -05:00
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
namespace ArdourWaveView
|
|
|
|
{
|
|
|
|
class WaveView;
|
2021-12-09 23:12:47 -05:00
|
|
|
}
|
|
|
|
|
2021-12-09 21:45:25 -05:00
|
|
|
class ClipEditorBox : public Gtk::VBox, public ARDOUR::SessionHandlePtr
|
2021-12-02 11:50:19 -05:00
|
|
|
{
|
|
|
|
public:
|
2021-12-09 21:45:25 -05:00
|
|
|
ClipEditorBox () {}
|
|
|
|
~ClipEditorBox () {}
|
2021-12-02 11:50:19 -05:00
|
|
|
|
2023-02-16 18:33:28 -05:00
|
|
|
virtual void set_region (std::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference) = 0;
|
2021-12-10 17:15:56 -05:00
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
static void init ();
|
|
|
|
static void register_clip_editor_actions (Gtkmm2ext::Bindings*);
|
2021-12-10 17:15:56 -05:00
|
|
|
static Glib::RefPtr<Gtk::ActionGroup> clip_editor_actions;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ClipEditor
|
|
|
|
{
|
2021-12-12 07:43:40 -05:00
|
|
|
public:
|
|
|
|
virtual ~ClipEditor () {}
|
2021-12-10 17:15:56 -05:00
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
virtual void zoom_in () = 0;
|
2021-12-10 17:15:56 -05:00
|
|
|
virtual void zoom_out () = 0;
|
2021-12-02 11:50:19 -05:00
|
|
|
};
|
|
|
|
|
2021-12-09 21:45:25 -05:00
|
|
|
class AudioClipEditor : public ArdourCanvas::GtkCanvas
|
2021-12-02 11:50:19 -05:00
|
|
|
{
|
2021-12-12 07:43:40 -05:00
|
|
|
public:
|
2021-12-09 21:45:25 -05:00
|
|
|
AudioClipEditor ();
|
|
|
|
~AudioClipEditor ();
|
2021-12-02 11:50:19 -05:00
|
|
|
|
2023-02-16 18:33:28 -05:00
|
|
|
void set_region (std::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::TriggerReference);
|
2021-12-09 23:12:47 -05:00
|
|
|
void on_size_allocate (Gtk::Allocation&);
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
double sample_to_pixel (ARDOUR::samplepos_t);
|
2021-12-10 14:50:44 -05:00
|
|
|
samplepos_t pixel_to_sample (double);
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
void set_spp (double);
|
|
|
|
double spp () const
|
|
|
|
{
|
|
|
|
return _spp;
|
|
|
|
}
|
2021-12-10 14:50:44 -05:00
|
|
|
|
2021-12-10 17:15:16 -05:00
|
|
|
bool key_press (GdkEventKey*);
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
private:
|
|
|
|
ArdourCanvas::Rectangle* frame;
|
|
|
|
ArdourCanvas::ScrollGroup* waves_container;
|
|
|
|
ArdourCanvas::Container* line_container;
|
|
|
|
ArdourCanvas::Line* start_line;
|
|
|
|
ArdourCanvas::Line* end_line;
|
|
|
|
ArdourCanvas::Line* loop_line;
|
|
|
|
ArdourCanvas::Rectangle* scroll_bar_trough;
|
|
|
|
ArdourCanvas::Rectangle* scroll_bar_handle;
|
2021-12-12 08:00:19 -05:00
|
|
|
ArdourCanvas::Container* ruler_container;
|
|
|
|
ArdourCanvas::Ruler* ruler;
|
2021-12-13 00:49:29 -05:00
|
|
|
|
|
|
|
class ClipBBTMetric : public ArdourCanvas::Ruler::Metric
|
|
|
|
{
|
|
|
|
public:
|
2021-12-24 16:13:36 -05:00
|
|
|
ClipBBTMetric (ARDOUR::TriggerReference tr) : tref (tr) {
|
2021-12-13 00:49:29 -05:00
|
|
|
units_per_pixel = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void get_marks (std::vector<ArdourCanvas::Ruler::Mark>& marks, int64_t lower, int64_t upper, int maxchars) const;
|
|
|
|
|
|
|
|
private:
|
2021-12-24 16:13:36 -05:00
|
|
|
ARDOUR::TriggerReference tref;
|
2021-12-13 00:49:29 -05:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
ClipBBTMetric* clip_metric;
|
2021-12-12 07:43:40 -05:00
|
|
|
std::vector<ArdourWaveView::WaveView*> waves;
|
|
|
|
double non_wave_height;
|
|
|
|
samplepos_t left_origin;
|
|
|
|
double _spp;
|
|
|
|
double scroll_fraction;
|
2023-02-16 18:33:28 -05:00
|
|
|
std::shared_ptr<ARDOUR::AudioRegion> audio_region;
|
2021-12-09 23:12:47 -05:00
|
|
|
|
2021-12-10 18:04:47 -05:00
|
|
|
void scroll_left ();
|
|
|
|
void scrol_right ();
|
|
|
|
|
2021-12-10 13:59:19 -05:00
|
|
|
enum LineType {
|
|
|
|
StartLine,
|
|
|
|
EndLine,
|
|
|
|
LoopLine,
|
|
|
|
};
|
|
|
|
|
2021-12-10 10:54:38 -05:00
|
|
|
bool event_handler (GdkEvent* ev);
|
2021-12-10 13:59:19 -05:00
|
|
|
bool line_event_handler (GdkEvent* ev, ArdourCanvas::Line*);
|
2021-12-10 19:16:47 -05:00
|
|
|
bool scroll_event_handler (GdkEvent* ev);
|
2021-12-09 23:12:47 -05:00
|
|
|
void drop_waves ();
|
2021-12-10 18:04:47 -05:00
|
|
|
void set_wave_heights ();
|
2021-12-10 14:50:44 -05:00
|
|
|
void set_spp_from_length (ARDOUR::samplecnt_t);
|
2021-12-09 23:12:47 -05:00
|
|
|
void set_waveform_colors ();
|
2021-12-10 11:47:56 -05:00
|
|
|
void set_colors ();
|
2021-12-10 14:50:44 -05:00
|
|
|
void position_lines ();
|
2021-12-10 19:16:47 -05:00
|
|
|
void scroll_changed ();
|
2021-12-10 13:59:19 -05:00
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
class LineDrag
|
|
|
|
{
|
|
|
|
public:
|
2021-12-10 13:59:19 -05:00
|
|
|
LineDrag (AudioClipEditor&, ArdourCanvas::Line&);
|
|
|
|
|
|
|
|
void begin (GdkEventButton*);
|
|
|
|
void end (GdkEventButton*);
|
|
|
|
void motion (GdkEventMotion*);
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
private:
|
|
|
|
AudioClipEditor& editor;
|
2021-12-10 13:59:19 -05:00
|
|
|
ArdourCanvas::Line& line;
|
|
|
|
};
|
|
|
|
|
|
|
|
friend class LineDrag;
|
2021-12-10 19:16:47 -05:00
|
|
|
LineDrag* current_line_drag;
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
class ScrollDrag
|
|
|
|
{
|
|
|
|
public:
|
2021-12-10 19:16:47 -05:00
|
|
|
ScrollDrag (AudioClipEditor&);
|
|
|
|
|
|
|
|
void begin (GdkEventButton*);
|
|
|
|
void end (GdkEventButton*);
|
|
|
|
void motion (GdkEventMotion*);
|
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
private:
|
2021-12-10 19:16:47 -05:00
|
|
|
AudioClipEditor& editor;
|
2021-12-12 07:43:40 -05:00
|
|
|
double last_x;
|
2021-12-10 19:16:47 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
friend class ScrollDrag;
|
|
|
|
ScrollDrag* current_scroll_drag;
|
2021-12-02 11:50:19 -05:00
|
|
|
};
|
|
|
|
|
2021-12-09 21:45:25 -05:00
|
|
|
class AudioClipEditorBox : public ClipEditorBox
|
2021-12-02 11:50:19 -05:00
|
|
|
{
|
|
|
|
public:
|
2021-12-09 21:45:25 -05:00
|
|
|
AudioClipEditorBox ();
|
|
|
|
~AudioClipEditorBox ();
|
2021-12-02 11:50:19 -05:00
|
|
|
|
2023-02-16 18:33:28 -05:00
|
|
|
void set_region (std::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference);
|
2021-12-02 11:50:19 -05:00
|
|
|
void region_changed (const PBD::PropertyChange& what_changed);
|
|
|
|
|
|
|
|
private:
|
2021-12-12 07:43:40 -05:00
|
|
|
Gtk::HBox header_box;
|
2021-12-10 14:50:44 -05:00
|
|
|
ArdourWidgets::ArdourButton zoom_in_button;
|
|
|
|
ArdourWidgets::ArdourButton zoom_out_button;
|
2021-12-12 07:43:40 -05:00
|
|
|
Gtk::Label _header_label;
|
|
|
|
Gtk::Table table;
|
2021-12-02 11:50:19 -05:00
|
|
|
|
2021-12-12 07:43:40 -05:00
|
|
|
AudioClipEditor* editor;
|
2021-12-02 11:50:19 -05:00
|
|
|
|
|
|
|
PBD::ScopedConnection state_connection;
|
|
|
|
|
2023-02-16 18:33:28 -05:00
|
|
|
std::shared_ptr<ARDOUR::Region> _region;
|
2021-12-10 14:50:44 -05:00
|
|
|
|
|
|
|
void zoom_in_click ();
|
|
|
|
void zoom_out_click ();
|
2021-12-02 11:50:19 -05:00
|
|
|
};
|
|
|
|
|