show() widgets explicitly in gtk2_ardour/analysis_window.cc
[ardour.git] / gtk2_ardour / ardour_ui.cc
index f233c972f291a95c965eaf28f8593d68842f9b3f..7359b4908170c73b47f1fc07d360e348d8e0d434 100644 (file)
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 */
 
+#define __STDC_FORMAT_MACROS 1
+#include <stdint.h>
+
 #include <algorithm>
 #include <cmath>
 #include <fcntl.h>
 #include <algorithm>
 #include <cmath>
 #include <fcntl.h>
 
 #include <pbd/error.h>
 #include <pbd/compose.h>
 
 #include <pbd/error.h>
 #include <pbd/compose.h>
-#include <pbd/pathscanner.h>
 #include <pbd/failed_constructor.h>
 #include <pbd/enumwriter.h>
 #include <pbd/failed_constructor.h>
 #include <pbd/enumwriter.h>
-#include <pbd/stacktrace.h>
+#include <pbd/memento_command.h>
+#include <pbd/file_utils.h>
+
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/popup.h>
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/popup.h>
+#include <gtkmm2ext/window_title.h>
 
 #include <midi++/port.h>
 #include <midi++/mmc.h>
 
 #include <ardour/ardour.h>
 
 #include <midi++/port.h>
 #include <midi++/mmc.h>
 
 #include <ardour/ardour.h>
+#include <ardour/profile.h>
+#include <ardour/session_directory.h>
 #include <ardour/session_route.h>
 #include <ardour/session_route.h>
+#include <ardour/session_utils.h>
 #include <ardour/port.h>
 #include <ardour/audioengine.h>
 #include <ardour/playlist.h>
 #include <ardour/port.h>
 #include <ardour/audioengine.h>
 #include <ardour/playlist.h>
@@ -60,6 +67,8 @@
 #include <ardour/recent_sessions.h>
 #include <ardour/port.h>
 #include <ardour/audio_track.h>
 #include <ardour/recent_sessions.h>
 #include <ardour/port.h>
 #include <ardour/audio_track.h>
+#include <ardour/midi_track.h>
+#include <ardour/filesystem_paths.h>
 
 #include "actions.h"
 #include "ardour_ui.h"
 
 #include "actions.h"
 #include "ardour_ui.h"
@@ -74,7 +83,8 @@
 #include "about.h"
 #include "utils.h"
 #include "gui_thread.h"
 #include "about.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "color_manager.h"
+#include "theme_manager.h"
+
 
 #include "i18n.h"
 
 
 #include "i18n.h"
 
@@ -85,16 +95,16 @@ using namespace Gtk;
 using namespace sigc;
 
 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
 using namespace sigc;
 
 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
+UIConfiguration *ARDOUR_UI::ui_config = 0;
 
 sigc::signal<void,bool> ARDOUR_UI::Blink;
 sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
 
 sigc::signal<void,bool> ARDOUR_UI::Blink;
 sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
-sigc::signal<void>      ARDOUR_UI::MidRapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
-sigc::signal<void,nframes_t> ARDOUR_UI::Clock;
+sigc::signal<void,nframes_t, bool, nframes_t> ARDOUR_UI::Clock;
 
 
-ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
+ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
 
-       : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
+       : Gtkmm2ext::UI (X_("Ardour"), argcp, argvp),
          
          primary_clock (X_("primary"), false, X_("TransportClockDisplay"), true, false, true),
          secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true),
          
          primary_clock (X_("primary"), false, X_("TransportClockDisplay"), true, false, true),
          secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true),
@@ -158,14 +168,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
                theArdourUI = this;
        }
 
                theArdourUI = this;
        }
 
-       /* load colors */
-
-       color_manager = new ColorManager();
-
-       std::string color_file = ARDOUR::find_config_file("ardour.colors");
-
-       color_manager->load (color_file);
-
+       ui_config = new UIConfiguration();
+       theme_manager = new ThemeManager();
+       
        editor = 0;
        mixer = 0;
        session = 0;
        editor = 0;
        mixer = 0;
        session = 0;
@@ -180,15 +185,19 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        location_ui = 0;
        open_session_selector = 0;
        have_configure_timeout = false;
        location_ui = 0;
        open_session_selector = 0;
        have_configure_timeout = false;
-       have_disk_overrun_displayed = false;
-       have_disk_underrun_displayed = false;
-       _will_create_new_session_automatically = false;
+       have_disk_speed_dialog_displayed = false;
        session_loaded = false;
        last_speed_displayed = -1.0f;
        session_loaded = false;
        last_speed_displayed = -1.0f;
-       keybindings_path = ARDOUR::find_config_file ("ardour.bindings");
+       ab_direction = true;
+
+       sys::path key_bindings_file;
+
+       find_file_in_search_path (ardour_search_path() + system_config_search_path(),
+                       "ardour.bindings", key_bindings_file);
+
+       keybindings_path = key_bindings_file.to_string();
 
        can_save_keybindings = false;
 
        can_save_keybindings = false;
-       Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
 
        last_configure_time.tv_sec = 0;
        last_configure_time.tv_usec = 0;
 
        last_configure_time.tv_sec = 0;
        last_configure_time.tv_usec = 0;
@@ -223,7 +232,7 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
        engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
 
        engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
        engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
 
-               ActionManager::init ();
+       ActionManager::init ();
        new_session_dialog = new NewSessionDialog();
 
        _tooltips.enable();
        new_session_dialog = new NewSessionDialog();
 
        _tooltips.enable();
@@ -265,10 +274,6 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        AudioFileSource::set_build_peakfiles (true);
        AudioFileSource::set_build_missing_peakfiles (true);
 
        AudioFileSource::set_build_peakfiles (true);
        AudioFileSource::set_build_missing_peakfiles (true);
 
-       if (AudioSource::start_peak_thread ()) {
-               throw failed_constructor();
-       }
-
        /* set default clock modes */
 
        primary_clock.set_mode (AudioClock::SMPTE);
        /* set default clock modes */
 
        primary_clock.set_mode (AudioClock::SMPTE);
@@ -306,8 +311,6 @@ ARDOUR_UI::~ARDOUR_UI ()
        if (add_route_dialog) {
                delete add_route_dialog;
        }
        if (add_route_dialog) {
                delete add_route_dialog;
        }
-
-       AudioSource::stop_peak_thread ();
 }
 
 gint
 }
 
 gint
@@ -426,40 +429,118 @@ ARDOUR_UI::save_ardour_state ()
        XMLNode mnode(mixer->get_state());
 
        if (session) {
        XMLNode mnode(mixer->get_state());
 
        if (session) {
-               session->add_instant_xml (enode, session->path());
-               session->add_instant_xml (mnode, session->path());
+               session->add_instant_xml (enode);
+               session->add_instant_xml (mnode);
        } else {
        } else {
-               Config->add_instant_xml (enode, get_user_ardour_path());
-               Config->add_instant_xml (mnode, get_user_ardour_path());
+               Config->add_instant_xml (enode);
+               Config->add_instant_xml (mnode);
        }
 
        save_keybindings ();
 }
 
        }
 
        save_keybindings ();
 }
 
+gint
+ARDOUR_UI::autosave_session ()
+{
+       if (!Config->get_periodic_safety_backups())
+               return 1;
+
+       if (session) {
+               session->maybe_write_autosave();
+       }
+
+       return 1;
+}
+
+void
+ARDOUR_UI::update_autosave ()
+{
+       ENSURE_GUI_THREAD (mem_fun (*this, &ARDOUR_UI::update_autosave));
+
+       if (session->dirty()) {
+               if (_autosave_connection.connected()) {
+                       _autosave_connection.disconnect();
+               }
+
+               _autosave_connection = Glib::signal_timeout().connect (mem_fun (*this, &ARDOUR_UI::autosave_session),
+                               Config->get_periodic_safety_backup_interval() * 1000);
+
+       } else {
+               if (_autosave_connection.connected()) {
+                       _autosave_connection.disconnect();
+               }               
+       }
+}
+
 void
 ARDOUR_UI::startup ()
 {
 void
 ARDOUR_UI::startup ()
 {
-       if (engine->is_realtime()) {
+       check_memory_locking();
+}
+
+void
+ARDOUR_UI::no_memory_warning ()
+{
+       XMLNode node (X_("no-memory-warning"));
+       Config->add_instant_xml (node);
+}
+
+void
+ARDOUR_UI::check_memory_locking ()
+{
+#ifdef __APPLE__
+       /* OS X doesn't support mlockall(2), and so testing for memory locking capability there is pointless */
+       return;
+#else // !__APPLE__
+
+       XMLNode* memory_warning_node = Config->instant_xml (X_("no-memory-warning"));
+
+       if (engine->is_realtime() && memory_warning_node == 0) {
 
                struct rlimit limits;
 
                struct rlimit limits;
-               
+               int64_t ram;
+               long pages, page_size;
+
+               if ((page_size = sysconf (_SC_PAGESIZE)) < 0 ||(pages = sysconf (_SC_PHYS_PAGES)) < 0) {
+                       ram = 0;
+               } else {
+                       ram = (int64_t) pages * (int64_t) page_size;
+               }
+
                if (getrlimit (RLIMIT_MEMLOCK, &limits)) {
                        return;
                }
                
                if (limits.rlim_cur != RLIM_INFINITY) {
                if (getrlimit (RLIMIT_MEMLOCK, &limits)) {
                        return;
                }
                
                if (limits.rlim_cur != RLIM_INFINITY) {
-                       MessageDialog msg (_("WARNING: Your system has a limit for maximum amount of locked memory. "
-                                            "This might cause Ardour to run out of memory before your system "
-                                            "runs out of memory. \n\n"
-                                            "You can view the memory limit with 'ulimit -l', "
-                                            "and it is normally controlled by /etc/security/limits.conf"));
+
+                       if (ram == 0 || ((double) limits.rlim_cur / ram) < 0.75) {
                        
                        
-                       editor->ensure_float (msg);
-                       msg.run ();
+
+                               MessageDialog msg (_("WARNING: Your system has a limit for maximum amount of locked memory. "
+                                                    "This might cause Ardour to run out of memory before your system "
+                                                    "runs out of memory. \n\n"
+                                                    "You can view the memory limit with 'ulimit -l', "
+                                                    "and it is normally controlled by /etc/security/limits.conf"));
+                               
+                               VBox* vbox = msg.get_vbox();
+                               HBox hbox;
+                               CheckButton cb (_("Do not show this window again"));
+                               
+                               cb.signal_toggled().connect (mem_fun (*this, &ARDOUR_UI::no_memory_warning));
+                               
+                               hbox.pack_start (cb, true, false);
+                               vbox->pack_start (hbox);
+                               hbox.show_all ();
+                               
+                               editor->ensure_float (msg);
+                               msg.run ();
+                       }
                }
        }
                }
        }
+#endif // !__APPLE__
 }
 
 }
 
+
 void
 ARDOUR_UI::finish()
 {
 void
 ARDOUR_UI::finish()
 {
@@ -491,6 +572,7 @@ If you still wish to quit, please use the\n\n\
        }
        engine->stop (true);
        Config->save_state();
        }
        engine->stop (true);
        Config->save_state();
+       ARDOUR_UI::config()->save_state();
        quit ();
 }
 
        quit ();
 }
 
@@ -582,13 +664,6 @@ ARDOUR_UI::every_point_one_seconds ()
        return TRUE;
 }
 
        return TRUE;
 }
 
