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/basename.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/failed_constructor.h>
39 #include <gtkmm2ext/gtk_ui.h>
40 #include <gtkmm2ext/utils.h>
41 #include <gtkmm2ext/click_box.h>
42 #include <gtkmm2ext/fastmeter.h>
43 #include <gtkmm2ext/stop_signal.h>
44 #include <gtkmm2ext/popup.h>
46 #include <midi++/port.h>
47 #include <midi++/mmc.h>
49 #include <ardour/ardour.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/diskstream.h>
55 #include <ardour/filesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/session_diskstream.h>
58 #include <ardour/port.h>
59 #include <ardour/audio_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;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
91 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
93 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
95 primary_clock (X_("TransportClockDisplay"), true, false, true),
96 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
97 preroll_clock (X_("PreRollClock"), true, true),
98 postroll_clock (X_("PostRollClock"), true, true),
102 adjuster_table (3, 3),
106 preroll_button (_("pre\nroll")),
107 postroll_button (_("post\nroll")),
111 big_clock ("BigClockDisplay", true),
115 time_master_button (_("time\nmaster")),
117 shuttle_units_button (_("% ")),
119 punch_in_button (_("punch\nin")),
120 punch_out_button (_("punch\nout")),
121 auto_return_button (_("auto\nreturn")),
122 auto_play_button (_("auto\nplay")),
123 auto_input_button (_("auto\ninput")),
124 click_button (_("click")),
125 auditioning_alert_button (_("AUDITIONING")),
126 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
140 ActionManager::init ();
144 color_manager = new ColorManager();
146 std::string color_file = ARDOUR::find_config_file("ardour.colors");
148 color_manager->load (color_file);
150 m_new_session_dialog = new NewSessionDialog();
154 _session_is_new = false;
155 big_clock_window = 0;
156 session_selector_window = 0;
157 last_key_press_time = 0;
158 connection_editor = 0;
159 add_route_dialog = 0;
164 open_session_selector = 0;
165 have_configure_timeout = false;
166 have_disk_overrun_displayed = false;
167 have_disk_underrun_displayed = false;
168 _will_create_new_session_automatically = false;
169 session_loaded = false;
170 last_speed_displayed = -1.0f;
172 last_configure_time.tv_sec = 0;
173 last_configure_time.tv_usec = 0;
175 shuttle_grabbed = false;
177 shuttle_max_speed = 8.0f;
179 set_shuttle_units (Percentage);
180 set_shuttle_behaviour (Sprung);
182 shuttle_style_menu = 0;
183 shuttle_unit_menu = 0;
185 gettimeofday (&last_peak_grab, 0);
186 gettimeofday (&last_shuttle_request, 0);
188 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
189 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
190 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
192 /* handle pending state with a dialog */
194 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
196 /* have to wait for AudioEngine and Configuration before proceeding */
200 ARDOUR_UI::set_engine (AudioEngine& e)
204 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
205 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
206 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
207 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
211 keyboard = new Keyboard;
215 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
216 if (meter_path.empty()) {
217 error << _("no vertical meter strip image found") << endmsg;
220 FastMeter::set_vertical_xpm (meter_path);
222 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
223 if (meter_path.empty()) {
224 error << _("no horizontal meter strip image found") << endmsg;
227 FastMeter::set_horizontal_xpm (meter_path);
229 if (setup_windows ()) {
230 throw failed_constructor ();
233 if (GTK_ARDOUR::show_key_actions) {
234 vector<string> names;
235 vector<string> paths;
237 vector<AccelKey> bindings;
239 ActionManager::get_all_actions (names, paths, keys, bindings);
241 vector<string>::iterator n;
242 vector<string>::iterator k;
243 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
244 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
250 /* start with timecode, metering enabled
253 blink_timeout_tag = -1;
255 /* the global configuration object is now valid */
259 /* this being a GUI and all, we want peakfiles */
261 FileSource::set_build_peakfiles (true);
262 FileSource::set_build_missing_peakfiles (true);
264 if (Source::start_peak_thread ()) {
265 throw failed_constructor();
268 /* start the time-of-day-clock */
270 update_wall_clock ();
271 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
273 update_disk_space ();
275 update_sample_rate (engine->frame_rate());
277 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
278 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
281 ARDOUR_UI::~ARDOUR_UI ()
283 save_ardour_state ();
297 if (add_route_dialog) {
298 delete add_route_dialog;
301 Source::stop_peak_thread ();
305 ARDOUR_UI::configure_timeout ()
310 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
311 /* no configure events yet */
315 gettimeofday (&now, 0);
316 timersub (&now, &last_configure_time, &diff);
318 /* force a gap of 0.5 seconds since the last configure event
321 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
324 have_configure_timeout = false;
325 save_ardour_state ();
331 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
333 if (have_configure_timeout) {
334 gettimeofday (&last_configure_time, 0);
336 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
337 have_configure_timeout = true;
344 ARDOUR_UI::save_ardour_state ()
346 if (!keyboard || !mixer || !editor) {
350 /* XXX this is all a bit dubious. add_extra_xml() uses
351 a different lifetime model from add_instant_xml().
354 XMLNode* node = new XMLNode (keyboard->get_state());
355 Config->add_extra_xml (*node);
356 Config->save_state();
358 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
359 XMLNode& mnode (mixer->get_state());
362 session->add_instant_xml(enode, session->path());
363 session->add_instant_xml(mnode, session->path());
365 Config->add_instant_xml(enode, get_user_ardour_path());
366 Config->add_instant_xml(mnode, get_user_ardour_path());
371 AccelMap::save ("ardour.saved_bindings");
375 ARDOUR_UI::startup ()
377 /* Once the UI is up and running, start the audio engine. Doing
378 this before the UI is up and running can cause problems
379 when not running with SCHED_FIFO, because the amount of
380 CPU and disk work needed to get the UI started can interfere
381 with the scheduling of the audio thread.
384 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
390 if (session && session->dirty()) {
391 switch (ask_about_saving_session(_("quit"))) {
396 /* use the default name */
397 if (save_state_canfail ("")) {
398 /* failed - don't quit */
399 MessageDialog msg (*editor,
401 Ardour was unable to save your session.\n\n\
402 If you still wish to quit, please use the\n\n\
403 \"Just quit\" option."));
417 ARDOUR_UI::ask_about_saving_session (const string & what)
419 ArdourDialog window (_("ardour: save session?"));
420 Gtk::HBox dhbox; // the hbox for the image and text
421 Gtk::Label prompt_label;
422 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
426 msg = string_compose(_("Don't %1"), what);
427 window.add_button (msg, RESPONSE_REJECT);
428 msg = string_compose(_("Just %1"), what);
429 window.add_button (msg, RESPONSE_APPLY);
430 msg = string_compose(_("Save and %1"), what);
431 window.add_button (msg, RESPONSE_ACCEPT);
433 window.set_default_response (RESPONSE_ACCEPT);
435 Gtk::Button noquit_button (msg);
436 noquit_button.set_name ("EditorGTKButton");
441 if (session->snap_name() == session->name()) {
444 type = _("snapshot");
446 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?"),
447 type, session->snap_name());
449 prompt_label.set_text (prompt);
450 prompt_label.set_name (X_("PrompterLabel"));
451 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
453 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
455 dhbox.set_homogeneous (false);
456 dhbox.pack_start (*dimage, false, false, 5);
457 dhbox.pack_start (prompt_label, true, false, 5);
458 window.get_vbox()->pack_start (dhbox);
460 window.set_name (_("Prompter"));
461 window.set_position (Gtk::WIN_POS_MOUSE);
462 window.set_modal (true);
463 window.set_resizable (false);
466 save_the_session = 0;
468 editor->ensure_float (window);
470 ResponseType r = (ResponseType) window.run();
475 case RESPONSE_ACCEPT: // save and get out of here
477 case RESPONSE_APPLY: // get out of here
487 ARDOUR_UI::every_second ()
490 update_buffer_load ();
491 update_disk_space ();
496 ARDOUR_UI::every_point_one_seconds ()
498 update_speed_display ();
499 RapidScreenUpdate(); /* EMIT_SIGNAL */
504 ARDOUR_UI::every_point_zero_one_seconds ()
506 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
511 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
515 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
517 if (!engine->connected()) {
519 snprintf (buf, sizeof (buf), _("disconnected"));
523 jack_nframes_t rate = engine->frame_rate();
525 if (fmod (rate, 1000.0) != 0.0) {
526 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
527 (float) rate/1000.0f,
528 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
530 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
532 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
536 sample_rate_label.set_text (buf);
540 ARDOUR_UI::update_cpu_load ()
543 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
544 cpu_load_label.set_text (buf);
548 ARDOUR_UI::update_buffer_load ()
553 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
554 session->playback_load(), session->capture_load());
555 buffer_load_label.set_text (buf);
557 buffer_load_label.set_text ("");
562 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
564 if (ds.record_enabled()) {
565 rec_enabled_diskstreams++;
570 ARDOUR_UI::update_disk_space()
576 jack_nframes_t frames = session->available_capture_duration();
579 if (frames == max_frames) {
580 strcpy (buf, _("space: 24hrs+"));
585 jack_nframes_t fr = session->frame_rate();
587 if (session->actively_recording()){
589 rec_enabled_diskstreams = 0;
590 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
592 if (rec_enabled_diskstreams) {
593 frames /= rec_enabled_diskstreams;
598 /* hmmm. shall we divide by the route count? or the diskstream count?
599 or what? for now, do nothing ...
604 hrs = frames / (fr * 3600);
605 frames -= hrs * fr * 3600;
606 mins = frames / (fr * 60);
607 frames -= mins * fr * 60;
610 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
613 disk_space_label.set_text (buf);
617 ARDOUR_UI::update_wall_clock ()
624 tm_now = localtime (&now);
626 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
627 wall_clock_label.set_text (buf);
632 ARDOUR_UI::control_methods_adjusted ()
637 which_method = (int) online_control_button->adjustment.get_value();
638 switch (which_method) {
640 allow_mmc_and_local ();
649 fatal << _("programming error: impossible control method") << endmsg;
655 ARDOUR_UI::mmc_device_id_adjusted ()
660 int dev_id = (int) mmc_id_button->adjustment.get_value();
661 mmc->set_device_id (dev_id);
667 ARDOUR_UI::session_menu (GdkEventButton *ev)
669 session_popup_menu->popup (0, 0);
674 ARDOUR_UI::redisplay_recent_sessions ()
676 vector<string *> *sessions;
677 vector<string *>::iterator i;
678 RecentSessionsSorter cmp;
680 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
681 recent_session_model->clear ();
684 ARDOUR::read_recent_sessions (rs);
687 recent_session_display.set_model (recent_session_model);
691 /* sort them alphabetically */
692 sort (rs.begin(), rs.end(), cmp);
693 sessions = new vector<string*>;
695 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
696 sessions->push_back (new string ((*i).second));
699 for (i = sessions->begin(); i != sessions->end(); ++i) {
701 vector<string*>* states;
702 vector<const gchar*> item;
703 string fullpath = *(*i);
705 /* remove any trailing / */
707 if (fullpath[fullpath.length()-1] == '/') {
708 fullpath = fullpath.substr (0, fullpath.length()-1);
711 /* now get available states for this session */
713 if ((states = Session::possible_states (fullpath)) == 0) {
718 TreeModel::Row row = *(recent_session_model->append());
720 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
721 row[recent_session_columns.fullpath] = fullpath;
723 if (states->size() > 1) {
725 /* add the children */
727 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
729 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
731 child_row[recent_session_columns.visible_name] = **i2;
732 child_row[recent_session_columns.fullpath] = fullpath;
741 recent_session_display.set_model (recent_session_model);
746 ARDOUR_UI::build_session_selector ()
748 session_selector_window = new ArdourDialog ("session selector");
750 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
752 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
753 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
754 session_selector_window->set_default_response (RESPONSE_ACCEPT);
755 recent_session_model = TreeStore::create (recent_session_columns);
756 recent_session_display.set_model (recent_session_model);
757 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
758 recent_session_display.set_headers_visible (false);
759 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
761 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
763 scroller->add (recent_session_display);
764 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
766 session_selector_window->set_name ("SessionSelectorWindow");
767 session_selector_window->set_size_request (200, 400);
768 session_selector_window->get_vbox()->pack_start (*scroller);
769 session_selector_window->show_all_children();
773 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
775 session_selector_window->response (RESPONSE_ACCEPT);
779 ARDOUR_UI::open_recent_session ()
781 /* popup selector window */
783 if (session_selector_window == 0) {
784 build_session_selector ();
787 redisplay_recent_sessions ();
789 ResponseType r = (ResponseType) session_selector_window->run ();
791 session_selector_window->hide();
794 case RESPONSE_ACCEPT:
800 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
802 if (i == recent_session_model->children().end()) {
806 Glib::ustring path = (*i)[recent_session_columns.fullpath];
807 Glib::ustring state = (*i)[recent_session_columns.visible_name];
809 _session_is_new = false;
811 load_session (path, state);
815 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
819 if (stat (info.filename.c_str(), &statbuf) != 0) {
823 if (!S_ISDIR(statbuf.st_mode)) {
827 string session_file = info.filename;
829 session_file += PBD::basename (info.filename);
830 session_file += ".ardour";
832 if (stat (session_file.c_str(), &statbuf) != 0) {
836 return S_ISREG (statbuf.st_mode);
840 ARDOUR_UI::open_session ()
842 /* popup selector window */
844 if (open_session_selector == 0) {
846 /* ardour sessions are folders */
848 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
849 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
850 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
852 FileFilter session_filter;
853 session_filter.add_pattern ("*.ardour");
854 session_filter.set_name (_("Ardour sessions"));
855 open_session_selector->add_filter (session_filter);
856 open_session_selector->set_filter (session_filter);
859 int response = open_session_selector->run();
860 open_session_selector->hide ();
863 case RESPONSE_ACCEPT:
866 open_session_selector->hide();
870 open_session_selector->hide();
871 string session_path = open_session_selector->get_filename();
875 if (session_path.length() > 0) {
876 if (Session::find_session (session_path, path, name, isnew) == 0) {
877 _session_is_new = isnew;
878 load_session (path, name);
885 ARDOUR_UI::session_add_midi_track ()
887 cerr << _("Patience is a virtue.\n");
891 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
896 warning << _("You cannot add a track without a session already loaded.") << endmsg;
902 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
903 error << _("could not create new audio track") << endmsg;
906 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
907 error << _("could not create new audio bus") << endmsg;
912 if (need_control_room_outs) {
918 route->set_stereo_control_outs (control_lr_channels);
919 route->control_outs()->set_stereo_pan (pans, this);
921 #endif /* CONTROLOUTS */
925 MessageDialog msg (*editor,
926 _("There are insufficient JACK ports available\n\
927 to create a new track or bus.\n\
928 You should save Ardour, exit and\n\
929 restart JACK with more ports."));
935 ARDOUR_UI::diskstream_added (DiskStream* ds)
940 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
942 jack_nframes_t _preroll;
945 _preroll = session->convert_to_frames_at (new_position, session->preroll);
947 if (new_position > _preroll) {
948 new_position -= _preroll;
953 session->request_locate (new_position);
958 ARDOUR_UI::transport_goto_start ()
961 session->goto_start();
964 /* force displayed area in editor to start no matter
965 what "follow playhead" setting is.
969 editor->reposition_x_origin (session->current_start_frame());
975 ARDOUR_UI::transport_goto_zero ()
978 session->request_locate (0);
981 /* force displayed area in editor to start no matter
982 what "follow playhead" setting is.
986 editor->reposition_x_origin (0);
992 ARDOUR_UI::transport_goto_end ()
995 jack_nframes_t frame = session->current_end_frame();
996 session->request_locate (frame);
998 /* force displayed area in editor to start no matter
999 what "follow playhead" setting is.
1003 editor->reposition_x_origin (frame);
1009 ARDOUR_UI::transport_stop ()
1015 if (session->is_auditioning()) {
1016 session->cancel_audition ();
1020 if (session->get_auto_loop()) {
1021 session->request_auto_loop (false);
1024 session->request_stop ();
1028 ARDOUR_UI::transport_stop_and_forget_capture ()
1031 session->request_stop (true);
1036 ARDOUR_UI::remove_last_capture()
1039 editor->remove_last_capture();
1044 ARDOUR_UI::transport_record ()
1047 switch (session->record_status()) {
1048 case Session::Disabled:
1049 if (session->ntracks() == 0) {
1050 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1051 MessageDialog msg (*editor, txt);
1055 session->maybe_enable_record ();
1057 case Session::Recording:
1058 case Session::Enabled:
1059 session->disable_record (true);
1065 ARDOUR_UI::transport_roll ()
1073 rolling = session->transport_rolling ();
1075 if (session->get_auto_loop()) {
1076 session->request_auto_loop (false);
1077 auto_loop_button.set_active (false);
1078 roll_button.set_active (true);
1079 } else if (session->get_play_range ()) {
1080 session->request_play_range (false);
1081 play_selection_button.set_active (false);
1082 } else if (rolling) {
1083 session->request_locate (session->last_transport_start(), true);
1086 session->request_transport_speed (1.0f);
1090 ARDOUR_UI::transport_loop()
1093 if (session->get_auto_loop()) {
1094 if (session->transport_rolling()) {
1095 Location * looploc = session->locations()->auto_loop_location();
1097 session->request_locate (looploc->start(), true);
1102 session->request_auto_loop (true);
1108 ARDOUR_UI::transport_play_selection ()
1114 if (!session->get_play_range()) {
1115 session->request_stop ();
1118 editor->play_selection ();
1122 ARDOUR_UI::transport_rewind (int option)
1124 float current_transport_speed;
1127 current_transport_speed = session->transport_speed();
1129 if (current_transport_speed >= 0.0f) {
1132 session->request_transport_speed (-1.0f);
1135 session->request_transport_speed (-4.0f);
1138 session->request_transport_speed (-0.5f);
1143 session->request_transport_speed (current_transport_speed * 1.5f);
1149 ARDOUR_UI::transport_forward (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::toggle_monitor_enable (guint32 dstream)
1184 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1185 Port *port = ds->io()->input (0);
1186 port->request_monitor_input (!port->monitoring_input());
1191 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1199 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1200 ds->set_record_enabled (!ds->record_enabled(), this);
1205 ARDOUR_UI::queue_transport_change ()
1207 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1211 ARDOUR_UI::map_transport_state ()
1213 float sp = session->transport_speed();
1216 transport_rolling ();
1217 } else if (sp < 0.0f) {
1218 transport_rewinding ();
1219 } else if (sp > 0.0f) {
1220 transport_forwarding ();
1222 transport_stopped ();
1227 ARDOUR_UI::allow_local_only ()
1233 ARDOUR_UI::allow_mmc_only ()
1239 ARDOUR_UI::allow_mmc_and_local ()
1245 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1247 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1248 (int) adj.get_value()].c_str());
1252 ARDOUR_UI::engine_stopped ()
1254 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1255 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1256 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1261 ARDOUR_UI::engine_running ()
1263 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1264 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1265 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1269 ARDOUR_UI::engine_halted ()
1271 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1273 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1274 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1276 update_sample_rate (0);
1278 MessageDialog msg (*editor,
1280 JACK has either been shutdown or it\n\
1281 disconnected Ardour because Ardour\n\
1282 was not fast enough. You can save the\n\
1283 session and/or try to reconnect to JACK ."));
1288 ARDOUR_UI::do_engine_start ()
1294 catch (AudioEngine::PortRegistrationFailure& err) {
1296 error << _("Unable to create all required ports")
1304 error << _("Unable to start the session running")
1314 ARDOUR_UI::start_engine ()
1316 if (do_engine_start () == 0) {
1317 if (session && _session_is_new) {
1318 /* we need to retain initial visual
1319 settings for a new session
1321 session->save_state ("");
1324 /* there is too much going on, in too many threads, for us to
1325 end up with a clean session. So wait 1 second after loading,
1326 and fix it up. its ugly, but until i come across a better
1327 solution, its what we have.
1330 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1337 ARDOUR_UI::update_clocks ()
1339 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1343 ARDOUR_UI::start_clocking ()
1345 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1349 ARDOUR_UI::stop_clocking ()
1351 clock_signal_connection.disconnect ();
1355 ARDOUR_UI::toggle_clocking ()
1358 if (clock_button.get_active()) {
1367 ARDOUR_UI::_blink (void *arg)
1370 ((ARDOUR_UI *) arg)->blink ();
1377 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1381 ARDOUR_UI::start_blinking ()
1383 /* Start the blink signal. Everybody with a blinking widget
1384 uses Blink to drive the widget's state.
1387 if (blink_timeout_tag < 0) {
1389 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1394 ARDOUR_UI::stop_blinking ()
1396 if (blink_timeout_tag >= 0) {
1397 gtk_timeout_remove (blink_timeout_tag);
1398 blink_timeout_tag = -1;
1404 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1406 using namespace Gtk;
1407 using namespace Menu_Helpers;
1409 if (dstream.hidden()) {
1413 MenuList& items = diskstream_menu->items();
1414 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1418 ARDOUR_UI::diskstream_selected (gint32 id)
1420 selected_dstream = id;
1425 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1427 using namespace Gtk;
1428 using namespace Menu_Helpers;
1434 diskstream_menu = new Menu();
1435 diskstream_menu->set_name ("ArdourContextMenu");
1436 using namespace Gtk;
1437 using namespace Menu_Helpers;
1439 MenuList& items = diskstream_menu->items();
1440 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1442 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1445 diskstream_menu->popup (ev->button, ev->time);
1447 diskstream_menu->popup (0, 0);
1450 selected_dstream = -1;
1454 delete diskstream_menu;
1456 return selected_dstream;
1460 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1466 if (io.n_inputs() == 0) {
1471 /* XXX we're not handling multiple ports yet. */
1473 const char **connections = io.input(0)->get_connections();
1475 if (connections == 0 || connections[0] == '\0') {
1478 buf = connections[0];
1485 if (io.n_outputs() == 0) {
1490 /* XXX we're not handling multiple ports yet. */
1492 const char **connections = io.output(0)->get_connections();
1494 if (connections == 0 || connections[0] == '\0') {
1497 buf = connections[0];
1505 ARDOUR_UI::snapshot_session ()
1507 ArdourPrompter prompter (true);
1514 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1516 prompter.set_name ("Prompter");
1517 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1518 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1519 prompter.set_prompt (_("Name of New Snapshot"));
1520 prompter.set_initial_text (now);
1522 switch (prompter.run()) {
1523 case RESPONSE_ACCEPT:
1524 prompter.get_result (snapname);
1525 if (snapname.length()){
1526 save_state (snapname);
1536 ARDOUR_UI::save_state (const string & name)
1538 (void) save_state_canfail (name);
1542 ARDOUR_UI::save_state_canfail (string name)
1547 if (name.length() == 0) {
1548 name = session->snap_name();
1551 if ((ret = session->save_state (name)) != 0) {
1555 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1560 ARDOUR_UI::restore_state (string name)
1563 if (name.length() == 0) {
1564 name = session->name();
1566 session->restore_state (name);
1571 ARDOUR_UI::primary_clock_value_changed ()
1574 session->request_locate (primary_clock.current_time ());
1579 ARDOUR_UI::secondary_clock_value_changed ()
1582 session->request_locate (secondary_clock.current_time ());
1587 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1589 if (session && dstream && dstream->record_enabled()) {
1591 Session::RecordState rs;
1593 rs = session->record_status ();
1596 case Session::Disabled:
1597 case Session::Enabled:
1598 if (w->get_state() != STATE_SELECTED) {
1599 w->set_state (STATE_SELECTED);
1603 case Session::Recording:
1604 if (w->get_state() != STATE_ACTIVE) {
1605 w->set_state (STATE_ACTIVE);
1611 if (w->get_state() != STATE_NORMAL) {
1612 w->set_state (STATE_NORMAL);
1618 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1624 switch (session->record_status()) {
1625 case Session::Enabled:
1627 rec_button.set_state (1);
1629 rec_button.set_state (0);
1633 case Session::Recording:
1634 rec_button.set_state (2);
1638 rec_button.set_state (0);
1644 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1652 ARDOUR_UI::start_keyboard_prefix ()
1654 keyboard->start_prefix();
1658 ARDOUR_UI::save_template ()
1661 ArdourPrompter prompter (true);
1664 prompter.set_name (X_("Prompter"));
1665 prompter.set_prompt (_("Name for mix template:"));
1666 prompter.set_initial_text(session->name() + _("-template"));
1667 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1668 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1670 switch (prompter.run()) {
1671 case RESPONSE_ACCEPT:
1672 prompter.get_result (name);
1674 if (name.length()) {
1675 session->save_template (name);
1685 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1687 m_new_session_dialog->show();
1688 m_new_session_dialog->set_modal(true);
1689 m_new_session_dialog->set_name(predetermined_path);
1690 m_new_session_dialog->reset_recent();
1692 int response = Gtk::RESPONSE_CANCEL;
1695 response = m_new_session_dialog->run ();
1696 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1700 } else if (response == Gtk::RESPONSE_NONE) {
1701 /* Clear was pressed */
1702 m_new_session_dialog->reset();
1704 } else if (response == Gtk::RESPONSE_YES) {
1705 /* YES == OPEN, but there's no enum for that */
1706 std::string session_name = m_new_session_dialog->session_name();
1707 std::string session_path = m_new_session_dialog->session_folder();
1708 load_session (session_path, session_name);
1711 } else if (response == Gtk::RESPONSE_OK) {
1712 if (m_new_session_dialog->get_current_page() == 1) {
1714 /* XXX this is a bit of a hack..
1715 i really want the new sesion dialog to return RESPONSE_YES
1716 if we're on page 1 (the load page)
1717 Unfortunately i can't see how atm..
1719 std::string session_name = m_new_session_dialog->session_name();
1720 std::string session_path = m_new_session_dialog->session_folder();
1721 load_session (session_path, session_name);
1725 _session_is_new = true;
1727 std::string session_name = m_new_session_dialog->session_name();
1728 std::string session_path = m_new_session_dialog->session_folder();
1731 //XXX This is needed because session constructor wants a
1732 //non-existant path. hopefully this will be fixed at some point.
1734 session_path = Glib::build_filename(session_path, session_name);
1736 std::string template_name = m_new_session_dialog->session_template_name();
1738 if (m_new_session_dialog->use_session_template()) {
1740 load_session (session_path, session_name, &template_name);
1746 Session::AutoConnectOption iconnect;
1747 Session::AutoConnectOption oconnect;
1749 if (m_new_session_dialog->create_control_bus()) {
1750 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1755 if (m_new_session_dialog->create_master_bus()) {
1756 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1761 if (m_new_session_dialog->connect_inputs()) {
1762 iconnect = Session::AutoConnectPhysical;
1764 iconnect = Session::AutoConnectOption (0);
1767 /// @todo some minor tweaks.
1769 if (m_new_session_dialog->connect_outs_to_master()) {
1770 oconnect = Session::AutoConnectMaster;
1771 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1772 oconnect = Session::AutoConnectPhysical;
1774 oconnect = Session::AutoConnectOption (0);
1777 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1778 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1780 build_session (session_path,
1788 engine->frame_rate() * 60 * 5);
1793 } while (response == Gtk::RESPONSE_NONE);
1794 m_new_session_dialog->hide();
1800 ARDOUR_UI::close_session()
1807 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1809 Session *new_session;
1811 session_loaded = false;
1812 x = unload_session ();
1820 /* if it already exists, we must have write access */
1822 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1823 MessageDialog msg (*editor, _("\
1824 You do not have write access to this session.\n\
1825 This prevents the session from being loaded."));
1831 new_session = new Session (*engine, path, snap_name, mix_template);
1836 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1840 connect_to_session (new_session);
1842 //if (engine->running()) {
1843 //mixer->show_window();
1845 session_loaded = true;
1850 ARDOUR_UI::make_session_clean ()
1853 session->set_clean ();
1862 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1863 uint32_t control_channels,
1864 uint32_t master_channels,
1865 Session::AutoConnectOption input_connect,
1866 Session::AutoConnectOption output_connect,
1869 jack_nframes_t initial_length)
1871 Session *new_session;
1874 session_loaded = false;
1875 x = unload_session ();
1882 _session_is_new = true;
1885 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1886 control_channels, master_channels, nphysin, nphysout, initial_length);
1891 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1895 connect_to_session (new_session);
1897 //if (engine->running()) {
1898 //mixer->show_window();
1900 session_loaded = true;
1908 editor->show_window ();
1912 if (session && mixer) {
1913 // mixer->show_window ();
1922 ARDOUR_UI::show_splash ()
1925 about = new About();
1931 ARDOUR_UI::hide_splash ()
1939 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1943 removed = rep.paths.size();
1946 MessageDialog msgd (*editor,
1947 _("No audio files were ready for cleanup"),
1950 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1951 msgd.set_secondary_text (_("If this seems suprising, \n\
1952 check for any existing snapshots.\n\
1953 These may still include regions that\n\
1954 require some unused files to continue to exist."));
1960 ArdourDialog results (_("ardour: cleanup"), true, false);
1962 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1963 CleanupResultsModelColumns() {
1967 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1968 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1972 CleanupResultsModelColumns results_columns;
1973 Glib::RefPtr<Gtk::ListStore> results_model;
1974 Gtk::TreeView results_display;
1976 results_model = ListStore::create (results_columns);
1977 results_display.set_model (results_model);
1978 results_display.append_column (list_title, results_columns.visible_name);
1980 results_display.set_name ("CleanupResultsList");
1981 results_display.set_headers_visible (true);
1982 results_display.set_headers_clickable (false);
1983 results_display.set_reorderable (false);
1985 Gtk::ScrolledWindow list_scroller;
1988 Gtk::HBox dhbox; // the hbox for the image and text
1989 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1990 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1992 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1994 if (rep.space < 1048576.0f) {
1996 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1998 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2002 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2004 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2008 dhbox.pack_start (*dimage, true, false, 5);
2009 dhbox.pack_start (txt, true, false, 5);
2011 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2012 TreeModel::Row row = *(results_model->append());
2013 row[results_columns.visible_name] = *i;
2014 row[results_columns.fullpath] = *i;
2017 list_scroller.add (results_display);
2018 list_scroller.set_size_request (-1, 150);
2019 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2021 dvbox.pack_start (dhbox, true, false, 5);
2022 dvbox.pack_start (list_scroller, true, false, 5);
2023 ddhbox.pack_start (dvbox, true, false, 5);
2025 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2026 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2027 results.set_default_response (RESPONSE_CLOSE);
2028 results.set_position (Gtk::WIN_POS_MOUSE);
2029 results.show_all_children ();
2030 results.set_resizable (false);
2037 ARDOUR_UI::cleanup ()
2040 /* shouldn't happen: menu item is insensitive */
2045 MessageDialog checker (_("Are you sure you want to cleanup?"),
2047 Gtk::MESSAGE_QUESTION,
2048 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2050 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2051 ALL undo/redo information will be lost if you cleanup.\n\
2052 After cleanup, unused audio files will be moved to a \
2053 \"dead sounds\" location."));
2055 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2056 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2057 checker.set_default_response (RESPONSE_CANCEL);
2059 checker.set_name (_("CleanupDialog"));
2060 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2061 checker.set_position (Gtk::WIN_POS_MOUSE);
2063 switch (checker.run()) {
2064 case RESPONSE_ACCEPT:
2070 Session::cleanup_report rep;
2072 editor->prepare_for_cleanup ();
2074 if (session->cleanup_sources (rep)) {
2078 display_cleanup_results (rep,
2081 The following %1 %2 not in use and \n\
2082 have been moved to:\n\
2084 Flushing the wastebasket will \n\
2085 release an additional\n\
2086 %4 %5bytes of disk space.\n"
2091 ARDOUR_UI::flush_trash ()
2094 /* shouldn't happen: menu item is insensitive */
2098 Session::cleanup_report rep;
2100 if (session->cleanup_trash_sources (rep)) {
2104 display_cleanup_results (rep,
2106 _("The following %1 %2 deleted from\n\
2108 releasing %4 %5bytes of disk space"));
2112 ARDOUR_UI::add_route ()
2120 if (add_route_dialog == 0) {
2121 add_route_dialog = new AddRouteDialog;
2122 editor->ensure_float (*add_route_dialog);
2125 if (add_route_dialog->is_visible()) {
2126 /* we're already doing this */
2130 ResponseType r = (ResponseType) add_route_dialog->run ();
2132 add_route_dialog->hide();
2135 case RESPONSE_ACCEPT:
2142 if ((count = add_route_dialog->count()) <= 0) {
2146 uint32_t input_chan = add_route_dialog->channels ();
2147 uint32_t output_chan;
2148 string name_template = add_route_dialog->name_template ();
2149 bool track = add_route_dialog->track ();
2151 Session::AutoConnectOption oac = session->get_output_auto_connect();
2153 if (oac & Session::AutoConnectMaster) {
2154 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2156 output_chan = input_chan;
2159 /* XXX do something with name template */
2163 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2165 session_add_audio_bus (input_chan, output_chan);
2169 while (Main::events_pending()) {
2176 ARDOUR_UI::mixer_settings () const
2181 node = session->instant_xml(X_("Mixer"), session->path());
2183 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2187 node = new XMLNode (X_("Mixer"));
2194 ARDOUR_UI::editor_settings () const
2199 node = session->instant_xml(X_("Editor"), session->path());
2201 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2205 node = new XMLNode (X_("Editor"));
2211 ARDOUR_UI::keyboard_settings () const
2215 node = Config->extra_xml(X_("Keyboard"));
2218 node = new XMLNode (X_("Keyboard"));
2224 ARDOUR_UI::halt_on_xrun_message ()
2226 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2228 MessageDialog msg (*editor,
2229 _("Recording was stopped because your system could not keep up."));
2234 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2236 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2238 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2242 delete deletion_list;
2246 ARDOUR_UI::disk_overrun_handler ()
2248 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2250 if (!have_disk_overrun_displayed) {
2251 have_disk_overrun_displayed = true;
2252 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2253 The disk system on your computer\n\
2254 was not able to keep up with Ardour.\n\
2256 Specifically, it failed to write data to disk\n\
2257 quickly enough to keep up with recording.\n"));
2259 have_disk_overrun_displayed = false;
2264 ARDOUR_UI::disk_underrun_handler ()
2266 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2268 if (!have_disk_underrun_displayed) {
2269 have_disk_underrun_displayed = true;
2270 MessageDialog msg (*editor,
2271 (_("The disk system on your computer\n\
2272 was not able to keep up with Ardour.\n\
2274 Specifically, it failed to read data from disk\n\
2275 quickly enough to keep up with playback.\n")));
2277 have_disk_underrun_displayed = false;
2282 ARDOUR_UI::disk_underrun_message_gone ()
2284 have_disk_underrun_displayed = false;
2288 ARDOUR_UI::disk_overrun_message_gone ()
2290 have_disk_underrun_displayed = false;
2294 ARDOUR_UI::pending_state_dialog ()
2296 ArdourDialog dialog ("pending state dialog");
2298 This session appears to have been in\n\
2299 middle of recording when ardour or\n\
2300 the computer was shutdown.\n\
2302 Ardour can recover any captured audio for\n\
2303 you, or it can ignore it. Please decide\n\
2304 what you would like to do.\n"));
2306 dialog.get_vbox()->pack_start (message);
2307 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2308 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2310 dialog.set_position (WIN_POS_CENTER);
2313 switch (dialog.run ()) {
2314 case RESPONSE_ACCEPT:
2322 ARDOUR_UI::disconnect_from_jack ()
2325 if( engine->disconnect_from_jack ()) {
2326 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2330 update_sample_rate (0);
2335 ARDOUR_UI::reconnect_to_jack ()
2338 if (engine->reconnect_to_jack ()) {
2339 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2343 update_sample_rate (0);
2348 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2350 engine->request_buffer_size (nframes);
2351 update_sample_rate (0);
2355 ARDOUR_UI::cmdline_new_session (string path)
2357 if (path[0] != '/') {
2358 char buf[PATH_MAX+1];
2361 getcwd (buf, sizeof (buf));
2368 new_session (false, path);
2370 _will_create_new_session_automatically = false; /* done it */
2371 return FALSE; /* don't call it again */
2375 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2377 Glib::RefPtr<Action> act;
2381 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2384 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2387 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2390 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2393 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2398 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2399 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2400 Config->set_native_file_header_format (hf);
2402 session->reset_native_file_format ();
2409 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2411 Glib::RefPtr<Action> act;
2415 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2418 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2423 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2425 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2426 Config->set_native_file_data_format (sf);
2428 session->reset_native_file_format ();
2435 ARDOUR_UI::use_config ()
2437 Glib::RefPtr<Action> act;
2439 switch (Config->get_native_file_data_format ()) {
2441 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2444 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2449 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2450 ract->set_active ();
2453 switch (Config->get_native_file_header_format ()) {
2455 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2458 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2461 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2464 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2467 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2472 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2473 ract->set_active ();