RCU-ification of AudioEngine port list, and DiskStreams. not well tested, but basical...
[ardour.git] / gtk2_ardour / ardour_ui.cc
index fd5f8ed989902311ed4e89e6f17a6fb03bdb8780..bca27c7231ab978bf0ebc083f8941032e2b8dc8f 100644 (file)
 
 #include <iostream>
 
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/accelmap.h>
+
 #include <pbd/error.h>
 #include <pbd/compose.h>
-#include <pbd/basename.h>
 #include <pbd/pathscanner.h>
 #include <pbd/failed_constructor.h>
 #include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/pix.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <midi++/mmc.h>
 
 #include <ardour/ardour.h>
+#include <ardour/session_route.h>
 #include <ardour/port.h>
 #include <ardour/audioengine.h>
 #include <ardour/playlist.h>
 #include <ardour/utils.h>
-#include <ardour/diskstream.h>
-#include <ardour/filesource.h>
+#include <ardour/audio_diskstream.h>
+#include <ardour/audiofilesource.h>
 #include <ardour/recent_sessions.h>
-#include <ardour/session_diskstream.h>
 #include <ardour/port.h>
 #include <ardour/audio_track.h>
 
 #include "actions.h"
 #include "ardour_ui.h"
-#include "ardour_message.h"
 #include "public_editor.h"
 #include "audio_clock.h"
 #include "keyboard.h"
 #include "about.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "meter_xpms.h"
+#include "color_manager.h"
 
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace sigc;
@@ -87,19 +88,6 @@ sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
 
-static const char* channel_setup_names[] = {
-       "mono",
-       "stereo",
-       "3 channels",
-       "4 channels",
-       "5 channels",
-       "8 channels",
-       "manual setup",
-       0
-};
-
-vector<string> channel_combo_strings;
-
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
@@ -128,25 +116,20 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
          shuttle_units_button (_("% ")),
 
-         punch_in_button (_("punch\nin")),
-         punch_out_button (_("punch\nout")),
-         auto_return_button (_("auto\nreturn")),
-         auto_play_button (_("auto\nplay")),
-         auto_input_button (_("auto\ninput")),
-         click_button (_("click")),
-         auditioning_alert_button (_("AUDITIONING")),
+         punch_in_button (_("Punch In")),
+         punch_out_button (_("Punch Out")),
+         auto_return_button (_("Auto Return")),
+         auto_play_button (_("Autuo Play")),
+         auto_input_button (_("Auto Input")),
+         click_button (_("Click")),
+         auditioning_alert_button (_("AUDITION")),
          solo_alert_button (_("SOLO")),
          shown_flag (false)
-
 {
        using namespace Gtk::Menu_Helpers;
 
        Gtkmm2ext::init();
-
-       /* actually, its already loaded, but ... */
-
-       cerr << "Loading UI configuration file " << rcfile << endl;
-
+       
        about = 0;
 
        if (theArdourUI == 0) {
@@ -154,10 +137,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        }
 
        ActionManager::init ();
+
+       /* load colors */
+
+       color_manager = new ColorManager();
+
+       std::string color_file = ARDOUR::find_config_file("ardour.colors");
        
-       m_new_session_dialog = 0;
-       m_new_session_dialog_ref = NewSessionDialogFactory::create();
-       m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
+       color_manager->load (color_file);
+
+       m_new_session_dialog = new NewSessionDialog();
        editor = 0;
        mixer = 0;
        session = 0;
@@ -184,6 +173,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        shuttle_grabbed = false;
        shuttle_fract = 0.0;
+       shuttle_max_speed = 8.0f;
 
        set_shuttle_units (Percentage);
        set_shuttle_behaviour (Sprung);
@@ -194,35 +184,17 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        gettimeofday (&last_peak_grab, 0);
        gettimeofday (&last_shuttle_request, 0);
 
-       ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
-       ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
-       ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
-       ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
+       ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
+       ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
+       ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
        /* handle pending state with a dialog */
 
        ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
 
-       channel_combo_strings = internationalize (channel_setup_names);
-       
        /* have to wait for AudioEngine and Configuration before proceeding */
 }
 
-void
-ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
-{
-       ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
-       
-       string msg = string_compose (_("\
-You cannot record-enable\n\
-track %1\n\
-because it has no input connections.\n\
-You would be wasting space recording silence."),
-                             ds->name());
-
-       ArdourMessage message (editor, X_("cannotrecord"), msg);
-}
-
 void
 ARDOUR_UI::set_engine (AudioEngine& e)
 {
@@ -236,10 +208,6 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        _tooltips.enable();
 
        keyboard = new Keyboard;
-       install_keybindings ();
-
-       FastMeter::set_vertical_xpm (v_meter_strip_xpm);
-       FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
 
        if (setup_windows ()) {
                throw failed_constructor ();
@@ -267,12 +235,16 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        
        blink_timeout_tag = -1;
 
+       /* the global configuration object is now valid */
+
+       use_config ();
+
        /* this being a GUI and all, we want peakfiles */
 
-       FileSource::set_build_peakfiles (true);
-       FileSource::set_build_missing_peakfiles (true);
+       AudioFileSource::set_build_peakfiles (true);
+       AudioFileSource::set_build_missing_peakfiles (true);
 
-       if (Source::start_peak_thread ()) {
+       if (AudioSource::start_peak_thread ()) {
                throw failed_constructor();
        }
 
@@ -309,7 +281,7 @@ ARDOUR_UI::~ARDOUR_UI ()
                delete add_route_dialog;
        }
 
-       Source::stop_peak_thread ();
+       AudioSource::stop_peak_thread ();
 }
 
 gint
@@ -366,16 +338,20 @@ ARDOUR_UI::save_ardour_state ()
        Config->add_extra_xml (*node);
        Config->save_state();
 
-       XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
-       XMLNode& mnode (mixer->get_state());
+       XMLNode enode(static_cast<Stateful*>(editor)->get_state());
+       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->path());
+               session->add_instant_xml (mnode, session->path());
        } else {
-               Config->add_instant_xml(enode, Config->get_user_ardour_path());
-               Config->add_instant_xml(mnode, Config->get_user_ardour_path());
+               Config->add_instant_xml (enode, get_user_ardour_path());
+               Config->add_instant_xml (mnode, get_user_ardour_path());
        }
+
+       /* keybindings */
+
+       AccelMap::save ("ardour.saved_bindings");
 }
 
 void
@@ -403,11 +379,12 @@ ARDOUR_UI::finish()
                        /* use the default name */
                        if (save_state_canfail ("")) {
                                /* failed - don't quit */
-                               ArdourMessage (editor, X_("badsave dialog"),
+                               MessageDialog msg (*editor, 
                                               _("\
 Ardour was unable to save your session.\n\n\
 If you still wish to quit, please use the\n\n\
 \"Just quit\" option."));
+                               msg.run ();
                                return;
                        }
                        break;
@@ -415,7 +392,7 @@ If you still wish to quit, please use the\n\n\
                        break;
                }
        }
-
+       Config->save_state();
        quit ();
 }
 
@@ -423,15 +400,20 @@ int
 ARDOUR_UI::ask_about_saving_session (const string & what)
 {
        ArdourDialog window (_("ardour: save session?"));
+       Gtk::HBox dhbox;  // the hbox for the image and text
        Gtk::Label  prompt_label;
+       Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING,  Gtk::ICON_SIZE_DIALOG));
+
        string msg;
 
-       msg = string_compose(_("Save and %1"), what);
-       window.add_button (msg, RESPONSE_ACCEPT);
-       msg = string_compose(_("Just %1"), what);
-       window.add_button (msg, RESPONSE_APPLY);
        msg = string_compose(_("Don't %1"), what);
        window.add_button (msg, RESPONSE_REJECT);
+       msg = string_compose(_("Just %1"), what);
+       window.add_button (msg, RESPONSE_APPLY);
+       msg = string_compose(_("Save and %1"), what);
+       window.add_button (msg, RESPONSE_ACCEPT);
+
+       window.set_default_response (RESPONSE_ACCEPT);
 
        Gtk::Button noquit_button (msg);
        noquit_button.set_name ("EditorGTKButton");
@@ -444,18 +426,24 @@ ARDOUR_UI::ask_about_saving_session (const string & what)
        } else {
                type = _("snapshot");
        }
-       prompt = string_compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
+       prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
                         type, session->snap_name());
        
        prompt_label.set_text (prompt);
-       prompt_label.set_alignment (0.5, 0.5);
        prompt_label.set_name (X_("PrompterLabel"));
-       
-       window.get_vbox()->pack_start (prompt_label);
+       prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
+
+       dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
+;
+       dhbox.set_homogeneous (false);
+       dhbox.pack_start (*dimage, false, false, 5);
+       dhbox.pack_start (prompt_label, true, false, 5);
+       window.get_vbox()->pack_start (dhbox);
 
        window.set_name (_("Prompter"));
        window.set_position (Gtk::WIN_POS_MOUSE);
        window.set_modal (true);
+       window.set_resizable (false);
        window.show_all ();
 
        save_the_session = 0;
@@ -484,27 +472,12 @@ ARDOUR_UI::every_second ()
        update_cpu_load ();
        update_buffer_load ();
        update_disk_space ();
-       // update_disk_rate ();
        return TRUE;
 }
 
 gint
 ARDOUR_UI::every_point_one_seconds ()
 {
-       struct timeval now;
-       struct timeval diff;
-       
-       /* do not attempt to grab peak power more than once per cycle.
-        */
-
-       gettimeofday (&now, 0);
-       timersub (&now, &last_peak_grab, &diff);
-
-       if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
-               // IO::GrabPeakPower(); /* EMIT_SIGNAL */
-               last_peak_grab = now;
-       } 
-
        update_speed_display ();
        RapidScreenUpdate(); /* EMIT_SIGNAL */
        return TRUE;
@@ -533,11 +506,11 @@ ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
                jack_nframes_t rate = engine->frame_rate();
                
                if (fmod (rate, 1000.0) != 0.0) {
-                       snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"), 
+                       snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"), 
                                  (float) rate/1000.0f,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                } else {
-                       snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"), 
+                       snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"), 
                                  rate/1000,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                }
@@ -550,24 +523,10 @@ void
 ARDOUR_UI::update_cpu_load ()
 {
        char buf[32];
-       snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
+       snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
        cpu_load_label.set_text (buf);
 }
 
-void
-ARDOUR_UI::update_disk_rate ()
-{
-       char buf[64];
-
-       if (session) {
-               snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"), 
-                         session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
-               disk_rate_label.set_text (buf);
-       } else {
-               disk_rate_label.set_text ("");
-       }
-}
-
 void
 ARDOUR_UI::update_buffer_load ()
 {
@@ -583,9 +542,10 @@ ARDOUR_UI::update_buffer_load ()
 }
 
 void
-ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
+ARDOUR_UI::count_recenabled_diskstreams (Route& route)
 {
-       if (ds.record_enabled()) {
+       Track* track = dynamic_cast<Track*>(&route);
+       if (track && track->diskstream()->record_enabled()) {
                rec_enabled_diskstreams++;
        }
 }
@@ -601,7 +561,7 @@ ARDOUR_UI::update_disk_space()
        char buf[64];
 
        if (frames == max_frames) {
-               strcpy (buf, _("space: 24hrs+"));
+               strcpy (buf, _("Disk: 24hrs+"));
        } else {
                int hrs;
                int mins;
@@ -611,7 +571,7 @@ ARDOUR_UI::update_disk_space()
                if (session->actively_recording()){
                        
                        rec_enabled_diskstreams = 0;
-                       session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
+                       session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
                        
                        if (rec_enabled_diskstreams) {
                                frames /= rec_enabled_diskstreams;
@@ -631,7 +591,7 @@ ARDOUR_UI::update_disk_space()
                frames -= mins * fr * 60;
                secs = frames / fr;
                
-               snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
+               snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
        }
 
        disk_space_label.set_text (buf);
@@ -652,190 +612,6 @@ ARDOUR_UI::update_wall_clock ()
 
        return TRUE;
 }
-
-void
-ARDOUR_UI::toggle_recording_plugins ()
-{
-       /* XXX use toggle_some_session_state */
-
-       if (session == 0) {
-               return;
-       }
-
-       session->set_recording_plugins (!session->get_recording_plugins());
-}
-       
-void
-ARDOUR_UI::toggle_auto_play ()
-
-{
-       toggle_some_session_state (auto_play_button,
-                                  &Session::get_auto_play,
-                                  &Session::set_auto_play);
-}
-
-void
-ARDOUR_UI::toggle_auto_return ()
-
-{
-       toggle_some_session_state (auto_return_button,
-                                  &Session::get_auto_return,
-                                  &Session::set_auto_return);
-}
-
-void
-ARDOUR_UI::toggle_click ()
-{
-       toggle_some_session_state (click_button,
-                                  &Session::get_clicking,
-                                  &Session::set_clicking);
-}
-
-void
-ARDOUR_UI::toggle_session_auto_loop ()
-{
-       if (session) {
-               if (session->get_auto_loop()) {
-                       if (session->transport_rolling()) {
-                               transport_roll();
-                       }
-                       else {
-                               session->request_auto_loop (false);
-                       }
-               }
-               else {
-                       session->request_auto_loop (true);
-               }
-       }
-}
-
-void
-ARDOUR_UI::toggle_session_punch_in ()
-{
-       if (session) {
-               session->set_punch_in (!session->get_punch_in());
-       }
-}
-
-void
-ARDOUR_UI::toggle_punch_out ()
-{
-       toggle_some_session_state (punch_out_button,
-                                  &Session::get_punch_out,
-                                  &Session::set_punch_out);
-}
-
-void
-ARDOUR_UI::toggle_punch_in ()
-{
-       toggle_some_session_state (punch_in_button,
-                                  &Session::get_punch_in,
-                                  &Session::set_punch_in);
-}
-
-void
-ARDOUR_UI::map_button_state ()
-
-{
-       map_some_session_state (auto_return_button,
-                               &Session::get_auto_return);
-       map_some_session_state (auto_play_button,
-                               &Session::get_auto_play);
-       map_some_session_state (auto_input_button,
-                               &Session::get_auto_input);
-       map_some_session_state (punch_in_button,
-                               &Session::get_punch_in);
-       map_some_session_state (punch_out_button,
-                               &Session::get_punch_out);
-       map_some_session_state (click_button,
-                               &Session::get_clicking);
-}
-
-void
-ARDOUR_UI::queue_map_control_change (Session::ControlType t)
-{
-       ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::map_control_change), t));
-}
-
-void
-ARDOUR_UI::map_control_change (Session::ControlType t)
-{
-       switch (t) {
-       case Session::AutoPlay:
-               map_some_session_state (auto_play_button, &Session::get_auto_play);
-               break;
-
-       case Session::AutoLoop:
-               break;
-
-       case Session::AutoReturn:
-               map_some_session_state (auto_return_button, &Session::get_auto_return);
-               break;
-
-       case Session::AutoInput:
-               map_some_session_state (auto_input_button, &Session::get_auto_input);
-               break;
-
-       case Session::PunchOut:
-               map_some_session_state (punch_in_button, &Session::get_punch_out);
-               break;
-
-       case Session::PunchIn:
-               map_some_session_state (punch_in_button, &Session::get_punch_in);
-               break;
-
-       case Session::Clicking:
-               map_some_session_state (click_button, &Session::get_clicking);
-               break;
-
-       case Session::SlaveType:
-//             map_some_session_state (mtc_slave_button, &Session::get_mtc_slave);
-               break;
-
-       case Session::SendMTC:
-//             map_some_session_state (send_mtc_button, &Session::get_send_mtc);
-               break;
-
-       case Session::SendMMC:
-//             map_some_session_state (send_mmc_button, &Session::get_send_mmc);
-               break;
-
-       case Session::MMCControl:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-
-       case Session::MidiFeedback:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-       case Session::MidiControl:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-               
-       case Session::Live:
-               break;
-
-       case Session::RecordingPlugins:
-               break;
-
-       case Session::CrossFadesActive:
-               break;
-               
-       case Session::EditingMode:
-               break;
-
-       case Session::PlayRange:
-               break;
-
-       case Session::AlignChoice:
-               /* don't care, this is handled by the options editor */
-               break;
-       case Session::SeamlessLoop:
-               /* don't care, this is handled by the options editor */
-               break;
-              
-       }
-}
-
 void
 ARDOUR_UI::control_methods_adjusted ()
 
@@ -871,54 +647,6 @@ ARDOUR_UI::mmc_device_id_adjusted ()
 #endif
 }
 
