mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 16:46:35 +01:00
tweaks to pianoroll GUI to control capture length and avoid track rec-enabling
Tracks cannot be rec-enabled at the same as clips/slots/cues/triggers are rec-enabled. This means that the "rec-enable" button in a TriggerStrip should not be setting track record enabled status. Instead, it is a GUI-only button that causes a redraw with the appropriate slot icons (play, record) Still a bit of work to be done here but functional again and avoids an assert() failure
This commit is contained in:
parent
bb2812f272
commit
1e7480665c
4 changed files with 55 additions and 11 deletions
|
|
@ -73,9 +73,7 @@ Pianoroll::Pianoroll (std::string const & name, bool with_transport)
|
||||||
, _note_mode (Sustained)
|
, _note_mode (Sustained)
|
||||||
, zoom_in_allocate (false)
|
, zoom_in_allocate (false)
|
||||||
, solo_button (S_("Solo|S"))
|
, solo_button (S_("Solo|S"))
|
||||||
, bar_adjustment (4, 1, 32, 1, 4)
|
, length_label (X_("Record:"))
|
||||||
, bar_spinner (bar_adjustment)
|
|
||||||
, length_label (X_("Record (Bars):"))
|
|
||||||
, ignore_channel_changes (false)
|
, ignore_channel_changes (false)
|
||||||
, with_transport_controls (with_transport)
|
, with_transport_controls (with_transport)
|
||||||
{
|
{
|
||||||
|
|
@ -415,13 +413,21 @@ Pianoroll::build_upper_toolbar ()
|
||||||
rec_enable_button.signal_button_release_event().connect (sigc::mem_fun (*this, &Pianoroll::rec_button_press), false);
|
rec_enable_button.signal_button_release_event().connect (sigc::mem_fun (*this, &Pianoroll::rec_button_press), false);
|
||||||
rec_enable_button.set_name ("record enable button");
|
rec_enable_button.set_name ("record enable button");
|
||||||
|
|
||||||
|
length_selector.AddMenuElem (MenuElem (_("Until Stopped"), sigc::bind (sigc::mem_fun (*this, &Pianoroll::set_recording_length), Temporal::BBT_Offset ())));
|
||||||
|
length_selector.AddMenuElem (MenuElem (_("1 Bar"), sigc::bind (sigc::mem_fun (*this, &Pianoroll::set_recording_length), Temporal::BBT_Offset (1, 0, 0))));
|
||||||
|
std::vector<int> b ({ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 20, 24, 32 });
|
||||||
|
for (auto & n : b) {
|
||||||
|
length_selector.AddMenuElem (MenuElem (string_compose (_("%1 Bars"), n), sigc::bind (sigc::mem_fun (*this, &Pianoroll::set_recording_length), Temporal::BBT_Offset (n, 0, 0))));
|
||||||
|
}
|
||||||
|
length_selector.set_active (_("Until Stopped"));
|
||||||
|
|
||||||
rec_box.set_spacing (12);
|
rec_box.set_spacing (12);
|
||||||
rec_box.pack_start (rec_enable_button, false, false);
|
rec_box.pack_start (rec_enable_button, false, false);
|
||||||
rec_box.pack_start (length_label, false, false);
|
rec_box.pack_start (length_label, false, false);
|
||||||
rec_box.pack_start (bar_spinner, false, false);
|
rec_box.pack_start (length_selector, false, false);
|
||||||
rec_enable_button.show();
|
rec_enable_button.show();
|
||||||
length_label.show ();
|
length_label.show ();
|
||||||
bar_spinner.show ();
|
length_selector.show ();
|
||||||
rec_box.set_no_show_all (true);
|
rec_box.set_no_show_all (true);
|
||||||
/* rec box not shown */
|
/* rec box not shown */
|
||||||
|
|
||||||
|
|
@ -454,6 +460,12 @@ Pianoroll::build_upper_toolbar ()
|
||||||
_contents.signal_map().connect ([this]() {_canvas_viewport->map ();}, false);
|
_contents.signal_map().connect ([this]() {_canvas_viewport->map ();}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Pianoroll::set_recording_length (Temporal::BBT_Offset dur)
|
||||||
|
{
|
||||||
|
rec_length = dur;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Pianoroll::set_visible_channel (int n)
|
Pianoroll::set_visible_channel (int n)
|
||||||
{
|
{
|
||||||
|
|
@ -2148,9 +2160,12 @@ Pianoroll::rec_enable_change ()
|
||||||
rec_enable_button.set_active_state (Gtkmm2ext::ExplicitActive);
|
rec_enable_button.set_active_state (Gtkmm2ext::ExplicitActive);
|
||||||
break;
|
break;
|
||||||
case Enabled:
|
case Enabled:
|
||||||
rec_enable_button.set_active_state (Gtkmm2ext::ExplicitActive);
|
std::cerr << "maybe connect to blink, armed ? " << ref.trigger()->armed() << std::endl;
|
||||||
if (!UIConfiguration::instance().get_no_strobe() && ref.trigger()->armed()) {
|
if (!UIConfiguration::instance().get_no_strobe() && ref.trigger()->armed()) {
|
||||||
|
std::cerr << "connect to blink\n";
|
||||||
rec_blink_connection = Timers::blink_connect (sigc::mem_fun (*this, &Pianoroll::blink_rec_enable));
|
rec_blink_connection = Timers::blink_connect (sigc::mem_fun (*this, &Pianoroll::blink_rec_enable));
|
||||||
|
} else {
|
||||||
|
rec_enable_button.set_active_state (Gtkmm2ext::Off);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Disabled:
|
case Disabled:
|
||||||
|
|
@ -2213,6 +2228,7 @@ Pianoroll::rec_button_press (GdkEventButton* ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ref.box()) {
|
if (!ref.box()) {
|
||||||
|
std::cerr << "no box\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2239,7 +2255,7 @@ Pianoroll::rec_button_press (GdkEventButton* ev)
|
||||||
if (trigger_armed) {
|
if (trigger_armed) {
|
||||||
trigger->disarm ();
|
trigger->disarm ();
|
||||||
} else {
|
} else {
|
||||||
trigger->arm ();
|
trigger->arm (rec_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -2255,7 +2271,6 @@ Pianoroll::set (TriggerReference & tref)
|
||||||
|
|
||||||
rec_box.show ();
|
rec_box.show ();
|
||||||
rec_enable_button.set_sensitive (true);
|
rec_enable_button.set_sensitive (true);
|
||||||
ref.box()->RecEnableChanged.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::rec_enable_change, this), gui_context());
|
|
||||||
|
|
||||||
idle_update_queued.store (0);
|
idle_update_queued.store (0);
|
||||||
|
|
||||||
|
|
@ -2273,6 +2288,7 @@ Pianoroll::set (TriggerReference & tref)
|
||||||
|
|
||||||
_track->DropReferences.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::unset, this), gui_context());
|
_track->DropReferences.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::unset, this), gui_context());
|
||||||
ref.trigger()->PropertyChanged.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::trigger_prop_change, this, _1), gui_context());
|
ref.trigger()->PropertyChanged.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::trigger_prop_change, this, _1), gui_context());
|
||||||
|
ref.trigger()->ArmChanged.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::rec_enable_change, this), gui_context());
|
||||||
|
|
||||||
if (ref.trigger()->the_region()) {
|
if (ref.trigger()->the_region()) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -303,12 +303,14 @@ class Pianoroll : public CueEditor
|
||||||
bool solo_button_press (GdkEventButton*);
|
bool solo_button_press (GdkEventButton*);
|
||||||
bool loop_button_press (GdkEventButton*);
|
bool loop_button_press (GdkEventButton*);
|
||||||
|
|
||||||
Gtk::Adjustment bar_adjustment;
|
ArdourWidgets::ArdourDropdown length_selector;
|
||||||
Gtk::SpinButton bar_spinner;
|
Temporal::BBT_Offset rec_length;
|
||||||
Gtk::Label length_label;
|
Gtk::Label length_label;
|
||||||
Gtk::HBox rec_box;
|
Gtk::HBox rec_box;
|
||||||
Gtk::HBox play_box;
|
Gtk::HBox play_box;
|
||||||
|
|
||||||
|
void set_recording_length (Temporal::BBT_Offset bars);
|
||||||
|
|
||||||
bool rec_button_press (GdkEventButton*);
|
bool rec_button_press (GdkEventButton*);
|
||||||
void rec_enable_change ();
|
void rec_enable_change ();
|
||||||
void blink_rec_enable (bool);
|
void blink_rec_enable (bool);
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,14 @@ TriggerStrip::init ()
|
||||||
mute_solo_table.set_spacings (2);
|
mute_solo_table.set_spacings (2);
|
||||||
mute_solo_table.attach (*mute_button, 0, 1, 0, 1);
|
mute_solo_table.attach (*mute_button, 0, 1, 0, 1);
|
||||||
mute_solo_table.attach (*solo_button, 1, 2, 0, 1);
|
mute_solo_table.attach (*solo_button, 1, 2, 0, 1);
|
||||||
mute_solo_table.attach (*rec_enable_button, 0, 2, 1, 2);
|
|
||||||
|
rec_toggle_button = manage (new ArdourButton);
|
||||||
|
rec_toggle_button->set_name ("record enable button");
|
||||||
|
rec_toggle_button->set_icon (ArdourIcon::RecButton);
|
||||||
|
UI::instance()->set_tip (rec_toggle_button, _("Switch controls from cue launching to cue recording"), "");
|
||||||
|
rec_toggle_button->show ();
|
||||||
|
rec_toggle_button->signal_button_press_event().connect (sigc::mem_fun(*this, &TriggerStrip::rec_toggle_press), false);
|
||||||
|
mute_solo_table.attach (*rec_toggle_button, 0, 2, 1, 2);
|
||||||
|
|
||||||
volume_table.attach (_level_meter, 0, 1, 0, 1);
|
volume_table.attach (_level_meter, 0, 1, 0, 1);
|
||||||
/*Note: _gain_control is added in set_route */
|
/*Note: _gain_control is added in set_route */
|
||||||
|
|
@ -195,6 +202,22 @@ TriggerStrip::init ()
|
||||||
set_size_request (width, -1);
|
set_size_request (width, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TriggerStrip::rec_toggle_press (GdkEventButton* ev)
|
||||||
|
{
|
||||||
|
if (!_route) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_route->triggerbox()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_route->triggerbox()->set_record_enabled (!_route->triggerbox()->record_enabled());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TriggerStrip::set_route (std::shared_ptr<Route> rt)
|
TriggerStrip::set_route (std::shared_ptr<Route> rt)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,9 @@ private:
|
||||||
Gtk::Table mute_solo_table;
|
Gtk::Table mute_solo_table;
|
||||||
Gtk::Table volume_table;
|
Gtk::Table volume_table;
|
||||||
|
|
||||||
|
ArdourWidgets::ArdourButton* rec_toggle_button;
|
||||||
|
bool rec_toggle_press (GdkEventButton* ev);
|
||||||
|
|
||||||
/* Widgets */
|
/* Widgets */
|
||||||
FittedCanvasWidget _tmaster_widget;
|
FittedCanvasWidget _tmaster_widget;
|
||||||
TriggerMaster* _tmaster;
|
TriggerMaster* _tmaster;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue