#include "ardour/tempo.h"
#include "ardour_button.h"
-#include "ardour_ui.h"
#include "automation_controller.h"
#include "gui_thread.h"
#include "note_select_dialog.h"
using namespace ARDOUR;
using namespace Gtk;
+using PBD::Controllable;
+
AutomationBarController::AutomationBarController (
boost::shared_ptr<Automatable> printer,
boost::shared_ptr<AutomationControl> ac,
} else {
but->set_name("generic button");
}
+ but->set_controllable(ac);
but->signal_clicked.connect(
sigc::mem_fun(*this, &AutomationController::toggled));
-
_widget = but;
} else {
AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj));
AutomationController::value_adjusted ()
{
if (!_ignore_change) {
- _controllable->set_value (_controllable->interface_to_internal(_adjustment->get_value()));
+ _controllable->set_value (_controllable->interface_to_internal(_adjustment->get_value()), Controllable::NoGroup);
}
/* A bar controller will automatically follow the adjustment, but for a
AutomationController::start_touch()
{
_controllable->start_touch (_controllable->session().transport_frame());
- StartGesture.emit(); /* EMIT SIGNAL */
}
void
}
_controllable->stop_touch (mark, when);
+ } else {
+ _controllable->stop_touch (false, _controllable->session().transport_frame());
}
- StopGesture.emit(); /* EMIT SIGNAL */
}
void
AutomationController::toggled ()
{
ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
+ const AutoState as = _controllable->automation_state ();
+ const double where = _controllable->session ().audible_frame ();
+ const bool to_list = _controllable->list () && _controllable->session().transport_rolling () && (as == Touch || as == Write);
+
if (but) {
- if (_controllable->session().transport_rolling()) {
- if (_controllable->automation_state() == Touch) {
- _controllable->set_automation_state(Write);
- }
- if (_controllable->list()) {
- _controllable->list()->set_in_write_pass(true, false, _controllable->session().audible_frame());
+ if (to_list) {
+ if (as == Touch && _controllable->list ()->in_new_write_pass ()) {
+ _controllable->alist ()->start_write_pass (where);
}
+ _controllable->list ()->set_in_write_pass (true, false, where);
}
- const bool was_active = _controllable->get_value() >= 0.5;
- if (was_active && but->get_active()) {
- _adjustment->set_value(0.0);
- but->set_active(false);
- } else if (!was_active && !but->get_active()) {
- _adjustment->set_value(1.0);
- but->set_active(true);
+ /* set to opposite value.*/
+ _controllable->set_double (but->get_active () ? 0.0 : 1.0, where, to_list);
+
+ const bool active = _controllable->get_double (to_list, where) >= 0.5;
+ if (active && !but->get_active ()) {
+ _adjustment->set_value (1.0);
+ but->set_active (true);
+ } else if (!active && but->get_active ()) {
+ _adjustment->set_value (0.0);
+ but->set_active (false);
}
}
}
const double value = ((_controllable->desc().unit == ARDOUR::ParameterDescriptor::HZ)
? midi_note_to_hz(dialog->note_number())
: dialog->note_number());
- _controllable->set_value(clamp(value, desc.lower, desc.upper));
+ _controllable->set_value(clamp(value, desc.lower, desc.upper), Controllable::NoGroup);
}
delete dialog;
}
const ARDOUR::ParameterDescriptor& desc = _controllable->desc();
const ARDOUR::Session& session = _controllable->session();
const framepos_t pos = session.transport_frame();
- const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at(pos);
+ const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at_frame (pos);
const double bpm = tempo.beats_per_minute();
const double bps = bpm / 60.0;
const double freq = bps / beats;
- _controllable->set_value(clamp(freq, desc.lower, desc.upper));
+ _controllable->set_value(clamp(freq, desc.lower, desc.upper), Controllable::NoGroup);
}
void
{
const ARDOUR::ParameterDescriptor& desc = _controllable->desc();
const double value = _controllable->get_value() * ratio;
- _controllable->set_value(clamp(value, desc.lower, desc.upper));
+ _controllable->set_value(clamp(value, desc.lower, desc.upper), Controllable::NoGroup);
}
bool
}
if (is_low) {
for (int beats = 1; beats <= 16; ++beats) {
- items.push_back(MenuElem(string_compose(_("Set to %1 beat(s)"), (int)beats),
+ items.push_back(MenuElem (string_compose(P_("Set to %1 beat", "Set to %1 beats", beats), beats),
sigc::bind(sigc::mem_fun(*this, &AutomationController::set_freq_beats),
(double)beats)));
}