-void
-ARDOUR_UI::map_some_session_state (ToggleButton& button,
-                                  bool (Session::*get)() const)
-       
-{
-       bool x;
-
-       if (session == 0) {
-               return;
-       }
-       
-       if (button.get_active() != (x = (session->*get)())) {
-               button.set_active (x);
-       }
-}
-
-void
-ARDOUR_UI::toggle_some_session_state (ToggleButton& button,
-                                     bool (Session::*get)() const,
-                                     void (Session::*set)(bool))
-
-{
-       bool button_state;
-       bool session_state;
-
-       if (session == 0) {
-               return;
-       }
-
-       button_state = button.get_active ();
-       session_state = (session->*get)();
-
-       if (button_state != session_state) {
-               (session->*set) (button_state);
-#if 0
-       
-               /* check that it worked, and reverse
-                  the button state if it didn't
-               */
-
-               if ((session->*get)() != button_state) {
-                       button->set_active (!button_state);
-               }
-#endif
-
-       }
-}      
-
 gint
 ARDOUR_UI::session_menu (GdkEventButton *ev)
 {
@@ -973,7 +701,7 @@ ARDOUR_UI::redisplay_recent_sessions ()
 
                TreeModel::Row row = *(recent_session_model->append());
 
-               row[recent_session_columns.visible_name] = PBD::basename (fullpath);
+               row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
                row[recent_session_columns.fullpath] = fullpath;
 
                if (states->size() > 1) {
@@ -1006,12 +734,15 @@ ARDOUR_UI::build_session_selector ()
        Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
        
        session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
-       session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
-
+       session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
+       session_selector_window->set_default_response (RESPONSE_ACCEPT);
        recent_session_model = TreeStore::create (recent_session_columns);
        recent_session_display.set_model (recent_session_model);
        recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
        recent_session_display.set_headers_visible (false);
+       recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
+
+       recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
 
        scroller->add (recent_session_display);
        scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
@@ -1022,6 +753,12 @@ ARDOUR_UI::build_session_selector ()
        session_selector_window->show_all_children();
 }
 
+void
+ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
+{
+       session_selector_window->response (RESPONSE_ACCEPT);
+}
+
 void
 ARDOUR_UI::open_recent_session ()
 {
@@ -1071,9 +808,11 @@ ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
                return false;
        }
 
+        // XXX Portability
+        
        string session_file = info.filename;
        session_file += '/';
-       session_file += PBD::basename (info.filename);
+       session_file += Glib::path_get_basename (info.filename);
        session_file += ".ardour";
        
        if (stat (session_file.c_str(), &statbuf) != 0) {
@@ -1135,9 +874,9 @@ ARDOUR_UI::session_add_midi_track ()
 }
 
 void
-ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels)
+ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
 {
-       Route* route;
+       boost::shared_ptr<Route> route;
 
        if (session == 0) {
                warning << _("You cannot add a track without a session already loaded.") << endmsg;
@@ -1146,7 +885,7 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
 
        try { 
                if (disk) {
-                       if ((route = session->new_audio_track (input_channels, output_channels)) == 0) {
+                       if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
                                error << _("could not create new audio track") << endmsg;
                        }
                } else {
@@ -1169,19 +908,15 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
        }
 
        catch (...) {
-               ArdourMessage msg (editor, X_("noport dialog"),
+               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::diskstream_added (DiskStream* ds)
-{
-}
-
 void
 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
 {
@@ -1202,6 +937,23 @@ ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
 
 void
 ARDOUR_UI::transport_goto_start ()
+{
+       if (session) {
+               session->goto_start();
+
+               
+               /* force displayed area in editor to start no matter
+                  what "follow playhead" setting is.
+               */
+               
+               if (editor) {
+                       editor->reposition_x_origin (session->current_start_frame());
+               }
+       }
+}
+
+void
+ARDOUR_UI::transport_goto_zero ()
 {
        if (session) {
                session->request_locate (0);
@@ -1277,14 +1029,15 @@ ARDOUR_UI::transport_record ()
                case Session::Disabled:
                        if (session->ntracks() == 0) {
                                string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
-                               ArdourMessage msg (editor, X_("cannotrecenable"), txt);
+                               MessageDialog msg (*editor, txt);
+                               msg.run ();
                                return;
                        }
                        session->maybe_enable_record ();
                        break;
                case Session::Recording:
                case Session::Enabled:
-                       session->disable_record ();
+                       session->disable_record (true);
                }
        }
 }
@@ -1401,32 +1154,25 @@ ARDOUR_UI::transport_forward (int option)
 }
 
 void
-ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
+ARDOUR_UI::toggle_record_enable (uint32_t dstream)
 {
        if (session == 0) {
                return;
        }
 
-       DiskStream *ds;
+       boost::shared_ptr<Route> r;
+       
+       if ((r = session->route_by_remote_id (dstream)) != 0) {
 
-       if ((ds = session->diskstream_by_id (dstream)) != 0) {
-               Port *port = ds->io()->input (0);
-               port->request_monitor_input (!port->monitoring_input());
-       }
-}
+               Track* t;
 
-void
-ARDOUR_UI::toggle_record_enable (guint32 dstream)
-{
+               if ((t = dynamic_cast<Track*>(r.get())) != 0) {
+                       t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
+               }
+       }
        if (session == 0) {
                return;
        }
-
-       DiskStream *ds;
-
-       if ((ds = session->diskstream_by_id (dstream)) != 0) {
-               ds->set_record_enabled (!ds->record_enabled(), this);
-       }
 }
 
 void
@@ -1451,14 +1197,6 @@ ARDOUR_UI::map_transport_state ()
        }
 }
 
-void
-ARDOUR_UI::send_all_midi_feedback ()
-{
-       if (session) {
-               session->send_all_midi_feedback();
-       }
-}
-
 void
 ARDOUR_UI::allow_local_only ()
 {
@@ -1511,12 +1249,13 @@ ARDOUR_UI::engine_halted ()
 
        update_sample_rate (0);
 
-       ArdourMessage msg (editor, X_("halted"),
+       MessageDialog msg (*editor, 
                           _("\
 JACK has either been shutdown or it\n\
 disconnected Ardour because Ardour\n\
 was not fast enough. You can save the\n\
 session and/or try to reconnect to JACK ."));
+       msg.run ();
 }
 
 int32_t
@@ -1634,63 +1373,6 @@ ARDOUR_UI::stop_blinking ()
        }
 }
 
-
-void
-ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
-{
-       using namespace Gtk;
-       using namespace Menu_Helpers;
-
-       if (dstream.hidden()) {
-               return;
-       }
-
-       MenuList& items = diskstream_menu->items();
-       items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
-}
-       
-void
-ARDOUR_UI::diskstream_selected (gint32 id)
-{
-       selected_dstream = id;
-       Main::quit ();
-}
-
-gint32
-ARDOUR_UI::select_diskstream (GdkEventButton *ev)
-{
-       using namespace Gtk;
-       using namespace Menu_Helpers;
-
-       if (session == 0) {
-               return -1;
-       }
-
-       diskstream_menu = new Menu();
-       diskstream_menu->set_name ("ArdourContextMenu");
-       using namespace Gtk;
-       using namespace Menu_Helpers;
-
-       MenuList& items = diskstream_menu->items();
-       items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
-
-       session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
-
-       if (ev) {
-               diskstream_menu->popup (ev->button, ev->time);
-       } else {
-               diskstream_menu->popup (0, 0);
-       }
-
-       selected_dstream = -1;
-
-       Main::run ();
-
-       delete diskstream_menu;
-
-       return selected_dstream;
-}
-
 void
 ARDOUR_UI::name_io_setup (AudioEngine& engine, 
                          string& buf,
@@ -1746,10 +1428,12 @@ ARDOUR_UI::snapshot_session ()
 
        time (&n);
        now = ctime (&n);
-       now = now.substr (0, now.length() - 1);
+       now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
 
        prompter.set_name ("Prompter");
-       prompter.set_prompt (_("Name for snapshot"));
+       prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+       prompter.set_prompt (_("Name of New Snapshot"));
        prompter.set_initial_text (now);
        
        switch (prompter.run()) {
@@ -1817,7 +1501,7 @@ ARDOUR_UI::secondary_clock_value_changed ()
 }
 
 void
-ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
+ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
 {
        if (session && dstream && dstream->record_enabled()) {
 
@@ -1897,7 +1581,9 @@ ARDOUR_UI::save_template ()
        prompter.set_name (X_("Prompter"));
        prompter.set_prompt (_("Name for mix template:"));
        prompter.set_initial_text(session->name() + _("-template"));
-       
+       prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+
        switch (prompter.run()) {
        case RESPONSE_ACCEPT:
                prompter.get_result (name);
@@ -1915,26 +1601,53 @@ ARDOUR_UI::save_template ()
 void
 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
 {
-       m_new_session_dialog->show_all();
-       m_new_session_dialog->set_transient_for(*editor);
+       m_new_session_dialog->show();
+       m_new_session_dialog->set_modal(true);
        m_new_session_dialog->set_name(predetermined_path);
+       m_new_session_dialog->reset_recent();
 
        int response = Gtk::RESPONSE_CANCEL;
 
        do {
                response = m_new_session_dialog->run ();
-       
-               if(response == Gtk::RESPONSE_OK) {
+               if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
+                 quit();
+                 return;
+
+               } else if (response == Gtk::RESPONSE_NONE) {
+                 /* Clear was pressed */
+                 m_new_session_dialog->reset();
+
+               } else if (response == Gtk::RESPONSE_YES) {
+                 /* YES  == OPEN, but there's no enum for that */
+                 std::string session_name = m_new_session_dialog->session_name();
+                 std::string session_path = m_new_session_dialog->session_folder();
+                 load_session (session_path, session_name);
+
+
+               } else if (response == Gtk::RESPONSE_OK) {
+                 if (m_new_session_dialog->get_current_page() == 1) {
+
+                   /* 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.. 
+                   */
+                       std::string session_name = m_new_session_dialog->session_name();
+                       std::string session_path = m_new_session_dialog->session_folder();
+                       load_session (session_path, session_name);
+
+                 } else {
 
                        _session_is_new = true;
                        
                        std::string session_name = m_new_session_dialog->session_name();
                        std::string session_path = m_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);
                        
                        std::string template_name = m_new_session_dialog->session_template_name();
@@ -1990,11 +1703,21 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                                               nphysin,
                                               nphysout, 
                                               engine->frame_rate() * 60 * 5);
-                       }               
+                       }
+                 }     
                }
+               
+       } while (response == Gtk::RESPONSE_NONE);
+       m_new_session_dialog->hide();
+       show();
+
+}
 
-       } while(response == Gtk::RESPONSE_HELP);
-       m_new_session_dialog->hide_all();
+void
+ARDOUR_UI::close_session()
+{
+  unload_session();
+  new_session ();
 }
 
 int
