#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/internal_send.h"
+#include "ardour/meter.h"
#include "ardour/midi_track.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
+#include "ardour/panner_manager.h"
#include "ardour/port.h"
#include "ardour/profile.h"
#include "ardour/route.h"
#include "i18n.h"
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using namespace Gtk;
using namespace Gtkmm2ext;
, rec_solo_table (2, 2)
, top_button_table (1, 2)
, middle_button_table (1, 2)
- , bottom_button_table (1, 2)
+ , bottom_button_table (1, 3)
, meter_point_button (_("pre"))
, midi_input_enable_button (0)
, _comment_button (_("Comments"))
, button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL))
, button_table (3, 1)
, middle_button_table (1, 2)
- , bottom_button_table (1, 2)
+ , bottom_button_table (1, 3)
, meter_point_button (_("pre"))
, midi_input_enable_button (0)
, _comment_button (_("Comments"))
void
MixerStrip::init ()
{
+ int button_table_row = 0;
+
input_selector = 0;
output_selector = 0;
group_menu = 0;
*/
set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5);
- bottom_button_table.attach (meter_point_button, 1, 2, 0, 1);
+ bottom_button_table.attach (meter_point_button, 2, 3, 0, 1);
meter_point_button.signal_button_press_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_press), false);
meter_point_button.signal_button_release_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_release), false);
top_button_table.set_homogeneous (true);
top_button_table.set_spacings (2);
- top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
- top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+ if (!ARDOUR::Profile->get_trx()) {
+ top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
+ top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+ }
top_button_table.show ();
rec_solo_table.set_homogeneous (true);
rec_solo_table.set_row_spacings (2);
rec_solo_table.set_col_spacings (2);
- rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
- rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+ if (!ARDOUR::Profile->get_trx()) {
+ rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
+ rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+ }
rec_solo_table.show ();
button_table.set_homogeneous (false);
button_size_group->add_widget (*monitor_input_button);
}
- button_table.attach (name_button, 0, 1, 0, 1);
- button_table.attach (input_button_box, 0, 1, 1, 2);
- button_table.attach (_invert_button_box, 0, 1, 2, 3);
+ if (!ARDOUR::Profile->get_trx()) {
+ button_table.attach (name_button, 0, 1, button_table_row, button_table_row+1);
+ button_table_row++;
+ button_table.attach (input_button_box, 0, 2, button_table_row, button_table_row+1);
+ button_table_row++;
+ button_table.attach (_invert_button_box, 0, 2, button_table_row, button_table_row+1);
+ button_table_row++;
+ }
middle_button_table.set_homogeneous (true);
middle_button_table.set_spacings (2);
bottom_button_table.set_spacings (2);
- bottom_button_table.set_homogeneous (true);
-// bottom_button_table.attach (group_button, 0, 1, 0, 1);
- bottom_button_table.attach (gpm.gain_automation_state_button, 0, 1, 0, 1);
+ bottom_button_table.set_homogeneous (false);
+ button_table_row = 0;
+ bottom_button_table.attach (group_button, 0, 1, button_table_row, button_table_row+1);
+ bottom_button_table.attach (gpm.gain_automation_state_button, 1, 2, button_table_row, button_table_row+1);
+ button_table_row++;
name_button.set_name ("mixer strip button");
name_button.set_text (" "); /* non empty text, forces creation of the layout */
width_hide_box.pack_start (top_event_box, true, true);
width_hide_box.pack_end (hide_button, false, true);
+ number_label.set_text ("-");
+ number_label.set_no_show_all ();
+ number_label.set_name ("tracknumber label");
+ number_label.set_fixed_colors (0x80808080, 0x80808080);
+ number_label.set_elements (ArdourButton::Element(ArdourButton::Body | ArdourButton::Text));
+ number_label.set_alignment (.5, .5);
+ top_event_box.add (number_label);
+
whvbox.pack_start (width_hide_box, true, true);
global_vpacker.set_spacing (2);
- global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
- global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
- global_vpacker.pack_start (processor_box, true, true);
+ if (!ARDOUR::Profile->get_trx()) {
+ global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (processor_box, true, true);
+ }
global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
global_vpacker.pack_start (top_button_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (rec_solo_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (middle_button_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
- global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
- global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+ if (!ARDOUR::Profile->get_trx()) {
+ global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+ } else {
+ global_vpacker.pack_start (name_button, Gtk::PACK_SHRINK);
+ }
global_frame.add (global_vpacker);
global_frame.set_shadow_type (Gtk::SHADOW_IN);
/* ditto for this button and busses */
+ number_label.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
name_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::select_route_group), false);
parameter_changed (X_("mixer-strip-visibility"));
Config->ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, boost::bind (&MixerStrip::parameter_changed, this, _1), gui_context());
+ _session->config.ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, boost::bind (&MixerStrip::parameter_changed, this, _1), gui_context());
gpm.LevelMeterButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&MixerStrip::level_meter_button_press, this, _1));
}
rec_enable_button->set_sensitive (_session->writable());
rec_enable_button->show();
+ if (ARDOUR::Profile->get_trx()) {
+ rec_solo_table.attach (*monitor_input_button, 1, 2, 0, 2);
+ }
+
} else {
/* non-master bus */
_route->output()->changed.connect (*this, invalidator (*this), boost::bind (&MixerStrip::update_output_display, this), gui_context());
_route->route_group_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::route_group_changed, this), gui_context());
+ _route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::io_changed_proxy, this), gui_context ());
+
if (_route->panner_shell()) {
+ update_panner_choices();
_route->panner_shell()->Changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::connect_to_pan, this), gui_context());
}
if (!route()->is_master() && !route()->is_monitor()) {
/* we don't allow master or control routes to be hidden */
hide_button.show();
+ number_label.show();
}
gpm.reset_peak_display ();
gpm.gain_display.show ();
gpm.peak_display.show ();
+ top_event_box.show();
width_button.show();
width_hide_box.show();
whvbox.show ();
{
using namespace Menu_Helpers;
if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
msg.run ();
return true;
}
citems.clear();
if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
msg.run ();
return true;
}
void
MixerStrip::update_diskstream_display ()
{
- if (is_track()) {
+ if (is_track() && input_selector) {
+ input_selector->hide_all ();
+ }
- if (input_selector) {
- input_selector->hide_all ();
- }
-
- route_color_changed ();
-
- } else {
-
- show_passthru_color ();
- }
+ route_color_changed ();
}
void
p->automation_state_changed.connect (panstate_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context());
p->automation_style_changed.connect (panstyle_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_style_changed, &panners), gui_context());
- panners.panshell_changed ();
+ /* This call reduncant, PannerUI::set_panner() connects to _panshell->Changed itself
+ * However, that only works a panner was previously set.
+ *
+ * PannerUI must remain subscribed to _panshell->Changed() in case
+ * we switch the panner eg. AUX-Send and back
+ * _route->panner_shell()->Changed() vs _panshell->Changed
+ */
+ if (panners._panner == 0) {
+ panners.panshell_changed ();
+ }
+ update_panner_choices();
}
+void
+MixerStrip::update_panner_choices ()
+{
+ ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices)
+ if (!_route->panner_shell()) { return; }
+
+ uint32_t in = _route->output()->n_ports().n_audio();
+ uint32_t out = in;
+ if (_route->panner()) {
+ in = _route->panner()->in().n_audio();
+ }
+
+ panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
+}
/*
* Output port labelling
Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&MixerStrip::update_diskstream_display, this));
}
+void
+MixerStrip::io_changed_proxy ()
+{
+ Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_panner_choices));
+}
+
void
MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::weak_ptr<Port> wb)
{
{
name_button.modify_bg (STATE_NORMAL, color());
top_event_box.modify_bg (STATE_NORMAL, color());
+ number_label.set_fixed_colors (gdk_color_to_rgba (color()), gdk_color_to_rgba (color()));
reset_strip_style ();
}
items.push_back (CheckMenuElem (_("Active")));
Gtk::CheckMenuItem* i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
i->set_active (_route->active());
+ i->set_sensitive(! _session->transport_rolling());
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), !_route->active(), false));
items.push_back (SeparatorElem());
{
switch (_width) {
case Wide:
+ if (_session->config.get_track_name_number()) {
+ const int64_t track_number = _route->track_number ();
+ if (track_number == 0) {
+ number_label.set_text ("-");
+ number_label.hide();
+ } else {
+ number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec));
+ number_label.show();
+ }
+ } else {
+ number_label.hide();
+ }
name_button.set_text (_route->name());
break;
case Narrow:
- name_button.set_text (PBD::short_version (_route->name(), 5));
+ number_label.hide();
+ if (_session->config.get_track_name_number()) {
+ name_button.set_markup(track_number_to_string (_route->track_number (), " ",
+ PBD::short_version (_route->name (), 5)));
+ } else {
+ name_button.set_text (PBD::short_version (_route->name(), 5));
+ }
break;
}
set_current_delivery (send);
+ send->meter()->set_type(_route->shared_peak_meter()->get_type());
send->set_metering (true);
_current_delivery->DropReferences.connect (send_gone_connection, invalidator (*this), boost::bind (&MixerStrip::revert_to_default_display, this), gui_context());
gain_meter().set_controls (_route, send->meter(), send->amp());
gain_meter().setup_meters ();
+ uint32_t const in = _current_delivery->pans_required();
+ uint32_t const out = _current_delivery->pan_outs();
+
panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner());
+ panner_ui().set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
panner_ui().setup_pan ();
-
- /* make sure the send has audio output */
-
- if (_current_delivery->output() && _current_delivery->output()->n_ports().n_audio() > 0) {
- panners.show_all ();
- } else {
- panners.hide_all ();
- }
+ panner_ui().set_send_drawing_mode (true);
+ panner_ui().show_all ();
input_button.set_sensitive (false);
group_button.set_sensitive (false);
gain_meter().setup_meters ();
panner_ui().set_panner (_route->main_outs()->panner_shell(), _route->main_outs()->panner());
+ update_panner_choices();
panner_ui().setup_pan ();
+ panner_ui().set_send_drawing_mode (false);
if (has_audio_outputs ()) {
panners.show_all ();
*/
_visibility.set_state (Config->get_mixer_strip_visibility ());
}
+ else if (p == "track-name-number") {
+ name_changed ();
+ }
}
/** Called to decide whether the solo isolate / solo lock button visibility should
bool
MixerStrip::level_meter_button_press (GdkEventButton* ev)
{
+ if (_current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery)) {
+ return false;
+ }
if (ev->button == 3) {
popup_level_meter_menu (ev);
return true;
_suspend_menu_callbacks = true;
add_level_meter_item_point (items, group, _("Input"), MeterInput);
- add_level_meter_item_point (items, group, _("Pre-fader"), MeterPreFader);
- add_level_meter_item_point (items, group, _("Post-fader"), MeterPostFader);
+ add_level_meter_item_point (items, group, _("Pre Fader"), MeterPreFader);
+ add_level_meter_item_point (items, group, _("Post Fader"), MeterPostFader);
add_level_meter_item_point (items, group, _("Output"), MeterOutput);
add_level_meter_item_point (items, group, _("Custom"), MeterCustom);
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20);
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK12), MeterK12);
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU);
int _strip_type;