/*
- Copyright (C) 2000-2002 Paul Davis
+ Copyright (C) 2000-2006 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
*/
#include <cmath>
#include <sigc++/bind.h>
#include <pbd/convert.h>
+#include <pbd/enumwriter.h>
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
#include <ardour/send.h>
#include <ardour/insert.h>
#include <ardour/ladspa_plugin.h>
-#include <ardour/connection.h>
-#include <ardour/session_connection.h>
+#include <ardour/bundle.h>
+#include <ardour/session_bundle.h>
#include "ardour_ui.h"
#include "ardour_dialog.h"
ignore_speed_adjustment = false;
comment_window = 0;
comment_area = 0;
+ _width_owner = 0;
width_button.add (*(manage (new Gtk::Image (::get_icon("strip_width")))));
hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
bottom_button_table.set_col_spacings (0);
bottom_button_table.set_homogeneous (true);
bottom_button_table.attach (group_button, 0, 1, 0, 1);
-
+
if (is_audio_track()) {
rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press), false);
MixerStrip::set_stuff_from_route ()
{
XMLProperty *prop;
-
+
ensure_xml_node ();
+ /* if width is not set, it will be set by the MixerUI or editor */
+
if ((prop = xml_node->property ("strip_width")) != 0) {
- if (prop->value() == "wide") {
- set_width (Wide);
- } else if (prop->value() == "narrow") {
- set_width (Narrow);
- }
- else {
- error << string_compose(_("unknown strip width \"%1\" in XML GUI information"), prop->value()) << endmsg;
- set_width (Wide);
- }
- }
- else {
- set_width (Wide);
+ set_width (Width (string_2_enum (prop->value(), _width)), this);
}
if ((prop = xml_node->property ("shown_mixer")) != 0) {
}
void
-MixerStrip::set_width (Width w)
+MixerStrip::set_width (Width w, void* owner)
{
/* always set the gpm width again, things may be hidden */
+
gpm.set_width (w);
panners.set_width (w);
pre_redirect_box.set_width (w);
post_redirect_box.set_width (w);
-
+
+ _width_owner = owner;
+
if (_width == w) {
return;
}
ensure_xml_node ();
_width = w;
-
+
+ if (_width_owner == this) {
+ xml_node->add_property ("strip_width", enum_2_string (_width));
+ }
+
switch (w) {
case Wide:
set_size_request (-1, -1);
- xml_node->add_property ("strip_width", "wide");
if (rec_enable_button) {
((Gtk::Label*)rec_enable_button->get_child())->set_text (_("record"));
break;
case Narrow:
- xml_node->add_property ("strip_width", "narrow");
-
if (rec_enable_button) {
((Gtk::Label*)rec_enable_button->get_child())->set_text (_("Rec"));
}
citems.push_back (MenuElem (_("Disconnect"), mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_output)));
citems.push_back (SeparatorElem());
- _session.foreach_connection (this, &MixerStrip::add_connection_to_output_menu);
+ _session.foreach_bundle (this, &MixerStrip::add_bundle_to_output_menu);
output_menu.popup (1, ev->time);
break;
msg.run ();
return true;
}
-
+
switch (ev->button) {
case 1:
citems.push_back (MenuElem (_("Disconnect"), mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_input)));
citems.push_back (SeparatorElem());
- _session.foreach_connection (this, &MixerStrip::add_connection_to_input_menu);
+ _session.foreach_bundle (this, &MixerStrip::add_bundle_to_input_menu);
input_menu.popup (1, ev->time);
break;
}
void
-MixerStrip::connection_input_chosen (ARDOUR::Connection *c)
+MixerStrip::bundle_input_chosen (ARDOUR::Bundle *c)
{
if (!ignore_toggle) {
try {
- _route->use_input_connection (*c, this);
+ _route->use_input_bundle (*c, this);
}
catch (AudioEngine::PortRegistrationFailure& err) {
- error << _("could not register new ports required for that connection")
+ error << _("could not register new ports required for that bundle")
<< endmsg;
}
}
}
void
-MixerStrip::connection_output_chosen (ARDOUR::Connection *c)
+MixerStrip::bundle_output_chosen (ARDOUR::Bundle *c)
{
if (!ignore_toggle) {
try {
- _route->use_output_connection (*c, this);
+ _route->use_output_bundle (*c, this);
}
catch (AudioEngine::PortRegistrationFailure& err) {
- error << _("could not register new ports required for that connection")
+ error << _("could not register new ports required for that bundle")
<< endmsg;
}
}
}
void
-MixerStrip::add_connection_to_input_menu (ARDOUR::Connection* c)
+MixerStrip::add_bundle_to_input_menu (ARDOUR::Bundle* c)
{
using namespace Menu_Helpers;
- if (dynamic_cast<InputConnection *> (c) == 0) {
+ if (dynamic_cast<InputBundle *> (c) == 0) {
return;
}
MenuList& citems = input_menu.items();
- if (c->nports() == _route->n_inputs()) {
+ if (c->nchannels() == _route->n_inputs().n_total()) {
- citems.push_back (CheckMenuElem (c->name(), bind (mem_fun(*this, &MixerStrip::connection_input_chosen), c)));
+ citems.push_back (CheckMenuElem (c->name(), bind (mem_fun(*this, &MixerStrip::bundle_input_chosen), c)));
- ARDOUR::Connection *current = _route->input_connection();
+ ARDOUR::Bundle *current = _route->input_bundle();
if (current == c) {
ignore_toggle = true;
}
void
-MixerStrip::add_connection_to_output_menu (ARDOUR::Connection* c)
+MixerStrip::add_bundle_to_output_menu (ARDOUR::Bundle* c)
{
using namespace Menu_Helpers;
- if (dynamic_cast<OutputConnection *> (c) == 0) {
+ if (dynamic_cast<OutputBundle *> (c) == 0) {
return;
}
- if (c->nports() == _route->n_outputs()) {
+ if (c->nchannels() == _route->n_outputs().n_total()) {
MenuList& citems = output_menu.items();
- citems.push_back (CheckMenuElem (c->name(), bind (mem_fun(*this, &MixerStrip::connection_output_chosen), c)));
+ citems.push_back (CheckMenuElem (c->name(), bind (mem_fun(*this, &MixerStrip::bundle_output_chosen), c)));
- ARDOUR::Connection *current = _route->output_connection();
+ ARDOUR::Bundle *current = _route->output_bundle();
if (current == c) {
ignore_toggle = true;
MixerStrip::connect_to_pan ()
{
ENSURE_GUI_THREAD(mem_fun(*this, &MixerStrip::connect_to_pan));
-
+
panstate_connection.disconnect ();
panstyle_connection.disconnect ();
void
MixerStrip::update_input_display ()
{
- ARDOUR::Connection *c;
+ ARDOUR::Bundle *c;
- if ((c = _route->input_connection()) != 0) {
+ if ((c = _route->input_bundle()) != 0) {
input_label.set_text (c->name());
} else {
switch (_width) {
void
MixerStrip::update_output_display ()
{
- ARDOUR::Connection *c;
+ ARDOUR::Bundle *c;
- if ((c = _route->output_connection()) != 0) {
+ if ((c = _route->output_bundle()) != 0) {
output_label.set_text (c->name());
} else {
switch (_width) {
void
-MixerStrip::comment_editor_done_editing() {
+MixerStrip::comment_editor_done_editing()
+{
string str = comment_area->get_buffer()->get_text();
if (_route->comment() != str) {
_route->set_comment (str, this);
MixerStrip::build_route_ops_menu ()
{
using namespace Menu_Helpers;
-
route_ops_menu = manage (new Menu);
route_ops_menu->set_name ("ArdourContextMenu");
MenuList& items = route_ops_menu->items();
-
+
items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteUI::route_rename)));
items.push_back (SeparatorElem());
items.push_back (CheckMenuElem (_("Active"), mem_fun (*this, &RouteUI::toggle_route_active)));
items.push_back (CheckMenuElem (_("Invert Polarity"), mem_fun (*this, &RouteUI::toggle_polarity)));
polarity_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
polarity_menu_item->set_active (_route->phase_invert());
+ items.push_back (CheckMenuElem (_("Protect against denormals"), mem_fun (*this, &RouteUI::toggle_denormal_protection)));
+ denormal_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
+ denormal_menu_item->set_active (_route->denormal_protection());
build_remote_control_menu ();
{
if (ev->button == 1) {
list_route_operations ();
+
+ Menu_Helpers::MenuList& items = route_ops_menu->items();
+ /* do not allow rename if the track is record-enabled */
+ static_cast<MenuItem*> (&items.front())->set_sensitive (!_route->record_enabled());
+
route_ops_menu->popup (1, ev->time);
}
return FALSE;
{
switch (_width) {
case Wide:
- set_width (Narrow);
+ set_width (Narrow, this);
break;
case Narrow:
- set_width (Wide);
+ set_width (Wide, this);
break;
}
}
{
RouteUI::route_active_changed ();
- if (is_audio_track()) {
+ if (is_midi_track()) {
+ if (_route->active()) {
+ set_name ("MidiTrackStripBase");
+ gpm.set_meter_strip_name ("MidiTrackStripBase");
+ } else {
+ set_name ("MidiTrackStripBaseInactive");
+ gpm.set_meter_strip_name ("MidiTrackStripBaseInactive");
+ }
+ gpm.set_fader_name ("MidiTrackFader");
+ } else if (is_audio_track()) {
if (_route->active()) {
set_name ("AudioTrackStripBase");
gpm.set_meter_strip_name ("AudioTrackStripBase");
gpm.set_meter_strip_name ("AudioTrackStripBaseInactive");
}
gpm.set_fader_name ("AudioTrackFader");
- } else { // FIXME: assumed audio bus
+ } else {
if (_route->active()) {
set_name ("AudioBusStripBase");
gpm.set_meter_strip_name ("AudioBusStripBase");
gpm.set_meter_strip_name ("AudioBusStripBaseInactive");
}
gpm.set_fader_name ("AudioBusFader");
+
+ /* (no MIDI busses yet) */
}
}
ENSURE_GUI_THREAD (bind (mem_fun(*this, &MixerStrip::meter_changed), src));
- switch (_route->meter_point()) {
+ switch (_route->meter_point()) {
case MeterInput:
meter_point_label.set_text (_("input"));
break;
-
+
case MeterPreFader:
meter_point_label.set_text (_("pre"));
break;
-
+
case MeterPostFader:
meter_point_label.set_text (_("post"));
break;
- }
+ }
- gpm.setup_meters ();
+ gpm.setup_meters ();
}