X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Ffaderport%2Foperations.cc;h=ce6bb3e3d2e7e4fbdaa5f607db15adf2c743219f;hb=1aab360b7d944350dea1f5ef81394229adb07c1e;hp=05c9e02beb074a28f04fe65731213c48d3326848;hpb=fe06e3b7e81feebb0be5544fdd6bf3a96295a89e;p=ardour.git diff --git a/libs/surfaces/faderport/operations.cc b/libs/surfaces/faderport/operations.cc index 05c9e02beb..ce6bb3e3d2 100644 --- a/libs/surfaces/faderport/operations.cc +++ b/libs/surfaces/faderport/operations.cc @@ -17,14 +17,93 @@ */ +#include "ardour/async_midi_port.h" +#include "ardour/monitor_processor.h" +#include "ardour/pannable.h" +#include "ardour/plugin_insert.h" #include "ardour/rc_configuration.h" +#include "ardour/record_enable_control.h" #include "ardour/session.h" #include "ardour/track.h" +#include "ardour/types.h" #include "faderport.h" using namespace ARDOUR; using namespace ArdourSurface; +using namespace PBD; + +/* this value is chosen to given smooth motion from 0..1.0 in about 270 degrees + * of encoder rotation. + */ +static const double encoder_divider = 24.0; + +void +FaderPort::left () +{ + access_action ("Editor/select-prev-route"); + + //ToDo: bank by 8? + //if ( (button_state & ShiftDown) == ShiftDown ) + +} + +void +FaderPort::right () +{ + access_action ("Editor/select-next-route"); + + //ToDo: bank by 8? + //if ( (button_state & ShiftDown) == ShiftDown ) +} + + +void +FaderPort::read () +{ + if (_current_stripable) { + boost::shared_ptr gain = _current_stripable->gain_control (); + if (gain) { + gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Play ); + } + } +} + +void +FaderPort::write () +{ + if (_current_stripable) { + boost::shared_ptr gain = _current_stripable->gain_control (); + if (gain) { + gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Write ); + } + } +} + +void +FaderPort::touch () +{ + if (_current_stripable) { + boost::shared_ptr gain = _current_stripable->gain_control (); + if (gain) { + gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Touch ); + } + } +} + +void +FaderPort::off () +{ + if (_current_stripable) { + boost::shared_ptr gain = _current_stripable->gain_control (); + if (gain) { + gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Off ); + } + } +} + + + void FaderPort::undo () @@ -41,47 +120,179 @@ FaderPort::redo () void FaderPort::mute () { - if (!_current_route) { + if (!_current_stripable) { return; } - boost::shared_ptr rl (new RouteList); - rl->push_back (_current_route); - session->set_mute (rl, !_current_route->muted()); + if (_current_stripable == session->monitor_out()) { + boost::shared_ptr mp = _current_stripable->monitor_control(); + mp->set_cut_all (!mp->cut_all()); + return; + } + + _current_stripable->mute_control()->set_value (!_current_stripable->mute_control()->muted(), PBD::Controllable::UseGroup); } void FaderPort::solo () { - if (!_current_route) { + if (!_current_stripable) { + return; + } + + _current_stripable->solo_control()->set_value (_current_stripable->solo_control()->soloed(), PBD::Controllable::UseGroup); +} + +void +FaderPort::rec_enable () +{ + if (!_current_stripable) { + return; + } + + boost::shared_ptr t = boost::dynamic_pointer_cast(_current_stripable); + + if (!t) { return; } - boost::shared_ptr rl (new RouteList); - rl->push_back (_current_route); + t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup); +} - if (Config->get_solo_control_is_listen_control()) { - session->set_listen (rl, !_current_route->listening_via_monitor()); +void +FaderPort::use_master () +{ + boost::shared_ptr r = session->master_out(); + if (r) { + if (_current_stripable == r) { + r = pre_master_stripable.lock(); + set_current_stripable (r); + get_button(Output).set_led_state (_output_port, false); + blinkers.remove (Output); + } else { + if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) { + pre_master_stripable = boost::weak_ptr (_current_stripable); + } + set_current_stripable (r); + get_button(Output).set_led_state (_output_port, true); + blinkers.remove (Output); + } + } +} + +void +FaderPort::use_monitor () +{ + boost::shared_ptr r = session->monitor_out(); + + if (r) { + if (_current_stripable == r) { + r = pre_monitor_stripable.lock(); + set_current_stripable (r); + get_button(Output).set_led_state (_output_port, false); + blinkers.remove (Output); + } else { + if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) { + pre_monitor_stripable = boost::weak_ptr (_current_stripable); + } + set_current_stripable (r); + get_button(Output).set_led_state (_output_port, true); + blinkers.push_back (Output); + } } else { - session->set_solo (rl, !_current_route->soloed()); } } void -FaderPort::rec_enable () +FaderPort::ardour_pan_azimuth (int delta) { - if (!_current_route) { + if (!_current_stripable) { return; } - boost::shared_ptr t = boost::dynamic_pointer_cast(_current_route); + boost::shared_ptr r = boost::dynamic_pointer_cast (_current_stripable); - if (!t) { + if (!r) { + return; + } + + boost::shared_ptr pannable = r->pannable (); + + if (!pannable) { + return; + } + + boost::shared_ptr azimuth = pannable->pan_azimuth_control; + + if (!azimuth) { + return; + } + + azimuth->set_value (azimuth->interface_to_internal (azimuth->internal_to_interface (azimuth->get_value()) + (delta / encoder_divider)), Controllable::NoGroup); +} + + +void +FaderPort::ardour_pan_width(int delta) +{ + if (!_current_stripable) { + return; + } + + boost::shared_ptr r = boost::dynamic_pointer_cast (_current_stripable); + + if (!r) { + return; + } + + boost::shared_ptr pannable = r->pannable (); + + if (!pannable) { + return; + } + + boost::shared_ptr width = pannable->pan_width_control; + + if (!width) { + return; + } + + width->set_value (width->interface_to_internal (width->internal_to_interface (width->get_value()) + (delta / encoder_divider)), Controllable::NoGroup); +} + +void +FaderPort::mixbus_pan (int delta) +{ +#ifdef MIXBUS + if (!_current_stripable) { + return; + } + boost::shared_ptr r = boost::dynamic_pointer_cast (_current_stripable); + + if (!r) { + return; + } + + + const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h + boost::shared_ptr plug = r->ch_post(); + + if (!plug) { return; } - boost::shared_ptr rl (new RouteList); - rl->push_back (_current_route); + boost::shared_ptr azimuth = boost::dynamic_pointer_cast (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan))); - session->set_record_enabled (rl, !t->record_enabled()); + if (!azimuth) { + return; + } + + azimuth->set_value (azimuth->interface_to_internal (azimuth->internal_to_interface (azimuth->get_value()) + (delta / encoder_divider)), Controllable::NoGroup); +#endif +} + +void +FaderPort::punch () +{ + access_action ("Transport/TogglePunch"); }