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/diskstream.h>
54 #include <ardour/filesource.h>
55 #include <ardour/recent_sessions.h>
56 #include <ardour/session_diskstream.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
61 #include "ardour_ui.h"
62 #include "public_editor.h"
63 #include "audio_clock.h"
68 #include "keyboard_target.h"
69 #include "add_route_dialog.h"
70 #include "new_session_dialog.h"
73 #include "gui_thread.h"
74 #include "color_manager.h"
78 using namespace ARDOUR;
79 using namespace Gtkmm2ext;
83 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
85 sigc::signal<void,bool> ARDOUR_UI::Blink;
86 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
87 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
88 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
90 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
92 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
94 primary_clock (X_("TransportClockDisplay"), true, false, true),
95 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
96 preroll_clock (X_("PreRollClock"), true, true),
97 postroll_clock (X_("PostRollClock"), true, true),
101 adjuster_table (3, 3),
105 preroll_button (_("pre\nroll")),
106 postroll_button (_("post\nroll")),
110 big_clock ("BigClockDisplay", true),
114 time_master_button (_("time\nmaster")),
116 shuttle_units_button (_("% ")),
118 punch_in_button (_("punch\nin")),
119 punch_out_button (_("punch\nout")),
120 auto_return_button (_("auto\nreturn")),
121 auto_play_button (_("auto\nplay")),
122 auto_input_button (_("auto\ninput")),
123 click_button (_("click")),
124 auditioning_alert_button (_("AUDITIONING")),
125 solo_alert_button (_("SOLO")),
129 using namespace Gtk::Menu_Helpers;
135 if (theArdourUI == 0) {
139 ActionManager::init ();
143 color_manager = new ColorManager();
145 std::string color_file = ARDOUR::find_config_file("ardour.colors");
147 color_manager->load (color_file);
149 m_new_session_dialog = new NewSessionDialog();
153 _session_is_new = false;
154 big_clock_window = 0;
155 session_selector_window = 0;
156 last_key_press_time = 0;
157 connection_editor = 0;
158 add_route_dialog = 0;
163 open_session_selector = 0;
164 have_configure_timeout = false;
165 have_disk_overrun_displayed = false;
166 have_disk_underrun_displayed = false;
167 _will_create_new_session_automatically = false;
168 session_loaded = false;
169 last_speed_displayed = -1.0f;
171 last_configure_time.tv_sec = 0;
172 last_configure_time.tv_usec = 0;
174 shuttle_grabbed = false;
176 shuttle_max_speed = 8.0f;
178 set_shuttle_units (Percentage);
179 set_shuttle_behaviour (Sprung);
181 shuttle_style_menu = 0;
182 shuttle_unit_menu = 0;
184 gettimeofday (&last_peak_grab, 0);
185 gettimeofday (&last_shuttle_request, 0);
187 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
188 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
189 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
191 /* handle pending state with a dialog */
193 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
195 /* have to wait for AudioEngine and Configuration before proceeding */
199 ARDOUR_UI::set_engine (AudioEngine& e)
203 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
204 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
205 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
206 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
210 keyboard = new Keyboard;
214 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
215 if (meter_path.empty()) {
216 error << _("no vertical meter strip image found") << endmsg;
219 FastMeter::set_vertical_xpm (meter_path);
221 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
222 if (meter_path.empty()) {
223 error << _("no horizontal meter strip image found") << endmsg;
226 FastMeter::set_horizontal_xpm (meter_path);
228 if (setup_windows ()) {
229 throw failed_constructor ();
232 if (GTK_ARDOUR::show_key_actions) {
233 vector<string> names;
234 vector<string> paths;
236 vector<AccelKey> bindings;
238 ActionManager::get_all_actions (names, paths, keys, bindings);
240 vector<string>::iterator n;
241 vector<string>::iterator k;
242 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
243 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
249 /* start with timecode, metering enabled
252 blink_timeout_tag = -1;
254 /* the global configuration object is now valid */
258 /* this being a GUI and all, we want peakfiles */
260 FileSource::set_build_peakfiles (true);
261 FileSource::set_build_missing_peakfiles (true);
263 if (Source::start_peak_thread ()) {
264 throw failed_constructor();
267 /* start the time-of-day-clock */
269 update_wall_clock ();
270 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
272 update_disk_space ();
274 update_sample_rate (engine->frame_rate());
276 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
277 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
280 ARDOUR_UI::~ARDOUR_UI ()
282 save_ardour_state ();
296 if (add_route_dialog) {
297 delete add_route_dialog;
300 Source::stop_peak_thread ();
304 ARDOUR_UI::configure_timeout ()
309 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
310 /* no configure events yet */
314 gettimeofday (&now, 0);
315 timersub (&now, &last_configure_time, &diff);
317 /* force a gap of 0.5 seconds since the last configure event
320 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
323 have_configure_timeout = false;
324 save_ardour_state ();
330 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
332 if (have_configure_timeout) {
333 gettimeofday (&last_configure_time, 0);
335 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
336 have_configure_timeout = true;
343 ARDOUR_UI::save_ardour_state ()
345 if (!keyboard || !mixer || !editor) {
349 /* XXX this is all a bit dubious. add_extra_xml() uses
350 a different lifetime model from add_instant_xml().
353 XMLNode* node = new XMLNode (keyboard->get_state());
354 Config->add_extra_xml (*node);
355 Config->save_state();
357 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
358 XMLNode& mnode (mixer->get_state());
361 session->add_instant_xml(enode, session->path());
362 session->add_instant_xml(mnode, session->path());
364 Config->add_instant_xml(enode, get_user_ardour_path());
365 Config->add_instant_xml(mnode, get_user_ardour_path());
370 AccelMap::save ("ardour.saved_bindings");
374 ARDOUR_UI::startup ()
376 /* Once the UI is up and running, start the audio engine. Doing
377 this before the UI is up and running can cause problems
378 when not running with SCHED_FIFO, because the amount of
379 CPU and disk work needed to get the UI started can interfere
380 with the scheduling of the audio thread.
383 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
389 if (session && session->dirty()) {
390 switch (ask_about_saving_session(_("quit"))) {
395 /* use the default name */
396 if (save_state_canfail ("")) {
397 /* failed - don't quit */
398 MessageDialog msg (*editor,
400 Ardour was unable to save your session.\n\n\
401 If you still wish to quit, please use the\n\n\
402 \"Just quit\" option."));
411 Config->save_state();
416 ARDOUR_UI::ask_about_saving_session (const string & what)
418 ArdourDialog window (_("ardour: save session?"));
419 Gtk::HBox dhbox; // the hbox for the image and text
420 Gtk::Label prompt_label;
421 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
425 msg = string_compose(_("Don't %1"), what);
426 window.add_button (msg, RESPONSE_REJECT);
427 msg = string_compose(_("Just %1"), what);
428 window.add_button (msg, RESPONSE_APPLY);
429 msg = string_compose(_("Save and %1"), what);
430 window.add_button (msg, RESPONSE_ACCEPT);
432 window.set_default_response (RESPONSE_ACCEPT);
434 Gtk::Button noquit_button (msg);
435 noquit_button.set_name ("EditorGTKButton");
440 if (session->snap_name() == session->name()) {
443 type = _("snapshot");
445 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?"),
446 type, session->snap_name());
448 prompt_label.set_text (prompt);
449 prompt_label.set_name (X_("PrompterLabel"));
450 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
452 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
454 dhbox.set_homogeneous (false);
455 dhbox.pack_start (*dimage, false, false, 5);
456 dhbox.pack_start (prompt_label, true, false, 5);
457 window.get_vbox()->pack_start (dhbox);
459 window.set_name (_("Prompter"));
460 window.set_position (Gtk::WIN_POS_MOUSE);
461 window.set_modal (true);
462 window.set_resizable (false);
465 save_the_session = 0;
467 editor->ensure_float (window);
469 ResponseType r = (ResponseType) window.run();
474 case RESPONSE_ACCEPT: // save and get out of here
476 case RESPONSE_APPLY: // get out of here
486 ARDOUR_UI::every_second ()
489 update_buffer_load ();
490 update_disk_space ();
495 ARDOUR_UI::every_point_one_seconds ()
497 update_speed_display ();
498 RapidScreenUpdate(); /* EMIT_SIGNAL */
503 ARDOUR_UI::every_point_zero_one_seconds ()
505 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
510 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
514 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
516 if (!engine->connected()) {
518 snprintf (buf, sizeof (buf), _("disconnected"));
522 jack_nframes_t rate = engine->frame_rate();
524 if (fmod (rate, 1000.0) != 0.0) {
525 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
526 (float) rate/1000.0f,
527 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
529 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
531 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
535 sample_rate_label.set_text (buf);
539 ARDOUR_UI::update_cpu_load ()
542 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
543 cpu_load_label.set_text (buf);
547 ARDOUR_UI::update_buffer_load ()
552 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
553 session->playback_load(), session->capture_load());
554 buffer_load_label.set_text (buf);
556 buffer_load_label.set_text ("");
561 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
563 if (ds.record_enabled()) {
564 rec_enabled_diskstreams++;
569 ARDOUR_UI::update_disk_space()
575 jack_nframes_t frames = session->available_capture_duration();
578 if (frames == max_frames) {
579 strcpy (buf, _("space: 24hrs+"));
584 jack_nframes_t fr = session->frame_rate();
586 if (session->actively_recording()){
588 rec_enabled_diskstreams = 0;
589 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
591 if (rec_enabled_diskstreams) {
592 frames /= rec_enabled_diskstreams;
597 /* hmmm. shall we divide by the route count? or the diskstream count?
598 or what? for now, do nothing ...
603 hrs = frames / (fr * 3600);
604 frames -= hrs * fr * 3600;
605 mins = frames / (fr * 60);
606 frames -= mins * fr * 60;
609 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
612 disk_space_label.set_text (buf);
616 ARDOUR_UI::update_wall_clock ()
623 tm_now = localtime (&now);
625 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
626 wall_clock_label.set_text (buf);
631 ARDOUR_UI::control_methods_adjusted ()
636 which_method = (int) online_control_button->adjustment.get_value();
637 switch (which_method) {
639 allow_mmc_and_local ();
648 fatal << _("programming error: impossible control method") << endmsg;
654 ARDOUR_UI::mmc_device_id_adjusted ()
659 int dev_id = (int) mmc_id_button->adjustment.get_value();
660 mmc->set_device_id (dev_id);
666 ARDOUR_UI::session_menu (GdkEventButton *ev)
668 session_popup_menu->popup (0, 0);
673 ARDOUR_UI::redisplay_recent_sessions ()
675 vector<string *> *sessions;
676 vector<string *>::iterator i;
677 RecentSessionsSorter cmp;
679 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
680 recent_session_model->clear ();
683 ARDOUR::read_recent_sessions (rs);
686 recent_session_display.set_model (recent_session_model);
690 /* sort them alphabetically */
691 sort (rs.begin(), rs.end(), cmp);
692 sessions = new vector<string*>;
694 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
695 sessions->push_back (new string ((*i).second));
698 for (i = sessions->begin(); i != sessions->end(); ++i) {
700 vector<string*>* states;
701 vector<const gchar*> item;
702 string fullpath = *(*i);
704 /* remove any trailing / */
706 if (fullpath[fullpath.length()-1] == '/') {
707 fullpath = fullpath.substr (0, fullpath.length()-1);
710 /* now get available states for this session */
712 if ((states = Session::possible_states (fullpath)) == 0) {
717 TreeModel::Row row = *(recent_session_model->append());
719 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
720 row[recent_session_columns.fullpath] = fullpath;
722 if (states->size() > 1) {
724 /* add the children */
726 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
728 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
730 child_row[recent_session_columns.visible_name] = **i2;
731 child_row[recent_session_columns.fullpath] = fullpath;
740 recent_session_display.set_model (recent_session_model);
745 ARDOUR_UI::build_session_selector ()
747 session_selector_window = new ArdourDialog ("session selector");
749 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
751 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
752 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
753 session_selector_window->set_default_response (RESPONSE_ACCEPT);
754 recent_session_model = TreeStore::create (recent_session_columns);
755 recent_session_display.set_model (recent_session_model);
756 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
757 recent_session_display.set_headers_visible (false);
758 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
760 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
762 scroller->add (recent_session_display);
763 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
765 session_selector_window->set_name ("SessionSelectorWindow");
766 session_selector_window->set_size_request (200, 400);
767 session_selector_window->get_vbox()->pack_start (*scroller);
768 session_selector_window->show_all_children();
772 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
774 session_selector_window->response (RESPONSE_ACCEPT);
778 ARDOUR_UI::open_recent_session ()
780 /* popup selector window */
782 if (session_selector_window == 0) {
783 build_session_selector ();
786 redisplay_recent_sessions ();
788 ResponseType r = (ResponseType) session_selector_window->run ();
790 session_selector_window->hide();
793 case RESPONSE_ACCEPT:
799 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
801 if (i == recent_session_model->children().end()) {
805 Glib::ustring path = (*i)[recent_session_columns.fullpath];
806 Glib::ustring state = (*i)[recent_session_columns.visible_name];
808 _session_is_new = false;
810 load_session (path, state);
814 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
818 if (stat (info.filename.c_str(), &statbuf) != 0) {
822 if (!S_ISDIR(statbuf.st_mode)) {
828 string session_file = info.filename;
830 session_file += Glib::path_get_basename (info.filename);
831 session_file += ".ardour";
833 if (stat (session_file.c_str(), &statbuf) != 0) {
837 return S_ISREG (statbuf.st_mode);
841 ARDOUR_UI::open_session ()
843 /* popup selector window */
845 if (open_session_selector == 0) {
847 /* ardour sessions are folders */
849 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
850 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
851 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
853 FileFilter session_filter;
854 session_filter.add_pattern ("*.ardour");
855 session_filter.set_name (_("Ardour sessions"));
856 open_session_selector->add_filter (session_filter);
857 open_session_selector->set_filter (session_filter);
860 int response = open_session_selector->run();
861 open_session_selector->hide ();
864 case RESPONSE_ACCEPT:
867 open_session_selector->hide();
871 open_session_selector->hide();
872 string session_path = open_session_selector->get_filename();
876 if (session_path.length() > 0) {
877 if (Session::find_session (session_path, path, name, isnew) == 0) {
878 _session_is_new = isnew;
879 load_session (path, name);
886 ARDOUR_UI::session_add_midi_track ()
888 cerr << _("Patience is a virtue.\n");
892 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
897 warning << _("You cannot add a track without a session already loaded.") << endmsg;
903 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
904 error << _("could not create new audio track") << endmsg;
907 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
908 error << _("could not create new audio bus") << endmsg;
913 if (need_control_room_outs) {
919 route->set_stereo_control_outs (control_lr_channels);
920 route->control_outs()->set_stereo_pan (pans, this);
922 #endif /* CONTROLOUTS */
926 MessageDialog msg (*editor,
927 _("There are insufficient JACK ports available\n\
928 to create a new track or bus.\n\
929 You should save Ardour, exit and\n\
930 restart JACK with more ports."));
936 ARDOUR_UI::diskstream_added (DiskStream* ds)
941 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
943 jack_nframes_t _preroll;
946 _preroll = session->convert_to_frames_at (new_position, session->preroll);
948 if (new_position > _preroll) {
949 new_position -= _preroll;
954 session->request_locate (new_position);
959 ARDOUR_UI::transport_goto_start ()
962 session->goto_start();
965 /* force displayed area in editor to start no matter
966 what "follow playhead" setting is.
970 editor->reposition_x_origin (session->current_start_frame());
976 ARDOUR_UI::transport_goto_zero ()
979 session->request_locate (0);
982 /* force displayed area in editor to start no matter
983 what "follow playhead" setting is.
987 editor->reposition_x_origin (0);
993 ARDOUR_UI::transport_goto_end ()
996 jack_nframes_t frame = session->current_end_frame();
997 session->request_locate (frame);
999 /* force displayed area in editor to start no matter
1000 what "follow playhead" setting is.
1004 editor->reposition_x_origin (frame);
1010 ARDOUR_UI::transport_stop ()
1016 if (session->is_auditioning()) {
1017 session->cancel_audition ();
1021 if (session->get_auto_loop()) {
1022 session->request_auto_loop (false);
1025 session->request_stop ();
1029 ARDOUR_UI::transport_stop_and_forget_capture ()
1032 session->request_stop (true);
1037 ARDOUR_UI::remove_last_capture()
1040 editor->remove_last_capture();
1045 ARDOUR_UI::transport_record ()
1048 switch (session->record_status()) {
1049 case Session::Disabled:
1050 if (session->ntracks() == 0) {
1051 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1052 MessageDialog msg (*editor, txt);
1056 session->maybe_enable_record ();
1058 case Session::Recording:
1059 case Session::Enabled:
1060 session->disable_record (true);
1066 ARDOUR_UI::transport_roll ()
1074 rolling = session->transport_rolling ();
1076 if (session->get_auto_loop()) {
1077 session->request_auto_loop (false);
1078 auto_loop_button.set_active (false);
1079 roll_button.set_active (true);
1080 } else if (session->get_play_range ()) {
1081 session->request_play_range (false);
1082 play_selection_button.set_active (false);
1083 } else if (rolling) {
1084 session->request_locate (session->last_transport_start(), true);
1087 session->request_transport_speed (1.0f);
1091 ARDOUR_UI::transport_loop()
1094 if (session->get_auto_loop()) {
1095 if (session->transport_rolling()) {
1096 Location * looploc = session->locations()->auto_loop_location();
1098 session->request_locate (looploc->start(), true);
1103 session->request_auto_loop (true);
1109 ARDOUR_UI::transport_play_selection ()
1115 if (!session->get_play_range()) {
1116 session->request_stop ();
1119 editor->play_selection ();
1123 ARDOUR_UI::transport_rewind (int option)
1125 float current_transport_speed;
1128 current_transport_speed = session->transport_speed();
1130 if (current_transport_speed >= 0.0f) {
1133 session->request_transport_speed (-1.0f);
1136 session->request_transport_speed (-4.0f);
1139 session->request_transport_speed (-0.5f);
1144 session->request_transport_speed (current_transport_speed * 1.5f);
1150 ARDOUR_UI::transport_forward (int option)
1152 float current_transport_speed;
1155 current_transport_speed = session->transport_speed();
1157 if (current_transport_speed <= 0.0f) {
1160 session->request_transport_speed (1.0f);
1163 session->request_transport_speed (4.0f);
1166 session->request_transport_speed (0.5f);
1171 session->request_transport_speed (current_transport_speed * 1.5f);
1177 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1185 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1186 Port *port = ds->io()->input (0);
1187 port->request_monitor_input (!port->monitoring_input());
1192 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1200 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1201 ds->set_record_enabled (!ds->record_enabled(), this);
1206 ARDOUR_UI::queue_transport_change ()
1208 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1212 ARDOUR_UI::map_transport_state ()
1214 float sp = session->transport_speed();
1217 transport_rolling ();
1218 } else if (sp < 0.0f) {
1219 transport_rewinding ();
1220 } else if (sp > 0.0f) {
1221 transport_forwarding ();
1223 transport_stopped ();
1228 ARDOUR_UI::allow_local_only ()
1234 ARDOUR_UI::allow_mmc_only ()
1240 ARDOUR_UI::allow_mmc_and_local ()
1246 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1248 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1249 (int) adj.get_value()].c_str());
1253 ARDOUR_UI::engine_stopped ()
1255 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1256 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1257 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1262 ARDOUR_UI::engine_running ()
1264 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1265 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1266 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1270 ARDOUR_UI::engine_halted ()
1272 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1274 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1275 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1277 update_sample_rate (0);
1279 MessageDialog msg (*editor,
1281 JACK has either been shutdown or it\n\
1282 disconnected Ardour because Ardour\n\
1283 was not fast enough. You can save the\n\
1284 session and/or try to reconnect to JACK ."));
1289 ARDOUR_UI::do_engine_start ()
1295 catch (AudioEngine::PortRegistrationFailure& err) {
1297 error << _("Unable to create all required ports")
1305 error << _("Unable to start the session running")
1315 ARDOUR_UI::start_engine ()
1317 if (do_engine_start () == 0) {
1318 if (session && _session_is_new) {
1319 /* we need to retain initial visual
1320 settings for a new session
1322 session->save_state ("");
1325 /* there is too much going on, in too many threads, for us to
1326 end up with a clean session. So wait 1 second after loading,
1327 and fix it up. its ugly, but until i come across a better
1328 solution, its what we have.
1331 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1338 ARDOUR_UI::update_clocks ()
1340 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1344 ARDOUR_UI::start_clocking ()
1346 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1350 ARDOUR_UI::stop_clocking ()
1352 clock_signal_connection.disconnect ();
1356 ARDOUR_UI::toggle_clocking ()
1359 if (clock_button.get_active()) {
1368 ARDOUR_UI::_blink (void *arg)
1371 ((ARDOUR_UI *) arg)->blink ();
1378 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1382 ARDOUR_UI::start_blinking ()
1384 /* Start the blink signal. Everybody with a blinking widget
1385 uses Blink to drive the widget's state.
1388 if (blink_timeout_tag < 0) {
1390 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1395 ARDOUR_UI::stop_blinking ()
1397 if (blink_timeout_tag >= 0) {
1398 gtk_timeout_remove (blink_timeout_tag);
1399 blink_timeout_tag = -1;
1405 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1407 using namespace Gtk;
1408 using namespace Menu_Helpers;
1410 if (dstream.hidden()) {
1414 MenuList& items = diskstream_menu->items();
1415 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1419 ARDOUR_UI::diskstream_selected (gint32 id)
1421 selected_dstream = id;
1426 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1428 using namespace Gtk;
1429 using namespace Menu_Helpers;
1435 diskstream_menu = new Menu();
1436 diskstream_menu->set_name ("ArdourContextMenu");
1437 using namespace Gtk;
1438 using namespace Menu_Helpers;
1440 MenuList& items = diskstream_menu->items();
1441 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1443 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1446 diskstream_menu->popup (ev->button, ev->time);
1448 diskstream_menu->popup (0, 0);
1451 selected_dstream = -1;
1455 delete diskstream_menu;
1457 return selected_dstream;
1461 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1467 if (io.n_inputs() == 0) {
1472 /* XXX we're not handling multiple ports yet. */
1474 const char **connections = io.input(0)->get_connections();
1476 if (connections == 0 || connections[0] == '\0') {
1479 buf = connections[0];
1486 if (io.n_outputs() == 0) {
1491 /* XXX we're not handling multiple ports yet. */
1493 const char **connections = io.output(0)->get_connections();
1495 if (connections == 0 || connections[0] == '\0') {
1498 buf = connections[0];
1506 ARDOUR_UI::snapshot_session ()
1508 ArdourPrompter prompter (true);
1515 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1517 prompter.set_name ("Prompter");
1518 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1519 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1520 prompter.set_prompt (_("Name of New Snapshot"));
1521 prompter.set_initial_text (now);
1523 switch (prompter.run()) {
1524 case RESPONSE_ACCEPT:
1525 prompter.get_result (snapname);
1526 if (snapname.length()){
1527 save_state (snapname);
1537 ARDOUR_UI::save_state (const string & name)
1539 (void) save_state_canfail (name);
1543 ARDOUR_UI::save_state_canfail (string name)
1548 if (name.length() == 0) {
1549 name = session->snap_name();
1552 if ((ret = session->save_state (name)) != 0) {
1556 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1561 ARDOUR_UI::restore_state (string name)
1564 if (name.length() == 0) {
1565 name = session->name();
1567 session->restore_state (name);
1572 ARDOUR_UI::primary_clock_value_changed ()
1575 session->request_locate (primary_clock.current_time ());
1580 ARDOUR_UI::secondary_clock_value_changed ()
1583 session->request_locate (secondary_clock.current_time ());
1588 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1590 if (session && dstream && dstream->record_enabled()) {
1592 Session::RecordState rs;
1594 rs = session->record_status ();
1597 case Session::Disabled:
1598 case Session::Enabled:
1599 if (w->get_state() != STATE_SELECTED) {
1600 w->set_state (STATE_SELECTED);
1604 case Session::Recording:
1605 if (w->get_state() != STATE_ACTIVE) {
1606 w->set_state (STATE_ACTIVE);
1612 if (w->get_state() != STATE_NORMAL) {
1613 w->set_state (STATE_NORMAL);
1619 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1625 switch (session->record_status()) {
1626 case Session::Enabled:
1628 rec_button.set_state (1);
1630 rec_button.set_state (0);
1634 case Session::Recording:
1635 rec_button.set_state (2);
1639 rec_button.set_state (0);
1645 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1653 ARDOUR_UI::start_keyboard_prefix ()
1655 keyboard->start_prefix();
1659 ARDOUR_UI::save_template ()
1662 ArdourPrompter prompter (true);
1665 prompter.set_name (X_("Prompter"));
1666 prompter.set_prompt (_("Name for mix template:"));
1667 prompter.set_initial_text(session->name() + _("-template"));
1668 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1669 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1671 switch (prompter.run()) {
1672 case RESPONSE_ACCEPT:
1673 prompter.get_result (name);
1675 if (name.length()) {
1676 session->save_template (name);
1686 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1688 m_new_session_dialog->show();
1689 m_new_session_dialog->set_modal(true);
1690 m_new_session_dialog->set_name(predetermined_path);
1691 m_new_session_dialog->reset_recent();
1693 int response = Gtk::RESPONSE_CANCEL;
1696 response = m_new_session_dialog->run ();
1697 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1701 } else if (response == Gtk::RESPONSE_NONE) {
1702 /* Clear was pressed */
1703 m_new_session_dialog->reset();
1705 } else if (response == Gtk::RESPONSE_YES) {
1706 /* YES == OPEN, but there's no enum for that */
1707 std::string session_name = m_new_session_dialog->session_name();
1708 std::string session_path = m_new_session_dialog->session_folder();
1709 load_session (session_path, session_name);
1712 } else if (response == Gtk::RESPONSE_OK) {
1713 if (m_new_session_dialog->get_current_page() == 1) {
1715 /* XXX this is a bit of a hack..
1716 i really want the new sesion dialog to return RESPONSE_YES
1717 if we're on page 1 (the load page)
1718 Unfortunately i can't see how atm..
1720 std::string session_name = m_new_session_dialog->session_name();
1721 std::string session_path = m_new_session_dialog->session_folder();
1722 load_session (session_path, session_name);
1726 _session_is_new = true;
1728 std::string session_name = m_new_session_dialog->session_name();
1729 std::string session_path = m_new_session_dialog->session_folder();
1732 //XXX This is needed because session constructor wants a
1733 //non-existant path. hopefully this will be fixed at some point.
1735 session_path = Glib::build_filename(session_path, session_name);
1737 std::string template_name = m_new_session_dialog->session_template_name();
1739 if (m_new_session_dialog->use_session_template()) {
1741 load_session (session_path, session_name, &template_name);
1747 Session::AutoConnectOption iconnect;
1748 Session::AutoConnectOption oconnect;
1750 if (m_new_session_dialog->create_control_bus()) {
1751 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1756 if (m_new_session_dialog->create_master_bus()) {
1757 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1762 if (m_new_session_dialog->connect_inputs()) {
1763 iconnect = Session::AutoConnectPhysical;
1765 iconnect = Session::AutoConnectOption (0);
1768 /// @todo some minor tweaks.
1770 if (m_new_session_dialog->connect_outs_to_master()) {
1771 oconnect = Session::AutoConnectMaster;
1772 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1773 oconnect = Session::AutoConnectPhysical;
1775 oconnect = Session::AutoConnectOption (0);
1778 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1779 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1781 build_session (session_path,
1789 engine->frame_rate() * 60 * 5);
1794 } while (response == Gtk::RESPONSE_NONE);
1795 m_new_session_dialog->hide();
1801 ARDOUR_UI::close_session()
1808 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1810 Session *new_session;
1812 session_loaded = false;
1813 x = unload_session ();
1821 /* if it already exists, we must have write access */
1823 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1824 MessageDialog msg (*editor, _("\
1825 You do not have write access to this session.\n\
1826 This prevents the session from being loaded."));
1832 new_session = new Session (*engine, path, snap_name, mix_template);
1837 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1841 connect_to_session (new_session);
1843 //if (engine->running()) {
1844 //mixer->show_window();
1846 session_loaded = true;
1851 ARDOUR_UI::make_session_clean ()
1854 session->set_clean ();
1863 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1864 uint32_t control_channels,
1865 uint32_t master_channels,
1866 Session::AutoConnectOption input_connect,
1867 Session::AutoConnectOption output_connect,
1870 jack_nframes_t initial_length)
1872 Session *new_session;
1875 session_loaded = false;
1876 x = unload_session ();
1883 _session_is_new = true;
1886 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1887 control_channels, master_channels, nphysin, nphysout, initial_length);
1892 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1896 connect_to_session (new_session);
1898 //if (engine->running()) {
1899 //mixer->show_window();
1901 session_loaded = true;
1909 editor->show_window ();
1913 if (session && mixer) {
1914 // mixer->show_window ();
1923 ARDOUR_UI::show_splash ()
1926 about = new About();
1932 ARDOUR_UI::hide_splash ()
1940 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1944 removed = rep.paths.size();
1947 MessageDialog msgd (*editor,
1948 _("No audio files were ready for cleanup"),
1951 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1952 msgd.set_secondary_text (_("If this seems suprising, \n\
1953 check for any existing snapshots.\n\
1954 These may still include regions that\n\
1955 require some unused files to continue to exist."));
1961 ArdourDialog results (_("ardour: cleanup"), true, false);
1963 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1964 CleanupResultsModelColumns() {
1968 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1969 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1973 CleanupResultsModelColumns results_columns;
1974 Glib::RefPtr<Gtk::ListStore> results_model;
1975 Gtk::TreeView results_display;
1977 results_model = ListStore::create (results_columns);
1978 results_display.set_model (results_model);
1979 results_display.append_column (list_title, results_columns.visible_name);
1981 results_display.set_name ("CleanupResultsList");
1982 results_display.set_headers_visible (true);
1983 results_display.set_headers_clickable (false);
1984 results_display.set_reorderable (false);
1986 Gtk::ScrolledWindow list_scroller;
1989 Gtk::HBox dhbox; // the hbox for the image and text
1990 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1991 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1993 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1995 if (rep.space < 1048576.0f) {
1997 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1999 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2003 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2005 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2009 dhbox.pack_start (*dimage, true, false, 5);
2010 dhbox.pack_start (txt, true, false, 5);
2012 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2013 TreeModel::Row row = *(results_model->append());
2014 row[results_columns.visible_name] = *i;
2015 row[results_columns.fullpath] = *i;
2018 list_scroller.add (results_display);
2019 list_scroller.set_size_request (-1, 150);
2020 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2022 dvbox.pack_start (dhbox, true, false, 5);
2023 dvbox.pack_start (list_scroller, true, false, 5);
2024 ddhbox.pack_start (dvbox, true, false, 5);
2026 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2027 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2028 results.set_default_response (RESPONSE_CLOSE);
2029 results.set_position (Gtk::WIN_POS_MOUSE);
2030 results.show_all_children ();
2031 results.set_resizable (false);
2038 ARDOUR_UI::cleanup ()
2041 /* shouldn't happen: menu item is insensitive */
2046 MessageDialog checker (_("Are you sure you want to cleanup?"),
2048 Gtk::MESSAGE_QUESTION,
2049 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2051 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2052 ALL undo/redo information will be lost if you cleanup.\n\
2053 After cleanup, unused audio files will be moved to a \
2054 \"dead sounds\" location."));
2056 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2057 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2058 checker.set_default_response (RESPONSE_CANCEL);
2060 checker.set_name (_("CleanupDialog"));
2061 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2062 checker.set_position (Gtk::WIN_POS_MOUSE);
2064 switch (checker.run()) {
2065 case RESPONSE_ACCEPT:
2071 Session::cleanup_report rep;
2073 editor->prepare_for_cleanup ();
2075 if (session->cleanup_sources (rep)) {
2079 display_cleanup_results (rep,
2082 The following %1 %2 not in use and \n\
2083 have been moved to:\n\
2085 Flushing the wastebasket will \n\
2086 release an additional\n\
2087 %4 %5bytes of disk space.\n"
2092 ARDOUR_UI::flush_trash ()
2095 /* shouldn't happen: menu item is insensitive */
2099 Session::cleanup_report rep;
2101 if (session->cleanup_trash_sources (rep)) {
2105 display_cleanup_results (rep,
2107 _("The following %1 %2 deleted from\n\
2109 releasing %4 %5bytes of disk space"));
2113 ARDOUR_UI::add_route ()
2121 if (add_route_dialog == 0) {
2122 add_route_dialog = new AddRouteDialog;
2123 editor->ensure_float (*add_route_dialog);
2126 if (add_route_dialog->is_visible()) {
2127 /* we're already doing this */
2131 ResponseType r = (ResponseType) add_route_dialog->run ();
2133 add_route_dialog->hide();
2136 case RESPONSE_ACCEPT:
2143 if ((count = add_route_dialog->count()) <= 0) {
2147 uint32_t input_chan = add_route_dialog->channels ();
2148 uint32_t output_chan;
2149 string name_template = add_route_dialog->name_template ();
2150 bool track = add_route_dialog->track ();
2152 Session::AutoConnectOption oac = session->get_output_auto_connect();
2154 if (oac & Session::AutoConnectMaster) {
2155 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2157 output_chan = input_chan;
2160 /* XXX do something with name template */
2164 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2166 session_add_audio_bus (input_chan, output_chan);
2170 while (Main::events_pending()) {
2177 ARDOUR_UI::mixer_settings () const
2182 node = session->instant_xml(X_("Mixer"), session->path());
2184 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2188 node = new XMLNode (X_("Mixer"));
2195 ARDOUR_UI::editor_settings () const
2200 node = session->instant_xml(X_("Editor"), session->path());
2202 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2206 node = new XMLNode (X_("Editor"));
2212 ARDOUR_UI::keyboard_settings () const
2216 node = Config->extra_xml(X_("Keyboard"));
2219 node = new XMLNode (X_("Keyboard"));
2225 ARDOUR_UI::halt_on_xrun_message ()
2227 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2229 MessageDialog msg (*editor,
2230 _("Recording was stopped because your system could not keep up."));
2235 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2237 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2239 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2243 delete deletion_list;
2247 ARDOUR_UI::disk_overrun_handler ()
2249 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2251 if (!have_disk_overrun_displayed) {
2252 have_disk_overrun_displayed = true;
2253 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2254 The disk system on your computer\n\
2255 was not able to keep up with Ardour.\n\
2257 Specifically, it failed to write data to disk\n\
2258 quickly enough to keep up with recording.\n"));
2260 have_disk_overrun_displayed = false;
2265 ARDOUR_UI::disk_underrun_handler ()
2267 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2269 if (!have_disk_underrun_displayed) {
2270 have_disk_underrun_displayed = true;
2271 MessageDialog msg (*editor,
2272 (_("The disk system on your computer\n\
2273 was not able to keep up with Ardour.\n\
2275 Specifically, it failed to read data from disk\n\
2276 quickly enough to keep up with playback.\n")));
2278 have_disk_underrun_displayed = false;
2283 ARDOUR_UI::disk_underrun_message_gone ()
2285 have_disk_underrun_displayed = false;
2289 ARDOUR_UI::disk_overrun_message_gone ()
2291 have_disk_underrun_displayed = false;
2295 ARDOUR_UI::pending_state_dialog ()
2297 ArdourDialog dialog ("pending state dialog");
2299 This session appears to have been in\n\
2300 middle of recording when ardour or\n\
2301 the computer was shutdown.\n\
2303 Ardour can recover any captured audio for\n\
2304 you, or it can ignore it. Please decide\n\
2305 what you would like to do.\n"));
2307 dialog.get_vbox()->pack_start (message);
2308 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2309 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2311 dialog.set_position (WIN_POS_CENTER);
2314 switch (dialog.run ()) {
2315 case RESPONSE_ACCEPT:
2323 ARDOUR_UI::disconnect_from_jack ()
2326 if( engine->disconnect_from_jack ()) {
2327 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2331 update_sample_rate (0);
2336 ARDOUR_UI::reconnect_to_jack ()
2339 if (engine->reconnect_to_jack ()) {
2340 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2344 update_sample_rate (0);
2349 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2351 engine->request_buffer_size (nframes);
2352 update_sample_rate (0);
2356 ARDOUR_UI::cmdline_new_session (string path)
2358 if (path[0] != '/') {
2359 char buf[PATH_MAX+1];
2362 getcwd (buf, sizeof (buf));
2369 new_session (false, path);
2371 _will_create_new_session_automatically = false; /* done it */
2372 return FALSE; /* don't call it again */
2376 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2378 Glib::RefPtr<Action> act;
2382 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2385 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2388 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2391 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2394 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2399 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2400 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2401 Config->set_native_file_header_format (hf);
2403 session->reset_native_file_format ();
2410 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2412 Glib::RefPtr<Action> act;
2416 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2419 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2424 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2426 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2427 Config->set_native_file_data_format (sf);
2429 session->reset_native_file_format ();
2436 ARDOUR_UI::use_config ()
2438 Glib::RefPtr<Action> act;
2440 switch (Config->get_native_file_data_format ()) {
2442 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2445 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2450 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2451 ract->set_active ();
2454 switch (Config->get_native_file_header_format ()) {
2456 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2459 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2462 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2465 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2468 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2473 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2474 ract->set_active ();