#include "ardour/session.h"
#include "ardour/types.h"
#include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "ardour_window.h"
#include "mixer_strip.h"
using namespace ArdourMeter;
MixerStrip* MixerStrip::_entered_mixer_strip;
-
PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
+static const uint32_t n_vca_buttons = 4;
+
MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
: AxisView(sess)
, RouteUI (sess)
, solo_iso_table (1, 2)
, mute_solo_table (1, 2)
, bottom_button_table (1, 3)
+ , vca_table (1, 4)
, meter_point_button (_("pre"))
, monitor_section_button (0)
, midi_input_enable_button (0)
, solo_iso_table (1, 2)
, mute_solo_table (1, 2)
, bottom_button_table (1, 3)
+ , vca_table (1, 4)
, meter_point_button (_("pre"))
, monitor_section_button (0)
, midi_input_enable_button (0)
}
solo_iso_table.show ();
+ vca_table.set_homogeneous (true);
+ vca_table.set_spacings (1);
+ for (uint32_t n = 0; n < n_vca_buttons; ++n) {
+ ArdourButton* v = manage (new ArdourButton (ArdourButton::default_elements));
+ vca_buttons.push_back (v); /* no ownership transfer, button is managed by its container */
+ v->set_no_show_all (true);
+ v->set_name (X_("vca assign"));
+ v->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ v->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_button_release), n), false);
+ UI::instance()->set_tip (*v, string_compose (_("VCA %1 assign"), n));
+ v->set_text (_("v."));
+ v->show ();
+ vca_table.attach (*v, n, n+1, 0, 1);
+ }
+ vca_table.show ();
+
rec_mon_table.set_homogeneous (true);
rec_mon_table.set_row_spacings (2);
rec_mon_table.set_col_spacings (2);
global_vpacker.pack_start (solo_iso_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (mute_solo_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (vca_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
if (!ARDOUR::Profile->get_trx()) {
global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
_visibility.add (&solo_iso_table, X_("SoloIsoLock"), _("Solo Iso / Lock"), false);
_visibility.add (&output_button, X_("Output"), _("Output"), false);
_visibility.add (&_comment_button, X_("Comments"), _("Comments"), false);
+ _visibility.add (&vca_table, X_("VCA"), _("VCA Assigns"), false);
parameter_changed (X_("mixer-element-visibility"));
UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MixerStrip::parameter_changed));
if (is_track ()) {
rec_mon_table.attach (*rec_enable_button, 0, 1, 0, ARDOUR::Profile->get_mixbus() ? 1 : 2);
- rec_enable_button->set_sensitive (_session->writable());
rec_enable_button->show();
if (ARDOUR::Profile->get_mixbus()) {
{
using namespace Menu_Helpers;
- if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
- return;
- }
+ if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
+ return;
+ }
list<boost::shared_ptr<Bundle> >::iterator i = input_menu_bundles.begin ();
while (i != input_menu_bundles.end() && b->has_same_ports (*i) == false) {
{
using namespace Menu_Helpers;
- if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
- return;
- }
+ if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
+ return;
+ }
list<boost::shared_ptr<Bundle> >::iterator i = output_menu_bundles.begin ();
while (i != output_menu_bundles.end() && b->has_same_ports (*i) == false) {
if (for_input) {
set_tooltip (&input_button, tooltip_cstr);
- } else {
+ } else {
set_tooltip (&output_button, tooltip_cstr);
}
MixerStrip::update_input_display ()
{
update_io_button (_route, _width, true);
- panners.setup_pan ();
+ panners.setup_pan ();
if (has_audio_outputs ()) {
panners.show_all ();
MixerStrip::update_output_display ()
{
update_io_button (_route, _width, false);
- gpm.setup_meters ();
- panners.setup_pan ();
+ gpm.setup_meters ();
+ panners.setup_pan ();
if (has_audio_outputs ()) {
panners.show_all ();
i->signal_activate().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*_route, &Route::set_strict_io), !_route->strict_io())));
}
- items.push_back (SeparatorElem());
+ if (1 /* TODO IFF >= 1 plugin-insert */) {
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins)));
+ }
+ items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Adjust Latency..."), sigc::mem_fun (*this, &RouteUI::adjust_latency)));
items.push_back (SeparatorElem());
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
}
-
+
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
}
} else {
processor_box.set_sensitive (true);
}
+ RouteUI::map_frozen ();
}
void
meter_point_button.set_sensitive (true);
mute_button->set_sensitive (true);
solo_button->set_sensitive (true);
- rec_enable_button->set_sensitive (true);
solo_isolated_led->set_sensitive (true);
solo_safe_led->set_sensitive (true);
monitor_input_button->set_sensitive (true);
monitor_disk_button->set_sensitive (true);
_comment_button.set_sensitive (true);
+ RouteUI::check_rec_enable_sensitivity ();
+ set_button_names (); // update solo button visual state
}
void
if (_suspend_menu_callbacks) return;
gpm.set_type (t);
}
+
+void
+MixerStrip::vca_menu_toggle (uint32_t n)
+{
+ if (!_route) {
+ return;
+ }
+
+ boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
+
+ if (!vca) {
+ return;
+ }
+
+ vca->add (_route);
+}
+
+bool
+MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
+{
+ using namespace Gtk::Menu_Helpers;
+
+ if (!_session || !Keyboard::is_context_menu_event (ev)) {
+ return false;
+ }
+
+ VCAManager::VCAS vcas (_session->vca_manager().vcas());
+
+ if (vcas.empty()) {
+ /* XXX should probably show a message saying "No VCA masters" */
+ return true;
+ }
+
+ Menu* menu = new Menu;
+ MenuList& items = menu->items();
+ RadioMenuItem::Group group;
+
+ for (VCAManager::VCAS::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ items.push_back (RadioMenuElem (group, (*v)->name(), sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_menu_toggle), (*v)->number())));
+ }
+
+ menu->popup (1, ev->time);
+
+ return true;
+}