-gint
-ARDOUR_UI::every_point_oh_five_seconds ()
-{
-       MidRapidScreenUpdate(); /* EMIT_SIGNAL */
-       return true;
-}
-
 gint
 ARDOUR_UI::every_point_zero_one_seconds ()
 {
 gint
 ARDOUR_UI::every_point_zero_one_seconds ()
 {
@@ -612,11 +687,11 @@ ARDOUR_UI::update_sample_rate (nframes_t ignored)
                nframes_t rate = engine->frame_rate();
                
                if (fmod (rate, 1000.0) != 0.0) {
                nframes_t rate = engine->frame_rate();
                
                if (fmod (rate, 1000.0) != 0.0) {
-                       snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"), 
+                       snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f ms"), 
                                  (float) rate/1000.0f,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                } else {
                                  (float) rate/1000.0f,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                } else {
-                       snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"), 
+                       snprintf (buf, sizeof (buf), _("%u kHz / %4.1f ms"), 
                                  rate/1000,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                }
                                  rate/1000,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                }
@@ -629,7 +704,7 @@ void
 ARDOUR_UI::update_cpu_load ()
 {
        char buf[32];
 ARDOUR_UI::update_cpu_load ()
 {
        char buf[32];
-       snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
+       snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), engine->get_cpu_load());
        cpu_load_label.set_text (buf);
 }
 
        cpu_load_label.set_text (buf);
 }
 
@@ -652,7 +727,7 @@ ARDOUR_UI::count_recenabled_streams (Route& route)
 {
        Track* track = dynamic_cast<Track*>(&route);
        if (track && track->diskstream()->record_enabled()) {
 {
        Track* track = dynamic_cast<Track*>(&route);
        if (track && track->diskstream()->record_enabled()) {
-               rec_enabled_streams += track->n_inputs();
+               rec_enabled_streams += track->n_inputs().n_total();
        }
 }
 
        }
 }
 
@@ -708,40 +783,6 @@ ARDOUR_UI::update_wall_clock ()
 
        return TRUE;
 }
 
        return TRUE;
 }
-void
-ARDOUR_UI::control_methods_adjusted ()
-
-{
-       int which_method;
-
-       which_method = (int) online_control_button->adjustment.get_value();
-       switch (which_method) {
-       case 0:
-               allow_mmc_and_local ();
-               break;
-       case 1:
-               allow_mmc_only ();
-               break;
-       case 2:
-               allow_local_only ();
-               break;
-       default:
-               fatal << _("programming error: impossible control method") << endmsg;
-       }
-}
-       
-
-void
-ARDOUR_UI::mmc_device_id_adjusted ()
-
-{
-#if 0
-       if (mmc) {
-               int dev_id = (int) mmc_id_button->adjustment.get_value();
-               mmc->set_device_id (dev_id);
-       }
-#endif
-}
 
 gint
 ARDOUR_UI::session_menu (GdkEventButton *ev)
 
 gint
 ARDOUR_UI::session_menu (GdkEventButton *ev)
@@ -918,9 +959,30 @@ ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
        return S_ISREG (statbuf.st_mode);
 }
 
        return S_ISREG (statbuf.st_mode);
 }
 
