2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/port.h>
50 #include <ardour/audioengine.h>
51 #include <ardour/playlist.h>
52 #include <ardour/utils.h>
53 #include <ardour/audio_diskstream.h>
54 #include <ardour/audiofilesource.h>
55 #include <ardour/recent_sessions.h>
56 #include <ardour/session_diskstream.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
59 #include <ardour/midi_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 using namespace ARDOUR;
81 using namespace Gtkmm2ext;
85 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
87 sigc::signal<void,bool> ARDOUR_UI::Blink;
88 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
89 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
90 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
92 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
94 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
96 primary_clock (X_("TransportClockDisplay"), true, false, true),
97 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
98 preroll_clock (X_("PreRollClock"), true, true),
99 postroll_clock (X_("PostRollClock"), true, true),
103 adjuster_table (3, 3),
107 preroll_button (_("pre\nroll")),
108 postroll_button (_("post\nroll")),
112 big_clock ("BigClockDisplay", true),
116 time_master_button (_("time\nmaster")),
118 shuttle_units_button (_("% ")),
120 punch_in_button (_("Punch In")),
121 punch_out_button (_("Punch Out")),
122 auto_return_button (_("Auto Return")),
123 auto_play_button (_("Autuo Play")),
124 auto_input_button (_("Auto Input")),
125 click_button (_("Click")),
126 auditioning_alert_button (_("AUDITION")),
127 solo_alert_button (_("SOLO")),
131 using namespace Gtk::Menu_Helpers;
137 if (theArdourUI == 0) {
141 ActionManager::init ();
145 color_manager = new ColorManager();
147 std::string color_file = ARDOUR::find_config_file("ardour.colors");
149 color_manager->load (color_file);
151 m_new_session_dialog = new NewSessionDialog();
155 _session_is_new = false;
156 big_clock_window = 0;
157 session_selector_window = 0;
158 last_key_press_time = 0;
159 connection_editor = 0;
160 add_route_dialog = 0;
165 open_session_selector = 0;
166 have_configure_timeout = false;
167 have_disk_overrun_displayed = false;
168 have_disk_underrun_displayed = false;
169 _will_create_new_session_automatically = false;
170 session_loaded = false;
171 last_speed_displayed = -1.0f;
173 last_configure_time.tv_sec = 0;
174 last_configure_time.tv_usec = 0;
176 shuttle_grabbed = false;
178 shuttle_max_speed = 8.0f;
180 set_shuttle_units (Percentage);
181 set_shuttle_behaviour (Sprung);
183 shuttle_style_menu = 0;
184 shuttle_unit_menu = 0;
186 gettimeofday (&last_peak_grab, 0);
187 gettimeofday (&last_shuttle_request, 0);
189 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
190 ARDOUR::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
191 ARDOUR::AudioDiskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
193 /* handle pending state with a dialog */
195 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
197 /* have to wait for AudioEngine and Configuration before proceeding */
201 ARDOUR_UI::set_engine (AudioEngine& e)
205 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
206 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
207 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
208 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
212 keyboard = new Keyboard;
214 if (setup_windows ()) {
215 throw failed_constructor ();
218 if (GTK_ARDOUR::show_key_actions) {
219 vector<string> names;
220 vector<string> paths;
222 vector<AccelKey> bindings;
224 ActionManager::get_all_actions (names, paths, keys, bindings);
226 vector<string>::iterator n;
227 vector<string>::iterator k;
228 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
229 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
235 /* start with timecode, metering enabled
238 blink_timeout_tag = -1;
240 /* the global configuration object is now valid */
244 /* this being a GUI and all, we want peakfiles */
246 AudioFileSource::set_build_peakfiles (true);
247 AudioFileSource::set_build_missing_peakfiles (true);
249 if (AudioSource::start_peak_thread ()) {
250 throw failed_constructor();
253 /* start the time-of-day-clock */
255 update_wall_clock ();
256 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
258 update_disk_space ();
260 update_sample_rate (engine->frame_rate());
262 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
263 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
266 ARDOUR_UI::~ARDOUR_UI ()
268 save_ardour_state ();
282 if (add_route_dialog) {
283 delete add_route_dialog;
286 AudioSource::stop_peak_thread ();
290 ARDOUR_UI::configure_timeout ()
295 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
296 /* no configure events yet */
300 gettimeofday (&now, 0);
301 timersub (&now, &last_configure_time, &diff);
303 /* force a gap of 0.5 seconds since the last configure event
306 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
309 have_configure_timeout = false;
310 save_ardour_state ();
316 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
318 if (have_configure_timeout) {
319 gettimeofday (&last_configure_time, 0);
321 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
322 have_configure_timeout = true;
329 ARDOUR_UI::save_ardour_state ()
331 if (!keyboard || !mixer || !editor) {
335 /* XXX this is all a bit dubious. add_extra_xml() uses
336 a different lifetime model from add_instant_xml().
339 XMLNode* node = new XMLNode (keyboard->get_state());
340 Config->add_extra_xml (*node);
341 Config->save_state();
343 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
344 XMLNode& mnode (mixer->get_state());
347 session->add_instant_xml(enode, session->path());
348 session->add_instant_xml(mnode, session->path());
350 Config->add_instant_xml(enode, get_user_ardour_path());
351 Config->add_instant_xml(mnode, get_user_ardour_path());
356 AccelMap::save ("ardour.saved_bindings");
360 ARDOUR_UI::startup ()
362 /* Once the UI is up and running, start the audio engine. Doing
363 this before the UI is up and running can cause problems
364 when not running with SCHED_FIFO, because the amount of
365 CPU and disk work needed to get the UI started can interfere
366 with the scheduling of the audio thread.
369 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
375 if (session && session->dirty()) {
376 switch (ask_about_saving_session(_("quit"))) {
381 /* use the default name */
382 if (save_state_canfail ("")) {
383 /* failed - don't quit */
384 MessageDialog msg (*editor,
386 Ardour was unable to save your session.\n\n\
387 If you still wish to quit, please use the\n\n\
388 \"Just quit\" option."));
397 Config->save_state();
402 ARDOUR_UI::ask_about_saving_session (const string & what)
404 ArdourDialog window (_("ardour: save session?"));
405 Gtk::HBox dhbox; // the hbox for the image and text
406 Gtk::Label prompt_label;
407 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
411 msg = string_compose(_("Don't %1"), what);
412 window.add_button (msg, RESPONSE_REJECT);
413 msg = string_compose(_("Just %1"), what);
414 window.add_button (msg, RESPONSE_APPLY);
415 msg = string_compose(_("Save and %1"), what);
416 window.add_button (msg, RESPONSE_ACCEPT);
418 window.set_default_response (RESPONSE_ACCEPT);
420 Gtk::Button noquit_button (msg);
421 noquit_button.set_name ("EditorGTKButton");
426 if (session->snap_name() == session->name()) {
429 type = _("snapshot");
431 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?"),
432 type, session->snap_name());
434 prompt_label.set_text (prompt);
435 prompt_label.set_name (X_("PrompterLabel"));
436 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
438 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
440 dhbox.set_homogeneous (false);
441 dhbox.pack_start (*dimage, false, false, 5);
442 dhbox.pack_start (prompt_label, true, false, 5);
443 window.get_vbox()->pack_start (dhbox);
445 window.set_name (_("Prompter"));
446 window.set_position (Gtk::WIN_POS_MOUSE);
447 window.set_modal (true);
448 window.set_resizable (false);
451 save_the_session = 0;
453 editor->ensure_float (window);
455 ResponseType r = (ResponseType) window.run();
460 case RESPONSE_ACCEPT: // save and get out of here
462 case RESPONSE_APPLY: // get out of here
472 ARDOUR_UI::every_second ()
475 update_buffer_load ();
476 update_disk_space ();
481 ARDOUR_UI::every_point_one_seconds ()
483 update_speed_display ();
484 RapidScreenUpdate(); /* EMIT_SIGNAL */
489 ARDOUR_UI::every_point_zero_one_seconds ()
491 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
496 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
500 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
502 if (!engine->connected()) {
504 snprintf (buf, sizeof (buf), _("disconnected"));
508 jack_nframes_t rate = engine->frame_rate();
510 if (fmod (rate, 1000.0) != 0.0) {
511 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
512 (float) rate/1000.0f,
513 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
515 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
517 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
521 sample_rate_label.set_text (buf);
525 ARDOUR_UI::update_cpu_load ()
528 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
529 cpu_load_label.set_text (buf);
533 ARDOUR_UI::update_buffer_load ()
538 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
539 session->playback_load(), session->capture_load());
540 buffer_load_label.set_text (buf);
542 buffer_load_label.set_text ("");
547 ARDOUR_UI::count_recenabled_diskstreams (AudioDiskstream& ds)
549 if (ds.record_enabled()) {
550 rec_enabled_diskstreams++;
555 ARDOUR_UI::update_disk_space()
561 jack_nframes_t frames = session->available_capture_duration();
564 if (frames == max_frames) {
565 strcpy (buf, _("Disk: 24hrs+"));
570 jack_nframes_t fr = session->frame_rate();
572 if (session->actively_recording()){
574 rec_enabled_diskstreams = 0;
575 session->foreach_audio_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
577 if (rec_enabled_diskstreams) {
578 frames /= rec_enabled_diskstreams;
583 /* hmmm. shall we divide by the route count? or the diskstream count?
584 or what? for now, do nothing ...
589 hrs = frames / (fr * 3600);
590 frames -= hrs * fr * 3600;
591 mins = frames / (fr * 60);
592 frames -= mins * fr * 60;
595 snprintf (buf, sizeof(buf), _("Space: %02dh:%02dm:%02ds"), hrs, mins, secs);
598 disk_space_label.set_text (buf);
602 ARDOUR_UI::update_wall_clock ()
609 tm_now = localtime (&now);
611 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
612 wall_clock_label.set_text (buf);
617 ARDOUR_UI::control_methods_adjusted ()
622 which_method = (int) online_control_button->adjustment.get_value();
623 switch (which_method) {
625 allow_mmc_and_local ();
634 fatal << _("programming error: impossible control method") << endmsg;
640 ARDOUR_UI::mmc_device_id_adjusted ()
645 int dev_id = (int) mmc_id_button->adjustment.get_value();
646 mmc->set_device_id (dev_id);
652 ARDOUR_UI::session_menu (GdkEventButton *ev)
654 session_popup_menu->popup (0, 0);
659 ARDOUR_UI::redisplay_recent_sessions ()
661 vector<string *> *sessions;
662 vector<string *>::iterator i;
663 RecentSessionsSorter cmp;
665 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
666 recent_session_model->clear ();
669 ARDOUR::read_recent_sessions (rs);
672 recent_session_display.set_model (recent_session_model);
676 /* sort them alphabetically */
677 sort (rs.begin(), rs.end(), cmp);
678 sessions = new vector<string*>;
680 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
681 sessions->push_back (new string ((*i).second));
684 for (i = sessions->begin(); i != sessions->end(); ++i) {
686 vector<string*>* states;
687 vector<const gchar*> item;
688 string fullpath = *(*i);
690 /* remove any trailing / */
692 if (fullpath[fullpath.length()-1] == '/') {
693 fullpath = fullpath.substr (0, fullpath.length()-1);
696 /* now get available states for this session */
698 if ((states = Session::possible_states (fullpath)) == 0) {
703 TreeModel::Row row = *(recent_session_model->append());
705 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
706 row[recent_session_columns.fullpath] = fullpath;
708 if (states->size() > 1) {
710 /* add the children */
712 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
714 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
716 child_row[recent_session_columns.visible_name] = **i2;
717 child_row[recent_session_columns.fullpath] = fullpath;
726 recent_session_display.set_model (recent_session_model);
731 ARDOUR_UI::build_session_selector ()
733 session_selector_window = new ArdourDialog ("session selector");
735 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
737 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
738 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
739 session_selector_window->set_default_response (RESPONSE_ACCEPT);
740 recent_session_model = TreeStore::create (recent_session_columns);
741 recent_session_display.set_model (recent_session_model);
742 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
743 recent_session_display.set_headers_visible (false);
744 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
746 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
748 scroller->add (recent_session_display);
749 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
751 session_selector_window->set_name ("SessionSelectorWindow");
752 session_selector_window->set_size_request (200, 400);
753 session_selector_window->get_vbox()->pack_start (*scroller);
754 session_selector_window->show_all_children();
758 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
760 session_selector_window->response (RESPONSE_ACCEPT);
764 ARDOUR_UI::open_recent_session ()
766 /* popup selector window */
768 if (session_selector_window == 0) {
769 build_session_selector ();
772 redisplay_recent_sessions ();
774 ResponseType r = (ResponseType) session_selector_window->run ();
776 session_selector_window->hide();
779 case RESPONSE_ACCEPT:
785 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
787 if (i == recent_session_model->children().end()) {
791 Glib::ustring path = (*i)[recent_session_columns.fullpath];
792 Glib::ustring state = (*i)[recent_session_columns.visible_name];
794 _session_is_new = false;
796 load_session (path, state);
800 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
804 if (stat (info.filename.c_str(), &statbuf) != 0) {
808 if (!S_ISDIR(statbuf.st_mode)) {
814 string session_file = info.filename;
816 session_file += Glib::path_get_basename (info.filename);
817 session_file += ".ardour";
819 if (stat (session_file.c_str(), &statbuf) != 0) {
823 return S_ISREG (statbuf.st_mode);
827 ARDOUR_UI::open_session ()
829 /* popup selector window */
831 if (open_session_selector == 0) {
833 /* ardour sessions are folders */
835 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
836 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
837 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
839 FileFilter session_filter;
840 session_filter.add_pattern ("*.ardour");
841 session_filter.set_name (_("Ardour sessions"));
842 open_session_selector->add_filter (session_filter);
843 open_session_selector->set_filter (session_filter);
846 int response = open_session_selector->run();
847 open_session_selector->hide ();
850 case RESPONSE_ACCEPT:
853 open_session_selector->hide();
857 open_session_selector->hide();
858 string session_path = open_session_selector->get_filename();
862 if (session_path.length() > 0) {
863 if (Session::find_session (session_path, path, name, isnew) == 0) {
864 _session_is_new = isnew;
865 load_session (path, name);
872 ARDOUR_UI::session_add_midi_route (bool disk)
877 warning << _("You cannot add a track without a session already loaded.") << endmsg;
883 if ((route = session->new_midi_track ()) == 0) {
884 error << _("could not create new MIDI track") << endmsg;
887 if ((route = session->new_midi_route ()) == 0) {
888 error << _("could not create new MIDI bus") << endmsg;
893 if (need_control_room_outs) {
899 route->set_stereo_control_outs (control_lr_channels);
900 route->control_outs()->set_stereo_pan (pans, this);
902 #endif /* CONTROLOUTS */
907 MessageDialog msg (*editor,
908 _("There are insufficient JACK ports available\n\
909 to create a new track or bus.\n\
910 You should save Ardour, exit and\n\
911 restart JACK with more ports."));
918 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
923 warning << _("You cannot add a track without a session already loaded.") << endmsg;
929 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
930 error << _("could not create new audio track") << endmsg;
933 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
934 error << _("could not create new audio bus") << endmsg;
939 if (need_control_room_outs) {
945 route->set_stereo_control_outs (control_lr_channels);
946 route->control_outs()->set_stereo_pan (pans, this);
948 #endif /* CONTROLOUTS */
952 MessageDialog msg (*editor,
953 _("There are insufficient JACK ports available\n\
954 to create a new track or bus.\n\
955 You should save Ardour, exit and\n\
956 restart JACK with more ports."));
962 ARDOUR_UI::diskstream_added (Diskstream* ds)
967 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
969 jack_nframes_t _preroll;
972 _preroll = session->convert_to_frames_at (new_position, session->preroll);
974 if (new_position > _preroll) {
975 new_position -= _preroll;
980 session->request_locate (new_position);
985 ARDOUR_UI::transport_goto_start ()
988 session->goto_start();
991 /* force displayed area in editor to start no matter
992 what "follow playhead" setting is.
996 editor->reposition_x_origin (session->current_start_frame());
1002 ARDOUR_UI::transport_goto_zero ()
1005 session->request_locate (0);
1008 /* force displayed area in editor to start no matter
1009 what "follow playhead" setting is.
1013 editor->reposition_x_origin (0);
1019 ARDOUR_UI::transport_goto_end ()
1022 jack_nframes_t frame = session->current_end_frame();
1023 session->request_locate (frame);
1025 /* force displayed area in editor to start no matter
1026 what "follow playhead" setting is.
1030 editor->reposition_x_origin (frame);
1036 ARDOUR_UI::transport_stop ()
1042 if (session->is_auditioning()) {
1043 session->cancel_audition ();
1047 if (session->get_auto_loop()) {
1048 session->request_auto_loop (false);
1051 session->request_stop ();
1055 ARDOUR_UI::transport_stop_and_forget_capture ()
1058 session->request_stop (true);
1063 ARDOUR_UI::remove_last_capture()
1066 editor->remove_last_capture();
1071 ARDOUR_UI::transport_record ()
1074 switch (session->record_status()) {
1075 case Session::Disabled:
1076 if (session->ntracks() == 0) {
1077 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1078 MessageDialog msg (*editor, txt);
1082 session->maybe_enable_record ();
1084 case Session::Recording:
1085 case Session::Enabled:
1086 session->disable_record (true);
1092 ARDOUR_UI::transport_roll ()
1100 rolling = session->transport_rolling ();
1102 if (session->get_auto_loop()) {
1103 session->request_auto_loop (false);
1104 auto_loop_button.set_active (false);
1105 roll_button.set_active (true);
1106 } else if (session->get_play_range ()) {
1107 session->request_play_range (false);
1108 play_selection_button.set_active (false);
1109 } else if (rolling) {
1110 session->request_locate (session->last_transport_start(), true);
1113 session->request_transport_speed (1.0f);
1117 ARDOUR_UI::transport_loop()
1120 if (session->get_auto_loop()) {
1121 if (session->transport_rolling()) {
1122 Location * looploc = session->locations()->auto_loop_location();
1124 session->request_locate (looploc->start(), true);
1129 session->request_auto_loop (true);
1135 ARDOUR_UI::transport_play_selection ()
1141 if (!session->get_play_range()) {
1142 session->request_stop ();
1145 editor->play_selection ();
1149 ARDOUR_UI::transport_rewind (int option)
1151 float current_transport_speed;
1154 current_transport_speed = session->transport_speed();
1156 if (current_transport_speed >= 0.0f) {
1159 session->request_transport_speed (-1.0f);
1162 session->request_transport_speed (-4.0f);
1165 session->request_transport_speed (-0.5f);
1170 session->request_transport_speed (current_transport_speed * 1.5f);
1176 ARDOUR_UI::transport_forward (int option)
1178 float current_transport_speed;
1181 current_transport_speed = session->transport_speed();
1183 if (current_transport_speed <= 0.0f) {
1186 session->request_transport_speed (1.0f);
1189 session->request_transport_speed (4.0f);
1192 session->request_transport_speed (0.5f);
1197 session->request_transport_speed (current_transport_speed * 1.5f);
1203 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1211 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1212 AudioDiskstream *ads = dynamic_cast<AudioDiskstream*>(ds);
1214 Port *port = ds->io()->input (0);
1215 port->request_monitor_input (!port->monitoring_input());
1221 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1229 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1230 ds->set_record_enabled (!ds->record_enabled(), this);
1235 ARDOUR_UI::queue_transport_change ()
1237 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1241 ARDOUR_UI::map_transport_state ()
1243 float sp = session->transport_speed();
1246 transport_rolling ();
1247 } else if (sp < 0.0f) {
1248 transport_rewinding ();
1249 } else if (sp > 0.0f) {
1250 transport_forwarding ();
1252 transport_stopped ();
1257 ARDOUR_UI::allow_local_only ()
1263 ARDOUR_UI::allow_mmc_only ()
1269 ARDOUR_UI::allow_mmc_and_local ()
1275 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1277 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1278 (int) adj.get_value()].c_str());
1282 ARDOUR_UI::engine_stopped ()
1284 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1285 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1286 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1291 ARDOUR_UI::engine_running ()
1293 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1294 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1295 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1299 ARDOUR_UI::engine_halted ()
1301 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1303 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1304 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1306 update_sample_rate (0);
1308 MessageDialog msg (*editor,
1310 JACK has either been shutdown or it\n\
1311 disconnected Ardour because Ardour\n\
1312 was not fast enough. You can save the\n\
1313 session and/or try to reconnect to JACK ."));
1318 ARDOUR_UI::do_engine_start ()
1324 catch (AudioEngine::PortRegistrationFailure& err) {
1326 error << _("Unable to create all required ports")
1334 error << _("Unable to start the session running")
1344 ARDOUR_UI::start_engine ()
1346 if (do_engine_start () == 0) {
1347 if (session && _session_is_new) {
1348 /* we need to retain initial visual
1349 settings for a new session
1351 session->save_state ("");
1354 /* there is too much going on, in too many threads, for us to
1355 end up with a clean session. So wait 1 second after loading,
1356 and fix it up. its ugly, but until i come across a better
1357 solution, its what we have.
1360 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1367 ARDOUR_UI::update_clocks ()
1369 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1373 ARDOUR_UI::start_clocking ()
1375 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1379 ARDOUR_UI::stop_clocking ()
1381 clock_signal_connection.disconnect ();
1385 ARDOUR_UI::toggle_clocking ()
1388 if (clock_button.get_active()) {
1397 ARDOUR_UI::_blink (void *arg)
1400 ((ARDOUR_UI *) arg)->blink ();
1407 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1411 ARDOUR_UI::start_blinking ()
1413 /* Start the blink signal. Everybody with a blinking widget
1414 uses Blink to drive the widget's state.
1417 if (blink_timeout_tag < 0) {
1419 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1424 ARDOUR_UI::stop_blinking ()
1426 if (blink_timeout_tag >= 0) {
1427 gtk_timeout_remove (blink_timeout_tag);
1428 blink_timeout_tag = -1;
1434 ARDOUR_UI::add_diskstream_to_menu (AudioDiskstream& dstream)
1436 using namespace Gtk;
1437 using namespace Menu_Helpers;
1439 if (dstream.hidden()) {
1443 MenuList& items = diskstream_menu->items();
1444 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1448 ARDOUR_UI::diskstream_selected (gint32 id)
1450 selected_dstream = id;
1455 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1457 using namespace Gtk;
1458 using namespace Menu_Helpers;
1464 diskstream_menu = new Menu();
1465 diskstream_menu->set_name ("ArdourContextMenu");
1466 using namespace Gtk;
1467 using namespace Menu_Helpers;
1469 MenuList& items = diskstream_menu->items();
1470 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1472 session->foreach_audio_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1475 diskstream_menu->popup (ev->button, ev->time);
1477 diskstream_menu->popup (0, 0);
1480 selected_dstream = -1;
1484 delete diskstream_menu;
1486 return selected_dstream;
1490 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1496 if (io.n_inputs() == 0) {
1501 /* XXX we're not handling multiple ports yet. */
1503 const char **connections = io.input(0)->get_connections();
1505 if (connections == 0 || connections[0] == '\0') {
1508 buf = connections[0];
1515 if (io.n_outputs() == 0) {
1520 /* XXX we're not handling multiple ports yet. */
1522 const char **connections = io.output(0)->get_connections();
1524 if (connections == 0 || connections[0] == '\0') {
1527 buf = connections[0];
1535 ARDOUR_UI::snapshot_session ()
1537 ArdourPrompter prompter (true);
1544 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1546 prompter.set_name ("Prompter");
1547 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1548 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1549 prompter.set_prompt (_("Name of New Snapshot"));
1550 prompter.set_initial_text (now);
1552 switch (prompter.run()) {
1553 case RESPONSE_ACCEPT:
1554 prompter.get_result (snapname);
1555 if (snapname.length()){
1556 save_state (snapname);
1566 ARDOUR_UI::save_state (const string & name)
1568 (void) save_state_canfail (name);
1572 ARDOUR_UI::save_state_canfail (string name)
1577 if (name.length() == 0) {
1578 name = session->snap_name();
1581 if ((ret = session->save_state (name)) != 0) {
1585 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1590 ARDOUR_UI::restore_state (string name)
1593 if (name.length() == 0) {
1594 name = session->name();
1596 session->restore_state (name);
1601 ARDOUR_UI::primary_clock_value_changed ()
1604 session->request_locate (primary_clock.current_time ());
1609 ARDOUR_UI::secondary_clock_value_changed ()
1612 session->request_locate (secondary_clock.current_time ());
1617 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1619 if (session && dstream && dstream->record_enabled()) {
1621 Session::RecordState rs;
1623 rs = session->record_status ();
1626 case Session::Disabled:
1627 case Session::Enabled:
1628 if (w->get_state() != STATE_SELECTED) {
1629 w->set_state (STATE_SELECTED);
1633 case Session::Recording:
1634 if (w->get_state() != STATE_ACTIVE) {
1635 w->set_state (STATE_ACTIVE);
1641 if (w->get_state() != STATE_NORMAL) {
1642 w->set_state (STATE_NORMAL);
1648 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1654 switch (session->record_status()) {
1655 case Session::Enabled:
1657 rec_button.set_state (1);
1659 rec_button.set_state (0);
1663 case Session::Recording:
1664 rec_button.set_state (2);
1668 rec_button.set_state (0);
1674 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1682 ARDOUR_UI::start_keyboard_prefix ()
1684 keyboard->start_prefix();
1688 ARDOUR_UI::save_template ()
1691 ArdourPrompter prompter (true);
1694 prompter.set_name (X_("Prompter"));
1695 prompter.set_prompt (_("Name for mix template:"));
1696 prompter.set_initial_text(session->name() + _("-template"));
1697 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1698 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1700 switch (prompter.run()) {
1701 case RESPONSE_ACCEPT:
1702 prompter.get_result (name);
1704 if (name.length()) {
1705 session->save_template (name);
1715 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1717 m_new_session_dialog->show();
1718 m_new_session_dialog->set_modal(true);
1719 m_new_session_dialog->set_name(predetermined_path);
1720 m_new_session_dialog->reset_recent();
1722 int response = Gtk::RESPONSE_CANCEL;
1725 response = m_new_session_dialog->run ();
1726 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1730 } else if (response == Gtk::RESPONSE_NONE) {
1731 /* Clear was pressed */
1732 m_new_session_dialog->reset();
1734 } else if (response == Gtk::RESPONSE_YES) {
1735 /* YES == OPEN, but there's no enum for that */
1736 std::string session_name = m_new_session_dialog->session_name();
1737 std::string session_path = m_new_session_dialog->session_folder();
1738 load_session (session_path, session_name);
1741 } else if (response == Gtk::RESPONSE_OK) {
1742 if (m_new_session_dialog->get_current_page() == 1) {
1744 /* XXX this is a bit of a hack..
1745 i really want the new sesion dialog to return RESPONSE_YES
1746 if we're on page 1 (the load page)
1747 Unfortunately i can't see how atm..
1749 std::string session_name = m_new_session_dialog->session_name();
1750 std::string session_path = m_new_session_dialog->session_folder();
1751 load_session (session_path, session_name);
1755 _session_is_new = true;
1757 std::string session_name = m_new_session_dialog->session_name();
1758 std::string session_path = m_new_session_dialog->session_folder();
1761 //XXX This is needed because session constructor wants a
1762 //non-existant path. hopefully this will be fixed at some point.
1764 session_path = Glib::build_filename(session_path, session_name);
1766 std::string template_name = m_new_session_dialog->session_template_name();
1768 if (m_new_session_dialog->use_session_template()) {
1770 load_session (session_path, session_name, &template_name);
1776 Session::AutoConnectOption iconnect;
1777 Session::AutoConnectOption oconnect;
1779 if (m_new_session_dialog->create_control_bus()) {
1780 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1785 if (m_new_session_dialog->create_master_bus()) {
1786 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1791 if (m_new_session_dialog->connect_inputs()) {
1792 iconnect = Session::AutoConnectPhysical;
1794 iconnect = Session::AutoConnectOption (0);
1797 /// @todo some minor tweaks.
1799 if (m_new_session_dialog->connect_outs_to_master()) {
1800 oconnect = Session::AutoConnectMaster;
1801 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1802 oconnect = Session::AutoConnectPhysical;
1804 oconnect = Session::AutoConnectOption (0);
1807 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1808 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1810 build_session (session_path,
1818 engine->frame_rate() * 60 * 5);
1823 } while (response == Gtk::RESPONSE_NONE);
1824 m_new_session_dialog->hide();
1830 ARDOUR_UI::close_session()
1837 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1839 Session *new_session;
1841 session_loaded = false;
1842 x = unload_session ();
1850 /* if it already exists, we must have write access */
1852 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1853 MessageDialog msg (*editor, _("\
1854 You do not have write access to this session.\n\
1855 This prevents the session from being loaded."));
1861 new_session = new Session (*engine, path, snap_name, mix_template);
1866 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1870 connect_to_session (new_session);
1872 //if (engine->running()) {
1873 //mixer->show_window();
1875 session_loaded = true;
1880 ARDOUR_UI::make_session_clean ()
1883 session->set_clean ();
1892 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1893 uint32_t control_channels,
1894 uint32_t master_channels,
1895 Session::AutoConnectOption input_connect,
1896 Session::AutoConnectOption output_connect,
1899 jack_nframes_t initial_length)
1901 Session *new_session;
1904 session_loaded = false;
1905 x = unload_session ();
1912 _session_is_new = true;
1915 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1916 control_channels, master_channels, nphysin, nphysout, initial_length);
1921 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1925 connect_to_session (new_session);
1927 //if (engine->running()) {
1928 //mixer->show_window();
1930 session_loaded = true;
1938 editor->show_window ();
1942 if (session && mixer) {
1943 // mixer->show_window ();
1952 ARDOUR_UI::show_splash ()
1955 about = new About();
1961 ARDOUR_UI::hide_splash ()
1969 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1973 removed = rep.paths.size();
1976 MessageDialog msgd (*editor,
1977 _("No audio files were ready for cleanup"),
1980 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1981 msgd.set_secondary_text (_("If this seems suprising, \n\
1982 check for any existing snapshots.\n\
1983 These may still include regions that\n\
1984 require some unused files to continue to exist."));
1990 ArdourDialog results (_("ardour: cleanup"), true, false);
1992 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1993 CleanupResultsModelColumns() {
1997 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1998 Gtk::TreeModelColumn<Glib::ustring> fullpath;
2002 CleanupResultsModelColumns results_columns;
2003 Glib::RefPtr<Gtk::ListStore> results_model;
2004 Gtk::TreeView results_display;
2006 results_model = ListStore::create (results_columns);
2007 results_display.set_model (results_model);
2008 results_display.append_column (list_title, results_columns.visible_name);
2010 results_display.set_name ("CleanupResultsList");
2011 results_display.set_headers_visible (true);
2012 results_display.set_headers_clickable (false);
2013 results_display.set_reorderable (false);
2015 Gtk::ScrolledWindow list_scroller;
2018 Gtk::HBox dhbox; // the hbox for the image and text
2019 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
2020 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
2022 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
2024 if (rep.space < 1048576.0f) {
2026 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2028 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2032 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2034 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2038 dhbox.pack_start (*dimage, true, false, 5);
2039 dhbox.pack_start (txt, true, false, 5);
2041 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2042 TreeModel::Row row = *(results_model->append());
2043 row[results_columns.visible_name] = *i;
2044 row[results_columns.fullpath] = *i;
2047 list_scroller.add (results_display);
2048 list_scroller.set_size_request (-1, 150);
2049 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2051 dvbox.pack_start (dhbox, true, false, 5);
2052 dvbox.pack_start (list_scroller, true, false, 5);
2053 ddhbox.pack_start (dvbox, true, false, 5);
2055 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2056 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2057 results.set_default_response (RESPONSE_CLOSE);
2058 results.set_position (Gtk::WIN_POS_MOUSE);
2059 results.show_all_children ();
2060 results.set_resizable (false);
2067 ARDOUR_UI::cleanup ()
2070 /* shouldn't happen: menu item is insensitive */
2075 MessageDialog checker (_("Are you sure you want to cleanup?"),
2077 Gtk::MESSAGE_QUESTION,
2078 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2080 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2081 ALL undo/redo information will be lost if you cleanup.\n\
2082 After cleanup, unused audio files will be moved to a \
2083 \"dead sounds\" location."));
2085 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2086 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2087 checker.set_default_response (RESPONSE_CANCEL);
2089 checker.set_name (_("CleanupDialog"));
2090 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2091 checker.set_position (Gtk::WIN_POS_MOUSE);
2093 switch (checker.run()) {
2094 case RESPONSE_ACCEPT:
2100 Session::cleanup_report rep;
2102 editor->prepare_for_cleanup ();
2104 if (session->cleanup_sources (rep)) {
2108 display_cleanup_results (rep,
2111 The following %1 %2 not in use and \n\
2112 have been moved to:\n\
2114 Flushing the wastebasket will \n\
2115 release an additional\n\
2116 %4 %5bytes of disk space.\n"
2121 ARDOUR_UI::flush_trash ()
2124 /* shouldn't happen: menu item is insensitive */
2128 Session::cleanup_report rep;
2130 if (session->cleanup_trash_sources (rep)) {
2134 display_cleanup_results (rep,
2136 _("The following %1 %2 deleted from\n\
2138 releasing %4 %5bytes of disk space"));
2142 ARDOUR_UI::add_route ()
2150 if (add_route_dialog == 0) {
2151 add_route_dialog = new AddRouteDialog;
2152 editor->ensure_float (*add_route_dialog);
2155 if (add_route_dialog->is_visible()) {
2156 /* we're already doing this */
2160 ResponseType r = (ResponseType) add_route_dialog->run ();
2162 add_route_dialog->hide();
2165 case RESPONSE_ACCEPT:
2172 if ((count = add_route_dialog->count()) <= 0) {
2176 uint32_t input_chan = add_route_dialog->channels ();
2177 uint32_t output_chan;
2178 string name_template = add_route_dialog->name_template ();
2179 bool track = add_route_dialog->track ();
2181 Session::AutoConnectOption oac = session->get_output_auto_connect();
2183 if (oac & Session::AutoConnectMaster) {
2184 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2186 output_chan = input_chan;
2189 /* XXX do something with name template */
2192 if (track && add_route_dialog->midi()) {
2193 session_add_midi_track();
2194 } else if (add_route_dialog->midi()) {
2195 session_add_midi_bus();
2197 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2199 session_add_audio_bus (input_chan, output_chan);
2203 while (Main::events_pending()) {
2210 ARDOUR_UI::mixer_settings () const
2215 node = session->instant_xml(X_("Mixer"), session->path());
2217 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2221 node = new XMLNode (X_("Mixer"));
2228 ARDOUR_UI::editor_settings () const
2233 node = session->instant_xml(X_("Editor"), session->path());
2235 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2239 node = new XMLNode (X_("Editor"));
2245 ARDOUR_UI::keyboard_settings () const
2249 node = Config->extra_xml(X_("Keyboard"));
2252 node = new XMLNode (X_("Keyboard"));
2258 ARDOUR_UI::halt_on_xrun_message ()
2260 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2262 MessageDialog msg (*editor,
2263 _("Recording was stopped because your system could not keep up."));
2268 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2270 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2272 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2276 delete deletion_list;
2280 ARDOUR_UI::disk_overrun_handler ()
2282 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2284 if (!have_disk_overrun_displayed) {
2285 have_disk_overrun_displayed = true;
2286 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2287 The disk system on your computer\n\
2288 was not able to keep up with Ardour.\n\
2290 Specifically, it failed to write data to disk\n\
2291 quickly enough to keep up with recording.\n"));
2293 have_disk_overrun_displayed = false;
2298 ARDOUR_UI::disk_underrun_handler ()
2300 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2302 if (!have_disk_underrun_displayed) {
2303 have_disk_underrun_displayed = true;
2304 MessageDialog msg (*editor,
2305 (_("The disk system on your computer\n\
2306 was not able to keep up with Ardour.\n\
2308 Specifically, it failed to read data from disk\n\
2309 quickly enough to keep up with playback.\n")));
2311 have_disk_underrun_displayed = false;
2316 ARDOUR_UI::disk_underrun_message_gone ()
2318 have_disk_underrun_displayed = false;
2322 ARDOUR_UI::disk_overrun_message_gone ()
2324 have_disk_underrun_displayed = false;
2328 ARDOUR_UI::pending_state_dialog ()
2330 ArdourDialog dialog ("pending state dialog");
2332 This session appears to have been in\n\
2333 middle of recording when ardour or\n\
2334 the computer was shutdown.\n\
2336 Ardour can recover any captured audio for\n\
2337 you, or it can ignore it. Please decide\n\
2338 what you would like to do.\n"));
2340 dialog.get_vbox()->pack_start (message);
2341 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2342 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2344 dialog.set_position (WIN_POS_CENTER);
2347 switch (dialog.run ()) {
2348 case RESPONSE_ACCEPT:
2356 ARDOUR_UI::disconnect_from_jack ()
2359 if( engine->disconnect_from_jack ()) {
2360 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2364 update_sample_rate (0);
2369 ARDOUR_UI::reconnect_to_jack ()
2372 if (engine->reconnect_to_jack ()) {
2373 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2377 update_sample_rate (0);
2382 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2384 engine->request_buffer_size (nframes);
2385 update_sample_rate (0);
2389 ARDOUR_UI::cmdline_new_session (string path)
2391 if (path[0] != '/') {
2392 char buf[PATH_MAX+1];
2395 getcwd (buf, sizeof (buf));
2402 new_session (false, path);
2404 _will_create_new_session_automatically = false; /* done it */
2405 return FALSE; /* don't call it again */
2409 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2411 Glib::RefPtr<Action> act;
2415 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2418 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2421 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2424 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2427 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2430 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2433 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2438 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2439 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2440 Config->set_native_file_header_format (hf);
2442 session->reset_native_file_format ();
2449 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2451 Glib::RefPtr<Action> act;
2455 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2458 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2463 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2465 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2466 Config->set_native_file_data_format (sf);
2468 session->reset_native_file_format ();
2475 ARDOUR_UI::use_config ()
2477 Glib::RefPtr<Action> act;
2479 switch (Config->get_native_file_data_format ()) {
2481 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2484 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2489 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2490 ract->set_active ();
2493 switch (Config->get_native_file_header_format ()) {
2495 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2498 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2501 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2504 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2507 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2510 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2513 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2518 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2519 ract->set_active ();