@@ -2014,9 +1737,10 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string*
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
-               ArdourMessage msg (editor, X_("noaccess dialog"), _("\
+               MessageDialog msg (*editor, _("\
 You do not have write access to this session.\n\
 This prevents the session from being loaded."));
+               msg.run ();
                return -1;
        }
 
@@ -2046,6 +1770,8 @@ ARDOUR_UI::make_session_clean ()
                session->set_clean ();
        }
 
+       show ();
+
        return FALSE;
 }
 
@@ -2134,16 +1860,21 @@ ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* l
        removed = rep.paths.size();
 
        if (removed == 0) {
-               ArdourMessage msg (editor, X_("cleanupresults"),
-                                  _("\
-No audio files were ready for cleanup\n\n\
-If this seems suprising, check for any existing\n\
-snapshots. These may still include regions that\n\
+               MessageDialog msgd (*editor,
+                                   _("No audio files were ready for cleanup"), 
+                                   true,
+                                   Gtk::MESSAGE_INFO,
+                                   (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE)  );
+               msgd.set_secondary_text (_("If this seems suprising, \n\
+check for any existing snapshots.\n\
+These may still include regions that\n\
 require some unused files to continue to exist."));
+       
+               msgd.run ();
                return;
        } 
 
-       ArdourDialog results (_("ardour: cleanup"), true);
+       ArdourDialog results (_("ardour: cleanup"), true, false);
        
        struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
            CleanupResultsModelColumns() { 
@@ -2155,34 +1886,45 @@ require some unused files to continue to exist."));
        };
 
        
-       Glib::RefPtr<Gtk::ListStore> results_model;
        CleanupResultsModelColumns results_columns;
+       Glib::RefPtr<Gtk::ListStore> results_model;
        Gtk::TreeView results_display;
        
        results_model = ListStore::create (results_columns);
        results_display.set_model (results_model);
        results_display.append_column (list_title, results_columns.visible_name);
+
+       results_display.set_name ("CleanupResultsList");
        results_display.set_headers_visible (true);
+       results_display.set_headers_clickable (false);
+       results_display.set_reorderable (false);
 
        Gtk::ScrolledWindow list_scroller;
        Gtk::Label txt;
+       Gtk::VBox dvbox;
+       Gtk::HBox dhbox;  // the hbox for the image and text
+       Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
+       Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO,  Gtk::ICON_SIZE_DIALOG));
+
+       dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
 
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
+                 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
                }
        } else {
                if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
                }
        }
 
