X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=gtk2_ardour%2Fardour_ui.cc;h=169b150d70db835f31488e34b1b837e2cc690505;hb=3129b822b041b423485a4f2f54aed0963c886bdd;hp=7b2dfcdf446fee8ae1c9d3d5e62dcfc3469856e5;hpb=d20534e846dbbf3b039903e94741f38c9b238a9a;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 7b2dfcdf44..169b150d70 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -28,13 +28,15 @@ #include +#include +#include + #include #include #include #include #include #include -#include #include #include #include @@ -58,7 +60,6 @@ #include "actions.h" #include "ardour_ui.h" -#include "ardour_message.h" #include "public_editor.h" #include "audio_clock.h" #include "keyboard.h" @@ -71,7 +72,7 @@ #include "about.h" #include "utils.h" #include "gui_thread.h" -#include "meter_xpms.h" +#include "color_manager.h" #include "i18n.h" @@ -87,19 +88,6 @@ sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; sigc::signal ARDOUR_UI::Clock; -static const char* channel_setup_names[] = { - "mono", - "stereo", - "3 channels", - "4 channels", - "5 channels", - "8 channels", - "manual setup", - 0 -}; - -vector channel_combo_strings; - ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile), @@ -142,11 +130,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) 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,7 +138,15 @@ 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"); + color_manager->load (color_file); + 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); @@ -184,6 +176,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); @@ -203,8 +196,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) 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 */ } @@ -220,7 +211,8 @@ because it has no input connections.\n\ You would be wasting space recording silence."), ds->name()); - ArdourMessage message (editor, X_("cannotrecord"), msg); + MessageDialog message (*editor, msg); + message.run (); } void @@ -236,10 +228,22 @@ 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); + string meter_path; + + meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps"); + if (meter_path.empty()) { + error << _("no vertical meter strip image found") << endmsg; + exit (1); + } + FastMeter::set_vertical_xpm (meter_path); + + meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps"); + if (meter_path.empty()) { + error << _("no horizontal meter strip image found") << endmsg; + exit (1); + } + FastMeter::set_horizontal_xpm (meter_path); if (setup_windows ()) { throw failed_constructor (); @@ -267,6 +271,10 @@ 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); @@ -373,9 +381,13 @@ ARDOUR_UI::save_ardour_state () 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 +415,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; @@ -423,15 +436,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 +462,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 +508,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; @@ -554,20 +563,6 @@ ARDOUR_UI::update_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 () { @@ -687,22 +682,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); - } -} - gint ARDOUR_UI::session_menu (GdkEventButton *ev) { @@ -790,12 +769,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); @@ -806,6 +788,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 () { @@ -919,7 +907,7 @@ 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; @@ -930,7 +918,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 { @@ -953,11 +941,12 @@ 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 (); } } @@ -986,6 +975,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); @@ -1061,14 +1067,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); } } } @@ -1235,14 +1242,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 () { @@ -1295,12 +1294,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 @@ -1530,10 +1530,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()) { @@ -1681,7 +1683,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); @@ -1700,15 +1704,36 @@ 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->set_modal(true); m_new_session_dialog->set_name(predetermined_path); int response = Gtk::RESPONSE_CANCEL; do { response = m_new_session_dialog->run (); - - if(response == Gtk::RESPONSE_OK) { + if(response == Gtk::RESPONSE_CANCEL) { + quit(); + return; + } 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; @@ -1774,11 +1799,21 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) nphysin, nphysout, engine->frame_rate() * 60 * 5); - } + } + } } - + } while(response == Gtk::RESPONSE_HELP); m_new_session_dialog->hide_all(); + show(); + +} + +void +ARDOUR_UI::close_session() +{ + unload_session(); + new_session (); } int @@ -1798,9 +1833,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; } @@ -1830,6 +1866,8 @@ ARDOUR_UI::make_session_clean () session->set_clean (); } + show (); + return FALSE; } @@ -1918,16 +1956,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() { @@ -1939,34 +1982,45 @@ require some unused files to continue to exist.")); }; - Glib::RefPtr results_model; CleanupResultsModelColumns results_columns; + Glib::RefPtr 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::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) { TreeModel::Row row = *(results_model->append()); row[results_columns.visible_name] = *i; @@ -1974,14 +2028,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 @@ -1992,15 +2054,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"); @@ -2020,14 +2087,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" )); } @@ -2047,7 +2116,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 @@ -2102,7 +2173,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); } @@ -2122,7 +2193,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) { @@ -2140,7 +2211,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) { @@ -2167,8 +2238,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 @@ -2190,12 +2262,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; } } @@ -2207,12 +2280,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; } } @@ -2251,22 +2325,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); @@ -2278,8 +2349,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); @@ -2312,3 +2383,106 @@ 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 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; + } + + if (act) { + Glib::RefPtr ract = Glib::RefPtr::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 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 ract = Glib::RefPtr::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 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 ract = Glib::RefPtr::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; + } + + if (act) { + Glib::RefPtr ract = Glib::RefPtr::cast_dynamic(act); + ract->set_active (); + } +}