+bool
+ARDOUR_UI::check_audioengine ()
+{
+       if (engine) {
+               if (!engine->connected()) {
+                       MessageDialog msg (_("Ardour is not connected to JACK\n"
+                                            "You cannot open or close sessions in this condition"));
+                       msg.run ();
+                       return false;
+               }
+               return true;
+       } else {
+               return false;
+       }
+}
+
 void
 ARDOUR_UI::open_session ()
 {
 void
 ARDOUR_UI::open_session ()
 {
+       if (!check_audioengine()) {
+               return;
+               
+       }
+
        /* popup selector window */
 
        if (open_session_selector == 0) {
        /* popup selector window */
 
        if (open_session_selector == 0) {
@@ -955,7 +1017,7 @@ ARDOUR_UI::open_session ()
        bool isnew;
 
        if (session_path.length() > 0) {
        bool isnew;
 
        if (session_path.length() > 0) {
-               if (Session::find_session (session_path, path, name, isnew) == 0) {
+               if (ARDOUR::find_session (session_path, path, name, isnew) == 0) {
                        _session_is_new = isnew;
                        load_session (path, name);
                }
                        _session_is_new = isnew;
                        load_session (path, name);
                }
@@ -964,11 +1026,45 @@ ARDOUR_UI::open_session ()
 
 
 void
 
 
 void
-ARDOUR_UI::session_add_midi_track ()
+ARDOUR_UI::session_add_midi_route (bool disk, uint32_t how_many)
 {
 {
-       cerr << _("Patience is a virtue.\n");
+       list<boost::shared_ptr<MidiTrack> > tracks;
+
+       if (session == 0) {
+               warning << _("You cannot add a track without a session already loaded.") << endmsg;
+               return;
+       }
+
+       try { 
+               if (disk) {
+
+                       tracks = session->new_midi_track (ARDOUR::Normal, how_many);
+
+                       if (tracks.size() != how_many) {
+                               if (how_many == 1) {
+                                       error << _("could not create a new midi track") << endmsg;
+                               } else {
+                                       error << string_compose (_("could not create %1 new midi tracks"), how_many) << endmsg;
+                               }
+                       }
+               } /*else {
+                       if ((route = session->new_midi_route ()) == 0) {
+                               error << _("could not create new midi bus") << endmsg;
+                       }
+               }*/
+       }
+
+       catch (...) {
+               MessageDialog msg (*editor, 
+                                  _("There are insufficient JACK ports available\n\
+to create a new track or bus.\n\
+You should save Ardour, exit and\n\
+restart JACK with more ports."));
+               msg.run ();
+       }
 }
 
 }
 
+
 void
 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
 {
 void
 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
 {
@@ -988,7 +1084,8 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
                                if (how_many == 1) {
                                        error << _("could not create a new audio track") << endmsg;
                                } else {
                                if (how_many == 1) {
                                        error << _("could not create a new audio track") << endmsg;
                                } else {
-                                       error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
+                                       error << string_compose (_("could only create %1 of %2 new audio %3"), 
+                                                                tracks.size(), how_many, (track ? _("tracks") : _("busses"))) << endmsg;
                                }
                        }
 
                                }
                        }
 
@@ -1019,6 +1116,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
        }
 
        catch (...) {
        }
 
        catch (...) {
+               cerr << "About to complain about JACK\n";
                MessageDialog msg (*editor, 
                                   _("There are insufficient JACK ports available\n\
 to create a new track or bus.\n\
                MessageDialog msg (*editor, 
                                   _("There are insufficient JACK ports available\n\
 to create a new track or bus.\n\
@@ -1136,8 +1234,6 @@ ARDOUR_UI::remove_last_capture()
 void
 ARDOUR_UI::transport_record ()
 {
 void
 ARDOUR_UI::transport_record ()
 {
-       cerr << "transport record\n";
-
        if (session) {
                switch (session->record_status()) {
                case Session::Disabled:
        if (session) {
                switch (session->record_status()) {
                case Session::Disabled:
@@ -1150,7 +1246,7 @@ ARDOUR_UI::transport_record ()
                        break;
                case Session::Recording:
                case Session::Enabled:
                        break;
                case Session::Recording:
                case Session::Enabled:
-                       session->disable_record (true);
+                       session->disable_record (false, true);
                }
        }
 }
                }
        }
 }
@@ -1310,24 +1406,6 @@ ARDOUR_UI::map_transport_state ()
        }
 }
 
        }
 }
 
-void
-ARDOUR_UI::allow_local_only ()
-{
-
-}
-
-void
-ARDOUR_UI::allow_mmc_only ()
-{
-
-}
-
-void
-ARDOUR_UI::allow_mmc_and_local ()
-{
-
-}
-
 void
 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
 {
 void
 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
 {
@@ -1431,6 +1509,12 @@ ARDOUR_UI::do_engine_start ()
        return 0;
 }
 
        return 0;
 }
 
+void
+ARDOUR_UI::setup_theme ()
+{
+       theme_manager->setup_theme();
+}
+
 gint
 ARDOUR_UI::start_engine ()
 {
 gint
 ARDOUR_UI::start_engine ()
 {
@@ -1450,7 +1534,7 @@ void
 ARDOUR_UI::update_clocks ()
 {
        if (!editor || !editor->dragging_playhead()) {
 ARDOUR_UI::update_clocks ()
 {
        if (!editor || !editor->dragging_playhead()) {
-               Clock (session->audible_frame()); /* EMIT_SIGNAL */
+               Clock (session->audible_frame(), false, editor->edit_cursor_position(false)); /* EMIT_SIGNAL */
        }
 }
 
        }
 }
 
@@ -1489,7 +1573,7 @@ ARDOUR_UI::_blink (void *arg)
 void
 ARDOUR_UI::blink ()
 {
 void
 ARDOUR_UI::blink ()
 {
-       // Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
+       Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
 }
 
 void
 }
 
 void
@@ -1521,7 +1605,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine,
                          bool in)
 {
        if (in) {
                          bool in)
 {
        if (in) {
-               if (io.n_inputs() == 0) {
+               if (io.n_inputs().n_total() == 0) {
                        buf = _("none");
                        return;
                }
                        buf = _("none");
                        return;
                }
@@ -1540,7 +1624,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine,
 
        } else {
 
 
        } else {
 
-               if (io.n_outputs() == 0) {
+               if (io.n_outputs().n_total() == 0) {
                        buf = _("none");
                        return;
                }
                        buf = _("none");
                        return;
                }
@@ -1559,6 +1643,8 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine,
        }
 }
 
        }
 }
 
+/** Ask the user for the name of a new shapshot and then take it.
+ */
 void
 ARDOUR_UI::snapshot_session ()
 {
 void
 ARDOUR_UI::snapshot_session ()
 {
@@ -1682,14 +1768,14 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
        switch (session->record_status()) {
        case Session::Enabled:
                if (onoff) {
        switch (session->record_status()) {
        case Session::Enabled:
                if (onoff) {
-                       rec_button.set_visual_state (1);
+                       rec_button.set_visual_state (2);
                } else {
                        rec_button.set_visual_state (0);
                }
                break;
 
        case Session::Recording:
                } else {
                        rec_button.set_visual_state (0);
                }
                break;
 
        case Session::Recording:
-               rec_button.set_visual_state (2);
+               rec_button.set_visual_state (1);
                break;
 
        default:
                break;
 
        default:
@@ -1732,22 +1818,32 @@ ARDOUR_UI::save_template ()
        }
 }
 
        }
 }
 
-void
+bool
 ARDOUR_UI::new_session (std::string predetermined_path)
 {
        string session_name;
        string session_path;
 
 ARDOUR_UI::new_session (std::string predetermined_path)
 {
        string session_name;
        string session_path;
 
+       if (!check_audioengine()) {
+               return false;
+       }
+
        int response = Gtk::RESPONSE_NONE;
 
        new_session_dialog->set_modal(true);
        new_session_dialog->set_name (predetermined_path);
        new_session_dialog->reset_recent();
        new_session_dialog->show();
        int response = Gtk::RESPONSE_NONE;
 
        new_session_dialog->set_modal(true);
        new_session_dialog->set_name (predetermined_path);
        new_session_dialog->reset_recent();
        new_session_dialog->show();
+       new_session_dialog->set_current_page (0);
 
        do {
 
        do {
-               response = new_session_dialog->run ();
-               
+               response = new_session_dialog->run ();
+
+               if (!check_audioengine()) {
+                       new_session_dialog->hide ();
+                       return false;
+               }
+
                _session_is_new = false;
 
                if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
                _session_is_new = false;
 
                if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
@@ -1756,59 +1852,59 @@ ARDOUR_UI::new_session (std::string predetermined_path)
                                quit();
                        }
                        new_session_dialog->hide ();
                                quit();
                        }
                        new_session_dialog->hide ();
-                       return;
+                       return false;
 
                } else if (response == Gtk::RESPONSE_NONE) {
 
 
                } else if (response == Gtk::RESPONSE_NONE) {
 
-                       /* Clear was pressed */
-                       new_session_dialog->reset();
+                       /* Clear was pressed */
+                       new_session_dialog->reset();
 
                } else if (response == Gtk::RESPONSE_YES) {
 
 
                } else if (response == Gtk::RESPONSE_YES) {
 
-                       /* YES  == OPEN, but there's no enum for that */
+                       /* YES  == OPEN, but there's no enum for that */
+
+                       session_name = new_session_dialog->session_name();
 
 
-                       session_name = new_session_dialog->session_name();
-                       
                        if (session_name.empty()) {
                                response = Gtk::RESPONSE_NONE;
                                continue;
                        } 
 
                        if (session_name[0] == '/' || 
                        if (session_name.empty()) {
                                response = Gtk::RESPONSE_NONE;
                                continue;
                        } 
 
                        if (session_name[0] == '/' || 
-                           (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
-                           (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
+                                       (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
+                                       (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
                                load_session (Glib::path_get_dirname (session_name), session_name);
                        } else {
                                session_path = new_session_dialog->session_folder();
                                load_session (session_path, session_name);
                        }
                                load_session (Glib::path_get_dirname (session_name), session_name);
                        } else {
                                session_path = new_session_dialog->session_folder();
                                load_session (session_path, session_name);
                        }
-                       
+
                } else if (response == Gtk::RESPONSE_OK) {
 
                        session_name = new_session_dialog->session_name();
                } else if (response == Gtk::RESPONSE_OK) {
 
                        session_name = new_session_dialog->session_name();
-                       
-                       if (new_session_dialog->get_current_page() == 1) {
-                 
-                               /* XXX this is a bit of a hack.. 
+
+                       if (!new_session_dialog->on_new_session_page ()) {
+
+                               /* XXX this is a bit of a hack.. 
                                   i really want the new sesion dialog to return RESPONSE_YES
                                   if we're on page 1 (the load page)
                                   Unfortunately i can't see how atm.. 
                                */
                                   i really want the new sesion dialog to return RESPONSE_YES
                                   if we're on page 1 (the load page)
                                   Unfortunately i can't see how atm.. 
                                */
-                               
+
                                if (session_name.empty()) {
                                        response = Gtk::RESPONSE_NONE;
                                        continue;
                                } 
                                if (session_name.empty()) {
                                        response = Gtk::RESPONSE_NONE;
                                        continue;
                                } 
-                               
+
                                if (session_name[0] == '/' || 
                                if (session_name[0] == '/' || 
-                                   (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
-                                   (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
+                                               (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
+                                               (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
                                        load_session (Glib::path_get_dirname (session_name), session_name);
                                } else {
                                        session_path = new_session_dialog->session_folder();
                                        load_session (session_path, session_name);
                                }
                                        load_session (Glib::path_get_dirname (session_name), session_name);
                                } else {
                                        session_path = new_session_dialog->session_folder();
                                        load_session (session_path, session_name);
                                }
-                       
+
                        } else {
 
                                if (session_name.empty()) {
                        } else {
 
                                if (session_name.empty()) {
@@ -1817,8 +1913,8 @@ ARDOUR_UI::new_session (std::string predetermined_path)
                                } 
 
                                if (session_name[0] == '/' || 
                                } 
 
                                if (session_name[0] == '/' || 
-                                   (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
-                                   (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
+                                               (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
+                                               (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
 
                                        session_path = Glib::path_get_dirname (session_name);
                                        session_name = Glib::path_get_basename (session_name);
 
                                        session_path = Glib::path_get_dirname (session_name);
                                        session_name = Glib::path_get_basename (session_name);
@@ -1828,74 +1924,74 @@ ARDOUR_UI::new_session (std::string predetermined_path)
                                        session_path = new_session_dialog->session_folder();
 
                                }
                                        session_path = new_session_dialog->session_folder();
 
                                }
-                               
+
                                //XXX This is needed because session constructor wants a 
                                //non-existant path. hopefully this will be fixed at some point.
                                //XXX This is needed because session constructor wants a 
                                //non-existant path. hopefully this will be fixed at some point.
-                               
+
                                session_path = Glib::build_filename (session_path, session_name);
                                session_path = Glib::build_filename (session_path, session_name);
-                                               
+
                                if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
 
                                        Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
 
                                        MessageDialog msg (str,
                                if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
 
                                        Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
 
                                        MessageDialog msg (str,
-                                                          false,
-                                                          Gtk::MESSAGE_WARNING,
-                                                          Gtk::BUTTONS_YES_NO,
-                                                          true);
+                                                       false,
+                                                       Gtk::MESSAGE_WARNING,
+                                                       Gtk::BUTTONS_YES_NO,
+                                                       true);
 
 
                                        msg.set_name (X_("CleanupDialog"));
                                        msg.set_wmclass (X_("existing_session"), "Ardour");
                                        msg.set_position (Gtk::WIN_POS_MOUSE);
 
 
                                        msg.set_name (X_("CleanupDialog"));
                                        msg.set_wmclass (X_("existing_session"), "Ardour");
                                        msg.set_position (Gtk::WIN_POS_MOUSE);
-                                       
+
                                        switch (msg.run()) {
                                        switch (msg.run()) {
-                                       case RESPONSE_YES:
-                                               load_session (session_path, session_name);
-                                               goto done;
-                                               break;
-                                       default:
-                                               response = RESPONSE_NONE;
-                                               new_session_dialog->reset ();
-                                               continue;
+                                               case RESPONSE_YES:
+                                                       load_session (session_path, session_name);
+                                                       goto done;
+                                                       break;
+                                               default:
+                                                       response = RESPONSE_NONE;
+                                                       new_session_dialog->reset ();
+                                                       continue;
                                        }
                                }
 
                                        }
                                }
 
-                               _session_is_new = true;
+                               _session_is_new = true;
 
                                std::string template_name = new_session_dialog->session_template_name();
 
                                std::string template_name = new_session_dialog->session_template_name();
-                                               
+
                                if (new_session_dialog->use_session_template()) {
                                if (new_session_dialog->use_session_template()) {
-                                                       
+
                                        load_session (session_path, session_name, &template_name);
                                        load_session (session_path, session_name, &template_name);
-                         
+
                                } else {
                                } else {
-                                                       
+
                                        uint32_t cchns;
                                        uint32_t mchns;
                                        AutoConnectOption iconnect;
                                        AutoConnectOption oconnect;
                                        uint32_t cchns;
                                        uint32_t mchns;
                                        AutoConnectOption iconnect;
                                        AutoConnectOption oconnect;
-                                                       
+
                                        if (new_session_dialog->create_control_bus()) {
                                                cchns = (uint32_t) new_session_dialog->control_channel_count();
                                        } else {
                                                cchns = 0;
                                        }
                                        if (new_session_dialog->create_control_bus()) {
                                                cchns = (uint32_t) new_session_dialog->control_channel_count();
                                        } else {
                                                cchns = 0;
                                        }
-                                                       
+
                                        if (new_session_dialog->create_master_bus()) {
                                                mchns = (uint32_t) new_session_dialog->master_channel_count();
                                        } else {
                                                mchns = 0;
                                        }
                                        if (new_session_dialog->create_master_bus()) {
                                                mchns = (uint32_t) new_session_dialog->master_channel_count();
                                        } else {
                                                mchns = 0;
                                        }
-                                                       
+
                                        if (new_session_dialog->connect_inputs()) {
                                                iconnect = AutoConnectPhysical;
                                        } else {
                                                iconnect = AutoConnectOption (0);
                                        }
                                        if (new_session_dialog->connect_inputs()) {
                                                iconnect = AutoConnectPhysical;
                                        } else {
                                                iconnect = AutoConnectOption (0);
                                        }
-                                                       
+
                                        /// @todo some minor tweaks.
                                        /// @todo some minor tweaks.
-                                                       
+
                                        if (new_session_dialog->connect_outs_to_master()) {
                                                oconnect = AutoConnectMaster;
                                        } else if (new_session_dialog->connect_outs_to_physical()) {
                                        if (new_session_dialog->connect_outs_to_master()) {
                                                oconnect = AutoConnectMaster;
                                        } else if (new_session_dialog->connect_outs_to_physical()) {
@@ -1903,34 +1999,44 @@ ARDOUR_UI::new_session (std::string predetermined_path)
                                        } else {
                                                oconnect = AutoConnectOption (0);
                                        } 
                                        } else {
                                                oconnect = AutoConnectOption (0);
                                        } 
-                                                       
+
                                        uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
                                        uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
                                        uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
                                        uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
-                                                       
-                                       build_session (session_path,
-                                                      session_name,
-                                                      cchns,
-                                                      mchns,
-                                                      iconnect,
-                                                      oconnect,
-                                                      nphysin,
-                                                      nphysout, 
-                                                      engine->frame_rate() * 60 * 5);
+
+                                       if (!build_session (session_path,
+                                                               session_name,
+                                                               cchns,
+                                                               mchns,
+                                                               iconnect,
+                                                               oconnect,
+                                                               nphysin,
+                                                               nphysout, 
+                                                               engine->frame_rate() * 60 * 5)) {
+
+                                               response = Gtk::RESPONSE_NONE;
+                                               new_session_dialog->reset ();
+                                               continue;
+                                       }
                                }
                        }
                }
                                }
                        }
                }
-               
+
        } while (response == Gtk::RESPONSE_NONE);
 
   done:
        show();
        new_session_dialog->get_window()->set_cursor();
        new_session_dialog->hide();
        } while (response == Gtk::RESPONSE_NONE);
 
   done:
        show();
        new_session_dialog->get_window()->set_cursor();
        new_session_dialog->hide();
+       return true;
 }
 
 void
 ARDOUR_UI::close_session()
 {
 }
 
 void
 ARDOUR_UI::close_session()
 {
+       if (!check_audioengine()) {
+               return;
+       }
+
        unload_session();
        new_session ();
 }
        unload_session();
        new_session ();
 }
@@ -1939,17 +2045,14 @@ int
 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
 {
        Session *new_session;
 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
 {
        Session *new_session;
-       int x;
        session_loaded = false;
        
        session_loaded = false;
        
-       x = unload_session ();
-
-       if (x < 0) {
+       if (!check_audioengine()) {
                return -1;
                return -1;
-       } else if (x > 0) {
-               return 0;
        }
 
        }
 
+       if(!unload_session ()) return -1;
+
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
@@ -1981,10 +2084,11 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string*
                session->set_clean ();
        }
 
                session->set_clean ();
        }
 
+       editor->edit_cursor_position (true);
        return 0;
 }
 
        return 0;
 }
 
-int
+bool
 ARDOUR_UI::build_session (const string & path, const string & snap_name, 
                          uint32_t control_channels,
                          uint32_t master_channels, 
 ARDOUR_UI::build_session (const string & path, const string & snap_name, 
                          uint32_t control_channels,
                          uint32_t master_channels, 
@@ -1995,15 +2099,14 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name,
                          nframes_t initial_length)
 {
        Session *new_session;
                          nframes_t initial_length)
 {
        Session *new_session;
-       int x;
 
 
-       session_loaded = false;
-       x = unload_session ();
-       if (x < 0) {
-               return -1;
-       } else if (x > 0) {
-               return 0;
+       if (!check_audioengine()) {
+               return false;
        }
        }
+
+       session_loaded = false;
+
+       if (!unload_session ()) return false;
        
        _session_is_new = true;
 
        
        _session_is_new = true;
 
@@ -2014,14 +2117,15 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name,
 
        catch (...) {
 
 
        catch (...) {
 
-               error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
-               return -1;
+               MessageDialog msg (string_compose(_("Could not create session in \"%1\""), path));
+               msg.run ();
+               return false;
        }
 
        connect_to_session (new_session);
 
        session_loaded = true;
        }
 
        connect_to_session (new_session);
 
        session_loaded = true;
-       return 0;
+       return true;
 }
 
 void
 }
 
 void
@@ -2120,17 +2224,19 @@ require some unused files to continue to exist."));
 
        dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
 
 
        dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
 
+       const string dead_sound_directory = session->session_directory().dead_sound_path().to_string();
+
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
-                 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("files were"), dead_sound_directory, (float) rep.space / 1024.0f, "kilo"));
                } else {
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), dead_sound_directory, (float) rep.space / 1024.0f, "kilo"));
                }
        } else {
                if (removed > 1) {
                }
        } else {
                if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("files were"), dead_sound_directory, (float) rep.space / 1048576.0f, "mega"));
                } else {
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), dead_sound_directory, (float) rep.space / 1048576.0f, "mega"));
                }
        }
 
                }
        }
 