-       results.get_vbox()->pack_start (txt, false, false);
-       
+       dhbox.pack_start (*dimage, true, false, 5);
+       dhbox.pack_start (txt, true, false, 5);
+
        for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
                TreeModel::Row row = *(results_model->append());
                row[results_columns.visible_name] = *i;
@@ -2190,14 +1932,22 @@ require some unused files to continue to exist."));
        }
        
        list_scroller.add (results_display);
-       list_scroller.set_size_request (-1, 250);
+       list_scroller.set_size_request (-1, 150);
        list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-       
-       results.get_vbox()->pack_start (list_scroller, true, true);
-       results.add_button (Stock::OK, RESPONSE_ACCEPT);
+
+       dvbox.pack_start (dhbox, true, false, 5);
+       dvbox.pack_start (list_scroller, true, false, 5);
+       ddhbox.pack_start (dvbox, true, false, 5);
+
+       results.get_vbox()->pack_start (ddhbox, true, false, 5);
+       results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
+       results.set_default_response (RESPONSE_CLOSE);
        results.set_position (Gtk::WIN_POS_MOUSE);
+       results.show_all_children ();
+       results.set_resizable (false);
 
        results.run ();
+
 }
 
 void
@@ -2208,15 +1958,20 @@ ARDOUR_UI::cleanup ()
                return;
        }
 
-       ArdourDialog checker (_("ardour cleanup"));
-       Gtk::Label label (_("\
-Cleanup is a destructive operation.\n\
+
+       MessageDialog  checker (_("Are you sure you want to cleanup?"),
+                               true,
+                               Gtk::MESSAGE_QUESTION,
+                               (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
+
+       checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
 ALL undo/redo information will be lost if you cleanup.\n\
-Unused audio files will be moved to a \"dead sounds\" location."));
+After cleanup, unused audio files will be moved to a \
+\"dead sounds\" location."));
        
