Ardour  8.12
recorder_ui.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 Robin Gareus <robin@gareus.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #ifndef __gtk_ardour_recorder_ui_h__
20 #define __gtk_ardour_recorder_ui_h__
21 
22 #include <list>
23 #include <memory>
24 #include <vector>
25 
26 #include <gtkmm/alignment.h>
27 #include <gtkmm/box.h>
28 #include <gtkmm/scrolledwindow.h>
29 #include <gtkmm/sizegroup.h>
30 #include <gtkmm/table.h>
31 
32 #include "pbd/natsort.h"
33 
34 #include "ardour/session_handle.h"
35 #include "ardour/circular_buffer.h"
36 #include "ardour/types.h"
37 
38 #include "gtkmm2ext/bindings.h"
39 #include "gtkmm2ext/cairo_widget.h"
40 
41 #include "widgets/ardour_button.h"
42 #include "widgets/ardour_spacer.h"
43 #include "widgets/frame.h"
44 #include "widgets/pane.h"
45 #include "widgets/tabbable.h"
46 
47 #include "input_port_monitor.h"
48 #include "rec_info_box.h"
49 #include "shuttle_control.h"
50 #include "transport_control_ui.h"
51 
52 namespace ARDOUR {
53  class SoloMuteRelease;
54  class IOPlug;
55 }
56 
57 class TrackRecordAxis;
58 class RecorderGroupTabs;
59 
61 {
62 public:
65 
67  void cleanup ();
68 
69  XMLNode& get_state () const;
70  int set_state (const XMLNode&, int /* version */);
71 
72  Gtk::Window* use_own_window (bool and_fill_it);
73 
74  void spill_port (std::string const&);
75  void add_track (std::string const&);
76 
77 private:
78  void load_bindings ();
80  void update_title ();
82  void parameter_changed (std::string const&);
85  void regions_changed (std::shared_ptr<ARDOUR::RegionList>, PBD::PropertyChange const&);
86 
87  void start_updating ();
88  void stop_updating ();
89  bool update_meters ();
90  void add_or_remove_io (ARDOUR::DataType, std::vector<std::string>, bool);
92  void io_plugin_add (std::shared_ptr<ARDOUR::IOPlug>);
93  void io_plugin_going_away (std::weak_ptr<ARDOUR::IOPlug>);
94  void post_add_remove (bool);
96 
103  void tabbed_changed (bool);
104 
105  void set_connections (std::string const&);
106  void port_connected_or_disconnected (std::string, std::string);
107  void port_pretty_name_changed (std::string);
108 
112 
114 
115  void arm_all ();
116  void arm_none ();
117 
118  void rec_undo ();
119  void rec_redo ();
120 
121  void peak_reset ();
122 
125  void update_monitorstate (std::string, bool);
126  void new_track_for_port (ARDOUR::DataType, std::string const&);
127 
128  static int calc_columns (int child_width, int parent_width);
129 
143 
159  Glib::RefPtr<Gtk::SizeGroup> _toolbar_button_height;
160  Glib::RefPtr<Gtk::SizeGroup> _toolbar_recarm_width;
161  Glib::RefPtr<Gtk::SizeGroup> _toolbar_monitoring_width;
162 
165  bool _vertical;
166 
167  std::set<std::string> _spill_port_names;
168 
170  {
171  public:
173 
176  void set_right_edge (int);
177 
178  protected:
179  void render (Cairo::RefPtr<Cairo::Context> const&, cairo_rectangle_t*);
182 
183  private:
184  Glib::RefPtr<Pango::Layout> _layout;
187  int _width;
190  };
191 
192  class InputPort : public Gtk::EventBox
193  {
194  public:
195  InputPort (std::string const&, ARDOUR::DataType, RecorderUI*, bool vertical = false, bool ioplug = false);
197 
198  void set_frame_label (std::string const&);
200  void setup_name ();
201  bool spill (bool);
202  bool spilled () const;
203  void allow_monitoring (bool);
204  void update_monitorstate (bool);
206 
208  bool ioplug () const { return _ioplug; }
209  std::string const& name () const;
210 
211  void update (float, float); // FastMeter
212  void update (float const*); // EventMeter
213  void update (ARDOUR::CircularSampleBuffer&); // InputScope
214  void update (ARDOUR::CircularEventBuffer&); // EventMonitor
215  void clear ();
216 
217  bool operator< (InputPort const& o) const {
218  if (_ioplug != o._ioplug) {
219  return !_ioplug;
220  }
221  if (_dt == o._dt) {
222  return PBD::naturally_less (_port_name.c_str (), o._port_name.c_str ());
223  }
224  return _dt < (uint32_t) o._dt;
225  }
226 
227  private:
228  void rename_port ();
231 
241  std::string _port_name;
242  bool _ioplug;
245 
247  static Glib::RefPtr<Gtk::SizeGroup> _name_size_group;
248  static Glib::RefPtr<Gtk::SizeGroup> _ctrl_size_group;
249  static Glib::RefPtr<Gtk::SizeGroup> _monitor_size_group;
250  };
251 
253  bool operator() (std::shared_ptr<InputPort> const& a, std::shared_ptr<InputPort> const& b) const {
254  return *a < *b;
255  }
256  };
257 
258  typedef std::map<std::string, std::shared_ptr<InputPort> > InputPortMap;
259  typedef std::set<std::shared_ptr<InputPort>, InputPortPtrSort> InputPortSet;
260  typedef std::set<std::shared_ptr<ARDOUR::IOPlug>> IOPlugSet;
261 
267 
269  std::list<TrackRecordAxis*> _recorders;
270  std::list<TrackRecordAxis*> _visible_recorders;
272 
278 
279 public:
280  /* only for RecorderGroupTab */
281  std::list<TrackRecordAxis*> visible_recorders () const;
282 };
283 
284 #endif /* __gtk_ardour_recorder_ui_h__ */
Gtk::Label _name_label
Definition: recorder_ui.h:239
InputPortMonitor _monitor
Definition: recorder_ui.h:233
ARDOUR::WeakRouteList _connected_routes
Definition: recorder_ui.h:243
ARDOUR::DataType data_type() const
void update(ARDOUR::CircularSampleBuffer &)
std::string _port_name
Definition: recorder_ui.h:241
void set_frame_label(std::string const &)
void update(float const *)
void update(ARDOUR::CircularEventBuffer &)
std::string const & name() const
bool ioplug() const
Definition: recorder_ui.h:208
ArdourWidgets::ArdourButton _name_button
Definition: recorder_ui.h:238
ARDOUR::DataType _dt
Definition: recorder_ui.h:232
bool monitor_release(GdkEventButton *)
ArdourWidgets::ArdourButton _add_button
Definition: recorder_ui.h:240
ARDOUR::SoloMuteRelease * _solo_release
Definition: recorder_ui.h:244
static Glib::RefPtr< Gtk::SizeGroup > _ctrl_size_group
Definition: recorder_ui.h:248
static Glib::RefPtr< Gtk::SizeGroup > _monitor_size_group
Definition: recorder_ui.h:249
bool spilled() const
void update_monitorstate(bool)
void set_connections(ARDOUR::WeakRouteList)
ArdourWidgets::ArdourButton _spill_button
Definition: recorder_ui.h:236
void update(float, float)
ArdourWidgets::Frame _frame
Definition: recorder_ui.h:235
void allow_monitoring(bool)
Gtk::Alignment _alignment
Definition: recorder_ui.h:234
bool monitor_press(GdkEventButton *)
static bool _size_groups_initialized
Definition: recorder_ui.h:246
bool operator<(InputPort const &o) const
Definition: recorder_ui.h:217
InputPort(std::string const &, ARDOUR::DataType, RecorderUI *, bool vertical=false, bool ioplug=false)
ArdourWidgets::ArdourButton _monitor_button
Definition: recorder_ui.h:237
static Glib::RefPtr< Gtk::SizeGroup > _name_size_group
Definition: recorder_ui.h:247
Glib::RefPtr< Pango::Layout > _layout
Definition: recorder_ui.h:184
void on_size_request(Gtk::Requisition *)
This is a default handler for the signal signal_size_request().
ARDOUR::samplecnt_t _left
Definition: recorder_ui.h:188
void render(Cairo::RefPtr< Cairo::Context > const &, cairo_rectangle_t *)
void playhead_position_changed(ARDOUR::samplepos_t)
ARDOUR::samplecnt_t _right
Definition: recorder_ui.h:189
void set_right_edge(int)
void set_gui_extents(samplepos_t, samplepos_t)
bool on_button_press_event(GdkEventButton *)
This is a default handler for the signal signal_button_press_event().
IOPlugSet _ioplugins
Definition: recorder_ui.h:271
ArdourWidgets::ArdourHSpacer _ruler_sep
Definition: recorder_ui.h:265
Gtk::ScrolledWindow _meter_scroller
Definition: recorder_ui.h:139
void spill_port(std::string const &)
ArdourWidgets::ArdourButton _monitor_disk_button
Definition: recorder_ui.h:151
void update_io_widget_labels()
void update_sensitivity()
void arm_none()
ArdourWidgets::VPane _pane
Definition: recorder_ui.h:134
void update_spacer_width(Gtk::Allocation &, TrackRecordAxis *)
std::list< TrackRecordAxis * > visible_recorders() const
void post_add_remove(bool)
int _meter_area_cols
Definition: recorder_ui.h:164
ArdourWidgets::ArdourHSpacer _toolbar_sep
Definition: recorder_ui.h:144
ArdourWidgets::ArdourButton _btn_peak_reset
Definition: recorder_ui.h:149
Gtk::EventBox _scroller_base
Definition: recorder_ui.h:142
Gtk::Label _recs_label
Definition: recorder_ui.h:145
void port_pretty_name_changed(std::string)
std::set< std::string > _spill_port_names
Definition: recorder_ui.h:167
ArdourWidgets::ArdourButton _btn_rec_forget
Definition: recorder_ui.h:148
void rec_redo()
PBD::ScopedConnectionList _going_away_connections
Definition: recorder_ui.h:277
Gtk::Table _button_table
Definition: recorder_ui.h:133
static int calc_columns(int child_width, int parent_width)
void update_rec_table_layout()
void regions_changed(std::shared_ptr< ARDOUR::RegionList >, PBD::PropertyChange const &)
Gtkmm2ext::Bindings * bindings
Definition: recorder_ui.h:130
void peak_reset()
XMLNode & get_state() const
void meter_area_size_request(GtkRequisition *)
Gtk::VBox _rec_area
Definition: recorder_ui.h:138
Glib::RefPtr< Gtk::SizeGroup > _toolbar_recarm_width
Definition: recorder_ui.h:160
void arm_all()
Gtk::EventBox _space
Definition: recorder_ui.h:263
void io_plugins_changed()
bool _vertical
Definition: recorder_ui.h:165
void meter_area_size_allocate(Gtk::Allocation &)
int _meter_box_width
Definition: recorder_ui.h:163
ArdourWidgets::ArdourButton _monitor_in_button
Definition: recorder_ui.h:150
XrunInfoBox _xrun_info_box
Definition: recorder_ui.h:156
RemainInfoBox _remain_info_box
Definition: recorder_ui.h:157
PBD::ScopedConnectionList _engine_connections
Definition: recorder_ui.h:275
void meter_area_layout()
void add_or_remove_io(ARDOUR::DataType, std::vector< std::string >, bool)
void tabbed_changed(bool)
void initial_track_display()
Glib::RefPtr< Gtk::SizeGroup > _toolbar_button_height
Definition: recorder_ui.h:159
Gtk::VBox _content
Definition: recorder_ui.h:131
void set_session(ARDOUR::Session *)
Gtk::HBox _ruler_box
Definition: recorder_ui.h:264
void add_routes(ARDOUR::RouteList &)
void new_track_for_port(ARDOUR::DataType, std::string const &)
void load_bindings()
std::set< std::shared_ptr< ARDOUR::IOPlug > > IOPlugSet
Definition: recorder_ui.h:260
TransportControlUI _transport_ctrl
Definition: recorder_ui.h:158
void io_plugin_add(std::shared_ptr< ARDOUR::IOPlug >)
ArdourWidgets::ArdourButton _btn_rec_all
Definition: recorder_ui.h:146
InputPortMap _input_ports
Definition: recorder_ui.h:268
void remove_route(TrackRecordAxis *)
Gtk::Window * use_own_window(bool and_fill_it)
void presentation_info_changed(PBD::PropertyChange const &)
sigc::connection _ruler_width_update_connection
Definition: recorder_ui.h:274
void io_plugin_going_away(std::weak_ptr< ARDOUR::IOPlug >)
DurationInfoBox _duration_info_box
Definition: recorder_ui.h:155
int set_state(const XMLNode &, int)
void start_updating()
bool update_meters()
Glib::RefPtr< Gtk::SizeGroup > _toolbar_monitoring_width
Definition: recorder_ui.h:161
Gtk::Table _meter_table
Definition: recorder_ui.h:141
ArdourWidgets::ArdourButton _auto_input_button
Definition: recorder_ui.h:154
bool scroller_button_event(GdkEventButton *)
void parameter_changed(std::string const &)
void add_track(std::string const &)
Gtk::HBox _rec_groups
Definition: recorder_ui.h:137
void update_monitorstate(std::string, bool)
Gtk::VBox _rec_container
Definition: recorder_ui.h:136
void cleanup()
std::map< std::string, std::shared_ptr< InputPort > > InputPortMap
Definition: recorder_ui.h:258
Gtk::ScrolledWindow _rec_scroller
Definition: recorder_ui.h:135
void rec_undo()
Gtk::HBox _toolbar
Definition: recorder_ui.h:132
RecorderGroupTabs * _rec_group_tabs
Definition: recorder_ui.h:266
Gtk::VBox _meter_area
Definition: recorder_ui.h:140
void register_actions()
sigc::connection _fast_screen_update_connection
Definition: recorder_ui.h:273
void port_connected_or_disconnected(std::string, std::string)
ArdourWidgets::ArdourButton _btn_new_plist
Definition: recorder_ui.h:152
PBD::ScopedConnection _monitor_connection
Definition: recorder_ui.h:276
void update_title()
RecRuler _ruler
Definition: recorder_ui.h:262
void session_going_away()
void update_recordstate()
ArdourWidgets::ArdourButton _btn_rec_none
Definition: recorder_ui.h:147
void gui_extents_changed()
void stop_updating()
std::list< TrackRecordAxis * > _recorders
Definition: recorder_ui.h:269
void set_connections(std::string const &)
std::set< std::shared_ptr< InputPort >, InputPortPtrSort > InputPortSet
Definition: recorder_ui.h:259
void tra_name_edit(TrackRecordAxis *, bool)
std::list< TrackRecordAxis * > _visible_recorders
Definition: recorder_ui.h:270
ArdourWidgets::ArdourButton _btn_new_plist_rec
Definition: recorder_ui.h:153
Definition: xml++.h:114
Temporal::samplecnt_t samplecnt_t
std::list< std::shared_ptr< Route > > RouteList
Temporal::samplepos_t samplepos_t
std::list< std::weak_ptr< Route > > WeakRouteList
bool naturally_less(const char *a, const char *b)
Definition: natsort.h:174
bool operator()(std::shared_ptr< InputPort > const &a, std::shared_ptr< InputPort > const &b) const
Definition: recorder_ui.h:253