@@ -2249,7 +2355,7 @@ releasing %4 %5bytes of disk space"));
 }
 
 void
 }
 
 void
-ARDOUR_UI::add_route ()
+ARDOUR_UI::add_route (Gtk::Window* float_window)
 {
        int count;
 
 {
        int count;
 
@@ -2259,7 +2365,9 @@ ARDOUR_UI::add_route ()
 
        if (add_route_dialog == 0) {
                add_route_dialog = new AddRouteDialog;
 
        if (add_route_dialog == 0) {
                add_route_dialog = new AddRouteDialog;
-               editor->ensure_float (*add_route_dialog);
+               if (float_window) {
+                       add_route_dialog->set_transient_for (*float_window);
+               }
        }
 
        if (add_route_dialog->is_visible()) {
        }
 
        if (add_route_dialog->is_visible()) {
@@ -2268,15 +2376,15 @@ ARDOUR_UI::add_route ()
        }
 
        ResponseType r = (ResponseType) add_route_dialog->run ();
        }
 
        ResponseType r = (ResponseType) add_route_dialog->run ();
-       
+
        add_route_dialog->hide();
 
        switch (r) {
        add_route_dialog->hide();
 
        switch (r) {
-       case RESPONSE_ACCEPT:
-               break;
-       default:
-               return;
-               break;
+               case RESPONSE_ACCEPT:
+                       break;
+               default:
+                       return;
+                       break;
        }
 
        if ((count = add_route_dialog->count()) <= 0) {
        }
 
        if ((count = add_route_dialog->count()) <= 0) {
@@ -2291,17 +2399,28 @@ ARDOUR_UI::add_route ()
        AutoConnectOption oac = Config->get_output_auto_connect();
 
        if (oac & AutoConnectMaster) {
        AutoConnectOption oac = Config->get_output_auto_connect();
 
        if (oac & AutoConnectMaster) {
-               output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
+               output_chan = (session->master_out() ? session->master_out()->n_inputs().n_audio() : input_chan);
        } else {
                output_chan = input_chan;
        }
 
        /* XXX do something with name template */
 
        } else {
                output_chan = input_chan;
        }
 
        /* XXX do something with name template */
 
-       if (track) {
-               session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
-       } else {
-               session_add_audio_bus (input_chan, output_chan, count);
+       if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
+               if (track) {
+                       session_add_midi_track(count);
+               } else  {
+                       MessageDialog msg (*editor,
+                                       _("Sorry, MIDI Busses are not supported at this time."));
+                       msg.run ();
+                       //session_add_midi_bus();
+               }
+       } else { 
+               if (track) {
+                       session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
+               } else {
+                       session_add_audio_bus (input_chan, output_chan, count);
+               }
        }
 }
 
        }
 }
 
@@ -2311,9 +2430,9 @@ ARDOUR_UI::mixer_settings () const
        XMLNode* node = 0;
 
        if (session) {
        XMLNode* node = 0;
 
        if (session) {
-               node = session->instant_xml(X_("Mixer"), session->path());
+               node = session->instant_xml(X_("Mixer"));
        } else {
        } else {
-               node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
+               node = Config->instant_xml(X_("Mixer"));
        }
 
        if (!node) {
        }
 
        if (!node) {
@@ -2329,9 +2448,9 @@ ARDOUR_UI::editor_settings () const
        XMLNode* node = 0;
 
        if (session) {
        XMLNode* node = 0;
 
        if (session) {
-               node = session->instant_xml(X_("Editor"), session->path());
+               node = session->instant_xml(X_("Editor"));
        } else {
        } else {
-               node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
+               node = Config->instant_xml(X_("Editor"));
        }
 
        if (!node) {
        }
 
        if (!node) {
@@ -2366,18 +2485,18 @@ ARDOUR_UI::halt_on_xrun_message ()
 void
 ARDOUR_UI::disk_overrun_handler ()
 {
 void
 ARDOUR_UI::disk_overrun_handler ()
 {
-       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
 
 
-       if (!have_disk_overrun_displayed) {
-               have_disk_overrun_displayed = true;
-               MessageDialog msg (*editor, X_("diskrate dialog"), _("\
+       if (!have_disk_speed_dialog_displayed) {
+               have_disk_speed_dialog_displayed = true;
+               MessageDialog* msg = new MessageDialog (*editor, _("\
 The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to write data to disk\n\
 quickly enough to keep up with recording.\n"));
 The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to write data to disk\n\
 quickly enough to keep up with recording.\n"));
-               msg.run ();
-               have_disk_overrun_displayed = false;
+               msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg));
+               msg->show_all ();
        }
 }
 
        }
 }
 
@@ -2386,29 +2505,24 @@ ARDOUR_UI::disk_underrun_handler ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
-       if (!have_disk_underrun_displayed) {
-               have_disk_underrun_displayed = true;
-               MessageDialog msg (*editor,
-                       (_("The disk system on your computer\n\
+       if (!have_disk_speed_dialog_displayed) {
+               have_disk_speed_dialog_displayed = true;
+               MessageDialog* msg = new MessageDialog (*editor,
+                                  _("The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to read data from disk\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to read data from disk\n\
-quickly enough to keep up with playback.\n")));
-               msg.run ();
-               have_disk_underrun_displayed = false;
+quickly enough to keep up with playback.\n"));
+               msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg));
+               msg->show_all ();
        } 
 }
 
 void
        } 
 }
 
 void
-ARDOUR_UI::disk_underrun_message_gone ()
+ARDOUR_UI::disk_speed_dialog_gone (int ignored_response, MessageDialog* msg)
 {
 {
-       have_disk_underrun_displayed = false;
-}
-
-void
-ARDOUR_UI::disk_overrun_message_gone ()
-{
-       have_disk_underrun_displayed = false;
+       have_disk_speed_dialog_displayed = false;
+       delete msg;
 }
 
 int
 }
 
 int
@@ -2480,8 +2594,7 @@ ARDOUR_UI::cmdline_new_session (string path)
        }
 
        new_session (path);
        }
 
        new_session (path);