-       checker.get_vbox()->pack_start (label, false, false);
-       checker.add_button (Stock::OK, RESPONSE_ACCEPT);
        checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+       checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
+       checker.set_default_response (RESPONSE_CANCEL);
 
        checker.set_name (_("CleanupDialog"));
        checker.set_wmclass (_("ardour_cleanup"), "Ardour");
@@ -2236,14 +1991,16 @@ Unused audio files will be moved to a \"dead sounds\" location."));
        if (session->cleanup_sources (rep)) {
                return;
        }
-
+       checker.hide();
        display_cleanup_results (rep, 
                                 _("cleaned files"),
                                 _("\
-The following %1 %2 were not in use.\n\
-The next time you flush the wastebasket\n\
-it will release an additional %3 %4bytes\n\
-of disk space"
+The following %1 %2 not in use and \n\
+have been moved to:\n\
+%3. \n\n\
+Flushing the wastebasket will \n\
+release an additional\n\
+%4 %5bytes of disk space.\n"
                                         ));
 }
 
@@ -2263,7 +2020,9 @@ ARDOUR_UI::flush_trash ()
 
        display_cleanup_results (rep, 
                                 _("deleted file"),
-                                _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
+                                _("The following %1 %2 deleted from\n\
+%3,\n\
+releasing %4 %5bytes of disk space"));
 }
 
 void
@@ -2318,7 +2077,7 @@ ARDOUR_UI::add_route ()
 
        while (count) {
                if (track) {
-                       session_add_audio_track (input_chan, output_chan);
+                       session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
                } else {
                        session_add_audio_bus (input_chan, output_chan);
                }
@@ -2338,7 +2097,7 @@ ARDOUR_UI::mixer_settings () const
        if (session) {
                node = session->instant_xml(X_("Mixer"), session->path());
        } else {
-               node = Config->instant_xml(X_("Mixer"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -2356,7 +2115,7 @@ ARDOUR_UI::editor_settings () const
        if (session) {
                node = session->instant_xml(X_("Editor"), session->path());
        } else {
-               node = Config->instant_xml(X_("Editor"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -2383,8 +2142,9 @@ ARDOUR_UI::halt_on_xrun_message ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
 
-       ArdourMessage msg (editor, X_("haltonxrun"),
+       MessageDialog msg (*editor,
                           _("Recording was stopped because your system could not keep up."));
+       msg.run ();
 }
 
 void 
@@ -2406,12 +2166,13 @@ ARDOUR_UI::disk_overrun_handler ()
 
        if (!have_disk_overrun_displayed) {
                have_disk_overrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate dialog"), _("\
+               MessageDialog msg (*editor, X_("diskrate dialog"), _("\
 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;
        }
 }
@@ -2423,12 +2184,13 @@ ARDOUR_UI::disk_underrun_handler ()
 
        if (!have_disk_underrun_displayed) {
                have_disk_underrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate2 dialog"),
+               MessageDialog msg (*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\
 quickly enough to keep up with playback.\n")));
+               msg.run ();
                have_disk_underrun_displayed = false;
        } 
 }
@@ -2467,22 +2229,19 @@ what you would like to do.\n"));
        
        switch (dialog.run ()) {
        case RESPONSE_ACCEPT:
-               break;
-       default:
                return 1;
+       default:
+               return 0;
        }
-
-       return 0;
 }
        
-       
 void
 ARDOUR_UI::disconnect_from_jack ()
 {
        if (engine) {
                if( engine->disconnect_from_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not disconnect from JACK"));
+                       MessageDialog msg (*editor, _("Could not disconnect from JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -2494,8 +2253,8 @@ ARDOUR_UI::reconnect_to_jack ()
 {
        if (engine) {
                if (engine->reconnect_to_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not reconnect to JACK"));
+                       MessageDialog msg (*editor,  _("Could not reconnect to JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -2528,3 +2287,118 @@ ARDOUR_UI::cmdline_new_session (string path)
        _will_create_new_session_automatically = false; /* done it */
        return FALSE; /* don't call it again */
 }
+
+void
+ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (hf) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       case CAF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
+               break;
+       case AIFF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
+                       Config->set_native_file_header_format (hf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (sf) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+
+               if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
+                       Config->set_native_file_data_format (sf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::use_config ()
+{
+       Glib::RefPtr<Action> act;
+
+       switch (Config->get_native_file_data_format ()) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+
+       switch (Config->get_native_file_header_format ()) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       case CAF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
+               break;
+       case AIFF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+}