don't bother doing port stuff if session is being deleted
[ardour.git] / gtk2_ardour / mixer_strip.cc
index 3c32439c0367bba0f1482d10cf156f26e686efcd..73326c8d30247c3cceec1c7c5e25e45a961f9d8d 100644 (file)
@@ -37,6 +37,7 @@
 #include "ardour/amp.h"
 #include "ardour/session.h"
 #include "ardour/audioengine.h"
+#include "ardour/internal_send.h"
 #include "ardour/route.h"
 #include "ardour/route_group.h"
 #include "ardour/audio_track.h"
@@ -690,7 +691,21 @@ void
 MixerStrip::edit_output_configuration ()
 {
        if (output_selector == 0) {
-               output_selector = new IOSelectorWindow (_session, _route->output());
+               
+               boost::shared_ptr<Send> send;
+               boost::shared_ptr<IO> output;
+
+               if ((send = boost::dynamic_pointer_cast<Send>(_current_delivery)) != 0) {
+                       if (!boost::dynamic_pointer_cast<InternalSend>(send)) {
+                               output = send->output();
+                       } else {
+                               output = _route->output ();
+                       } 
+               } else {
+                       output = _route->output ();
+               }
+               
+               output_selector = new IOSelectorWindow (_session, output);
        }
 
        if (output_selector->is_visible()) {
@@ -1533,36 +1548,48 @@ void
 MixerStrip::route_active_changed ()
 {
        RouteUI::route_active_changed ();
+       reset_strip_style ();
+}
+
+void
+MixerStrip::reset_strip_style ()
+{
+       if (_current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery)) {
+
+               gpm.set_fader_name ("SendStripBase");
 
-       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 ("AudioTrackMetrics");
-               } else {
-                       set_name ("AudioTrackStripBaseInactive");
-                       gpm.set_meter_strip_name ("AudioTrackMetricsInactive");
-               }
-               gpm.set_fader_name ("AudioTrackFader");
        } else {
-               if (_route->active()) {
-                       set_name ("AudioBusStripBase");
-                       gpm.set_meter_strip_name ("AudioBusMetrics");
+               
+               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 ("AudioTrackMetrics");
+                       } else {
+                               set_name ("AudioTrackStripBaseInactive");
+                               gpm.set_meter_strip_name ("AudioTrackMetricsInactive");
+                       }
+                       gpm.set_fader_name ("AudioTrackFader");
                } else {
-                       set_name ("AudioBusStripBaseInactive");
-                       gpm.set_meter_strip_name ("AudioBusMetricsInactive");
+                       if (_route->active()) {
+                               set_name ("AudioBusStripBase");
+                               gpm.set_meter_strip_name ("AudioBusMetrics");
+                       } else {
+                               set_name ("AudioBusStripBaseInactive");
+                               gpm.set_meter_strip_name ("AudioBusMetricsInactive");
+                       }
+                       gpm.set_fader_name ("AudioBusFader");
+                       
+                       /* (no MIDI busses yet) */
                }
-               gpm.set_fader_name ("AudioBusFader");
-
-               /* (no MIDI busses yet) */
        }
 }
 
@@ -1582,6 +1609,7 @@ MixerStrip::engine_running ()
 {
 }
 
+/** Called when the metering point has changed */
 void
 MixerStrip::meter_changed (void *src)
 {
@@ -1608,12 +1636,17 @@ MixerStrip::meter_changed (void *src)
        gpm.setup_meters ();
        // reset peak when meter point changes
        gpm.reset_peak_display();
-       set_width_enum (_width, this);
 }
 
 void
 MixerStrip::switch_io (boost::shared_ptr<Route> target)
 {
+       /* don't respond to switch IO signal outside of the mixer window */
+
+       if (!_mixer_owned) {
+               return;
+       }
+
        if (_route == target || _route->is_master()) {
                /* don't change the display for the target or the master bus */
                return;
@@ -1651,16 +1684,19 @@ MixerStrip::drop_send ()
        }
 
        send_gone_connection.disconnect ();
-       
+       input_button.set_sensitive (true);
+       output_button.set_sensitive (true);
 }
 
 void
 MixerStrip::show_send (boost::shared_ptr<Send> send)
 {
        assert (send != 0);
+
        drop_send ();
 
        _current_delivery = send;
+
        send->set_metering (true);
        send_gone_connection = _current_delivery->GoingAway.connect (mem_fun (*this, &MixerStrip::revert_to_default_display));
 
@@ -1669,6 +1705,14 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
 
        panner_ui().set_panner (_current_delivery->panner());
        panner_ui().setup_pan ();
+
+       input_button.set_sensitive (false);
+
+       if (boost::dynamic_pointer_cast<InternalSend>(send)) {
+               output_button.set_sensitive (false);
+       }
+
+       reset_strip_style ();
 }
 
 void
@@ -1684,8 +1728,11 @@ MixerStrip::revert_to_default_display ()
 
        gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp());
        gain_meter().setup_meters ();
+
        panner_ui().set_panner (_route->main_outs()->panner());
        panner_ui().setup_pan ();
+
+       reset_strip_style ();
 }
 
 void