-
-       _will_create_new_session_automatically = false; /* done it */
+       
        return FALSE; /* don't call it again */
 }
 
        return FALSE; /* don't call it again */
 }
 
@@ -2542,8 +2655,17 @@ ARDOUR_UI::use_config ()
 void
 ARDOUR_UI::update_transport_clocks (nframes_t pos)
 {
 void
 ARDOUR_UI::update_transport_clocks (nframes_t pos)
 {
-       primary_clock.set (pos);
-       secondary_clock.set (pos);
+       if (Config->get_primary_clock_delta_edit_cursor()) {
+               primary_clock.set (pos, false, editor->edit_cursor_position(false), 'p');
+       } else {
+               primary_clock.set (pos, 0, true);
+       }
+
+       if (Config->get_secondary_clock_delta_edit_cursor()) {
+               secondary_clock.set (pos, false, editor->edit_cursor_position(false), 's');
+       } else {
+               secondary_clock.set (pos);
+       }
 
        if (big_clock_window) {
                big_clock.set (pos);
 
        if (big_clock_window) {
                big_clock.set (pos);
@@ -2587,6 +2709,9 @@ ARDOUR_UI::save_keybindings ()
 bool
 ARDOUR_UI::first_idle ()
 {
 bool
 ARDOUR_UI::first_idle ()
 {
+       if (session) {
+               session->allow_auto_play (true);
+       }
        can_save_keybindings = true;
        return false;
 }
        can_save_keybindings = true;
        return false;
 }
@@ -2616,23 +2741,22 @@ void
 ARDOUR_UI::TransportControllable::set_value (float val)
 {
        if (type == ShuttleControl) {
 ARDOUR_UI::TransportControllable::set_value (float val)
 {
        if (type == ShuttleControl) {
-
                double fract;
 
                double fract;
 
-               if (val == 63.0f) {
+               if (val == 0.5f) {
                        fract = 0.0;
                } else {
                        fract = 0.0;
                } else {
-                       if (val < 63.0f) {
-                               fract = -((63.0f - val)/63.0f);
+                       if (val < 0.5f) {
+                               fract = -((0.5f - val)/0.5f);
                        } else {
                        } else {
-                               fract = ((val - 63.0f)/63.0f);
+                               fract = ((val - 0.5f)/0.5f);
                        }
                }
                
                ui.set_shuttle_fract (fract);
                return;
        }
                        }
                }
                
                ui.set_shuttle_fract (fract);
                return;
        }
-               
+
        if (val < 0.5f) {
                /* do nothing: these are radio-style actions */
                return;
        if (val < 0.5f) {
                /* do nothing: these are radio-style actions */
                return;
@@ -2670,7 +2794,7 @@ ARDOUR_UI::TransportControllable::set_value (float val)
                return;
        }
 
                return;
        }
 
-       Glib::RefPtr<Action> act = ActionManager::get_action ("transport", action);
+       Glib::RefPtr<Action> act = ActionManager::get_action ("Transport", action);
 
        if (act) {
                act->activate ();
 
        if (act) {
                act->activate ();
@@ -2711,3 +2835,50 @@ ARDOUR_UI::TransportControllable::set_id (const string& str)
 {
        _id = str;
 }
 {
        _id = str;
 }
+
+void
+ARDOUR_UI::setup_profile ()
+{
+       if (gdk_screen_width() < 1200) {
+               Profile->set_small_screen ();
+       }
+}
+
+void
+ARDOUR_UI::disable_all_plugins ()
+{
+       if (!session) {
+               return;
+       }
+
+       // session->begin_reversible_command (_("Disable all plugins"));
+
+       boost::shared_ptr<Session::RouteList> routes = session->get_routes ();
+
+       for (Session::RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
+               // XMLNode& before = (*i)->get_redirect_state ();
+               // session->add_command (new MementoCommand<Route>(**i, &before, 0));
+               (*i)->disable_plugins ();
+               // XMLNode& after = (*i)->get_redirect_state ();
+               // session->add_command (new MementoCommand<Route>(**i, 0, &after));
+                                     
+       }
+
+       // session->commit_reversible_command ();
+}
+
+void
+ARDOUR_UI::ab_all_plugins ()
+{
+       if (!session) {
+               return;
+       }
+
+       boost::shared_ptr<Session::RouteList> routes = session->get_routes ();
+
+       for (Session::RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
+               (*i)->ab_plugins (ab_direction);
+       }
+       
+       ab_direction = !ab_direction;
+}